Всем привет! Столкнулся с проблемкой... Не могу на asm'е сделать окно прозрачным. На С++ всё работает, а asm'е - нет. Может кто знает в чем проблема? Код функции на С++ Код (Text): #define _WIN32_WINNT 0x0500 //без этой строки окно прозрачным не становится 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): Код функции на ASM'е Код (Text): SetWindowTransp proc htWndWORD, 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):
ага, а потом пушим целый edx, а то, что в оставшихся 24 битах что угодно может быть - это мелочи жизни? либо and edx, 0ffh либо push bTransp делай
С DL действительно оплошал... Глупо... Исправил... Код (Text): SetWindowTransp proc htWndWORD, bTranspWORD 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): Не работает... Может надо прописать #define _WIN32_WINNT 0x0500? Но где?
у меня вот этот код работает как надо, сравни сам, не знаю, откуда ты свой брал Код (Text): invoke GetWindowLong, ebx, GWL_EXSTYLE or eax, WS_EX_LAYERED invoke SetWindowLong, ebx, GWL_EXSTYLE, eax invoke SetLayeredWindowAttributes, ebx, 0, (255*70)/100, LWA_ALPHA
А у меня - нет... Потому что не известно, что такое SetLayeredWindowAttributes и LWA_ALPHA. Видать у меня .LIB'ы старые... Где бы обновить?
В любом случае мой код тоже должен работать. Разница между моим и твоим только в том, что я вызываю SetLayeredWindowAttributes из DLL. И вызываю, по-моему, правильно...
Всё. Спасибо. Ошибка нашлась invoke GetWindowLong,htWnd, GWL_EXSTYLE or 80000h //Не катит invoke GetWindowLong,htWnd, GWL_EXSTYLE //Катит or eax,80000h //WS_EX_LAYERED = 80000h Бывает... Бывает и хуже...
На самом деле ты вызываешь SetLayeredWindowAttributes, только каким-то довольно нетривиальным способом. Может быть и твои либы устарели. Я бы делал, как позазывает masquer (в VB6 с этим сталкивался).
в аттаче 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): _call MACRO procedure, parameters:VARARG Local param, reversed reversed TEXTEQU <> % For param, <parameters> reversed CATSTR <param>, <!,>, reversed EndM % For param, <reversed> push param EndM call procedure ENDM часть функционала, остальное см. в исходнике Код (Text): SetWndTransp Proc hWin:DWORD, TranspVal:DWORD mov eax, TranspVal .If eax == 255 ; Opaque ; Remove WS_EX_LAYERED from this window styles invoke GetWindowLong,hWin,GWL_EXSTYLE xor eax, WS_EX_LAYERED invoke SetWindowLong,hWin,GWL_EXSTYLE,eax ; Ask the window and its children to repaint invoke RedrawWindow, hWin, NULL, NULL, RDW_ERASE or RDW_INVALIDATE or RDW_FRAME or RDW_ALLCHILDREN .Else _call pSLWA, hWin, 0, eax, LWA_ALPHA .EndIf ret SetWndTransp EndP _2097679297__WndFade.asm
Да, LIB'ы действительно устарели... Поэтому и приходится извращаться. P.S. Ннасчет LIB'ов - если кто-нибудь подскажет где их можно обновить - буду только рад...