Прозрачность окон

Тема в разделе "WASM.WIN32", создана пользователем _Logrus_, 26 ноя 2005.

  1. _Logrus_

    _Logrus_ New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    6
    Адрес:
    Russia
    Всем привет! Столкнулся с проблемкой... Не могу на asm'е сделать окно прозрачным. На С++ всё работает, а asm'е - нет.

    Может кто знает в чем проблема?



    Код функции на С++
    Код (Text):
    1.  
    #define _WIN32_WINNT 0x0500 //без этой строки окно прозрачным не становится :dntknw:

    typedef BOOL (CALLBACK *LPSETWINTRANSP)(HWND, DWORD, BYTE, DWORD);
    LPSETWINTRANSP lpSetWinTransp;
    HINSTANCE hUser32;

    BOOL SetWindowTransp(HWND hWnd, BYTE bTransp)
    {
    if ((hUser32 = LoadLibrary("USER32.DLL")) != NULL)
    {
    lpSetWinTransp = (LPSETWINTRANSP)GetProcAddress(hUser32, "SetLayeredWindowAttributes");
    if (lpSetWinTransp != NULL)
    {
    SetWindowLong(hWnd, GWL_EXSTYLE, GetWindowLong(hWnd, GWL_EXSTYLE) | 0x80000);
    lpSetWinTransp(hWnd, 0, bTransp, 2);
    }
    FreeLibrary(hUser32);
    return TRUE;
    }
    else
    return FALSE;
    }
    Код (Text):
    1.  




    Код функции на ASM'е
    Код (Text):
    1.  
    SetWindowTransp proc htWnd:lol: WORD, bTransp:BYTE
    szText sUser32,"USER32.DLL"
    szText sSLWA,"SetLayeredWindowAttributes"
    invoke Load_Lib,addr sUser32
    mov hUser32,eax
    .IF hUser32 != 0
    invoke GetProcAddress, hUser32, addr sSLWA
    mov ecx,eax
    mov eax,ecx
    .IF eax != 0
    push eax
    pop ebx
    invoke GetWindowLong,htWnd, GWL_EXSTYLE or 80000h
    invoke SetWindowLong,htWnd, GWL_EXSTYLE, eax
    mov dl,bTransp
    push 2
    push edx
    push 0
    push htWnd
    call ebx ; htWnd, 0, bTransp, 2
    .ENDIF
    invoke UnLoad_Lib, hUser32
    return TRUE
    .ELSEIF
    invoke ShowErrMsg
    return FALSE
    .ENDIF
    SetWindowTransp endp
    Код (Text):
    1.  
     
  2. masquer

    masquer wasm.ru

    Публикаций:
    0
    Регистрация:
    13 сен 2002
    Сообщения:
    890
    Адрес:
    Николаев


    ага, а потом пушим целый edx, а то, что в оставшихся 24 битах что угодно может быть - это мелочи жизни?

    либо and edx, 0ffh либо push bTransp делай
     
  3. _Logrus_

    _Logrus_ New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    6
    Адрес:
    Russia
    С DL действительно оплошал... Глупо... Исправил...
    Код (Text):
    1.  
    SetWindowTransp proc htWnd:lol: WORD, bTransp:lol: WORD
    szText sUser32,"USER32.DLL"
    szText sSLWA,"SetLayeredWindowAttributes"
    invoke Load_Lib,addr sUser32
    mov hUser32,eax
    .IF hUser32 != 0
    invoke GetProcAddress, hUser32, addr sSLWA
    .IF eax != 0
    push eax
    pop ebx
    invoke GetWindowLong,htWnd, GWL_EXSTYLE or 80000h
    invoke SetWindowLong,htWnd, GWL_EXSTYLE, eax
    push 2
    push bTransp
    push 0
    push htWnd
    call ebx ; htWnd, 0, bTransp, 2
    .ENDIF
    invoke UnLoad_Lib, hUser32
    return TRUE
    .ELSEIF
    invoke ShowErrMsg
    return FALSE
    .ENDIF
    SetWindowTransp endp
    Код (Text):
    1.  




    Не работает... :)

    Может надо прописать #define _WIN32_WINNT 0x0500? Но где?
     
  4. masquer

    masquer wasm.ru

    Публикаций:
    0
    Регистрация:
    13 сен 2002
    Сообщения:
    890
    Адрес:
    Николаев
    у меня вот этот код работает как надо, сравни сам, не знаю, откуда ты свой брал
    Код (Text):
    1.     invoke GetWindowLong, ebx, GWL_EXSTYLE
    2.     or eax, WS_EX_LAYERED
    3.     invoke SetWindowLong, ebx, GWL_EXSTYLE, eax
    4.     invoke SetLayeredWindowAttributes, ebx, 0, (255*70)/100, LWA_ALPHA
    5.  
     
  5. _Logrus_

    _Logrus_ New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    6
    Адрес:
    Russia
    А у меня - нет... Потому что не известно, что такое SetLayeredWindowAttributes и LWA_ALPHA. Видать у меня .LIB'ы

    старые... Где бы обновить?
     
  6. _Logrus_

    _Logrus_ New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    6
    Адрес:
    Russia
    В любом случае мой код тоже должен работать. Разница между моим и твоим только в том, что я вызываю SetLayeredWindowAttributes из DLL. И вызываю, по-моему, правильно...
     
  7. _Logrus_

    _Logrus_ New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    6
    Адрес:
    Russia
    Всё. Спасибо. Ошибка нашлась :)



    invoke GetWindowLong,htWnd, GWL_EXSTYLE or 80000h //Не катит



    invoke GetWindowLong,htWnd, GWL_EXSTYLE //Катит

    or eax,80000h //WS_EX_LAYERED = 80000h



    Бывает... Бывает и хуже...
     
  8. mc black

    mc black Member

    Публикаций:
    0
    Регистрация:
    19 янв 2005
    Сообщения:
    213
    Адрес:
    Russia, N.Novgorod
    На самом деле ты вызываешь SetLayeredWindowAttributes, только каким-то довольно нетривиальным способом. Может быть и твои либы устарели. Я бы делал, как позазывает masquer (в VB6 с этим сталкивался).
     
  9. Jupiter

    Jupiter Jupiter

    Публикаций:
    0
    Регистрация:
    12 авг 2004
    Сообщения:
    532
    Адрес:
    Russia
    в аттаче Transparency/Fade effects for Win2kXP



    ; ###############################################################

    ; Usage:

    ; include WndFade.asm

    ;

    ; At startup:

    ; invoke WndFadePre, hWnd

    ; invoke FadeInOpen, hWnd

    ;

    ; Set window transparence

    ; invoke SetWndTransp, hWnd, 230

    ;

    ; at closing:

    ; invoke FadeOutClose,hWin

    ;

    ; ###############################################################



    используемый в исходнике макрос:
    Код (Text):
    1.  
    2. _call MACRO procedure, parameters:VARARG
    3.     Local param, reversed
    4.     reversed TEXTEQU <>
    5. %   For param, <parameters>
    6.         reversed CATSTR <param>, <!,>, reversed
    7.     EndM
    8. %   For param, <reversed>
    9.         push    param
    10.     EndM
    11.     call    procedure
    12. ENDM
    13.  


    часть функционала, остальное см. в исходнике
    Код (Text):
    1.  
    2. SetWndTransp    Proc    hWin:DWORD, TranspVal:DWORD
    3.     mov eax, TranspVal
    4.     .If eax == 255
    5.         ; Opaque
    6.         ; Remove WS_EX_LAYERED from this window styles
    7.         invoke  GetWindowLong,hWin,GWL_EXSTYLE
    8.         xor eax, WS_EX_LAYERED
    9.         invoke  SetWindowLong,hWin,GWL_EXSTYLE,eax
    10.         ; Ask the window and its children to repaint
    11.         invoke  RedrawWindow, hWin, NULL, NULL, RDW_ERASE or RDW_INVALIDATE or RDW_FRAME or RDW_ALLCHILDREN
    12.     .Else
    13.         _call   pSLWA, hWin, 0, eax, LWA_ALPHA
    14.     .EndIf
    15.     ret
    16. SetWndTransp    EndP
    17.  
    [​IMG] _2097679297__WndFade.asm
     
  10. _Logrus_

    _Logrus_ New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    6
    Адрес:
    Russia
    Да, LIB'ы действительно устарели... Поэтому и приходится извращаться. :)



    P.S. Ннасчет LIB'ов - если кто-нибудь подскажет где их можно обновить - буду только рад...