Привет всем. Пытаюсь получить прозрачный edit через обработку WM_CTLCOLOREDIT Код (Text): invoke SetBkMode,[wParam], TRANSPARENT invoke GetStockObject,NULL_BRUSH ret Но, при вводе в контролл, символы начинают накладываться друг на друга. Как добиться нормального отображения? И существуют, ли ещё способы создания прозрачности?
Код (Text): BOOL (WINAPI *SetNotePadLayer)(HWND,COLORREF,BYTE,DWORD); ... SetNotePadLayer =(int(__stdcall*)(HWND,COLORREF,BYTE,DWORD))GetProcAddress(GetModuleHandle("user32.dll"),"SetLayeredWindowAttributes"); if(SetNotePadLayer){SetWindowLong(hWnd, GWL_EXSTYLE, GetWindowLong(hWnd, GWL_EXSTYLE) | 0x80000); SetNotePadLayer(hWnd, 0, 200, 0x02);}
At0m Все дело в том, что возвращаемое значение при обработке WM_CTLCOLOREDIT устанавливает, как ни странно, цвет фона элемента управления. Цвет же текста, а, соответственно, и фона текста, нужно устанавливать вручную, для чего используются SetTextColor и SetBkColor. Если у Вас цвет фона родительского окна задавается через WNDCLASS.hbrBackground одной из предопределенных констант, то связка GetSysColor+SetBkColor при обработке WM_CTLCOLOREDIT поможет.
По поводу SetLayeredWindowAttributes. С обычным окном всё работает, а вот с Edit возвращает 0. Бэкграунд родителя - картинка, устанавливается через обработку WM_CTLCOLORDLG. Вот исходник Код (Text): format PE GUI 4.0 entry MAIN include '%fasminc%\win32A.inc' include '%fasminc%\MACRO\if.inc' include '%fasminc%\MACRO\masm.inc' section '.data' data readable writeable gIst dd ? hBmp dd ? hBrush dd ? section '.code' code readable writeable executable MAIN: invoke GetModuleHandle,eax mov [gIst],eax invoke DialogBoxParam,[gIst],1000,0,DlgProc,0 invoke ExitProcess,0 proc DlgProc,hWnd,uMsg,wParam,lParam push edi esi ebx mov eax,[uMsg] .if eax=WM_CLOSE invoke EndDialog,[hWnd],0 mov eax,1 .elseif eax=WM_INITDIALOG invoke LoadBitmap,[gIst],100 mov [hBmp],eax invoke CreatePatternBrush,eax mov [hBrush],eax .elseif eax=WM_LBUTTONDOWN invoke SendMessage,[hWnd],WM_NCLBUTTONDOWN,2,[lParam] .elseif eax=WM_RBUTTONUP invoke SendMessage,[hWnd],WM_CLOSE,0,0 .elseif eax=WM_CTLCOLORDLG mov eax,[hBrush] ret .elseif [uMsg]=WM_CTLCOLOREDIT invoke GetDlgCtrlID,[lParam] .if eax=1001 invoke SetBkMode,[wParam], TRANSPARENT invoke SetBkColor,[wParam],0 invoke SetTextColor,[wParam],0ffffffh invoke GetStockObject,NULL_BRUSH ret .elseif eax=1002 invoke SetBkMode,[wParam], TRANSPARENT invoke SetBkColor,[wParam],0 invoke SetTextColor,[wParam],0ffffffh invoke GetStockObject,NULL_BRUSH ret .endif .endif xor eax,eax pop ebx esi edi ret endp section '.idata' import data readable writeable library kernel32,'KERNEL32.DLL',\ user32,'USER32.DLL',\ gdi32,'GDI32.DLL' include '%fasminc%\API\KERNEL32.inc' include '%fasminc%\API\USER32.inc' include '%fasminc%\API\GDI32.inc' section '.rsrc' resource data readable directory RT_DIALOG,dialogs,\ RT_BITMAP,bitmaps resource dialogs,\ 1000,LANG_ENGLISH+SUBLANG_DEFAULT,main dialog main,'',70,70,170,80,090800800h ,0 dialogitem "Edit","",1001, 5, 15, 90, 12,WS_VISIBLE + WS_BORDER,0 dialogitem "Edit","",1002, 5, 50, 90, 12,WS_VISIBLE + WS_BORDER,0 enddialog resource bitmaps,\ 100,LANG_NEUTRAL,bmps bitmap bmps,'77.bmp' http://dump.ru/file/4146388
KeSqueer, у меня на xp-pro-sp2 - 1.exe что-то вообще не запускается... --- Jupiter, а не проверите у себя на Win7 заодно и вот это: layeredchild.rar ?
KeSqueer rep stosb или размер структуры/4, тогда работает http://img532.imageshack.us/img532/1025/win.png
В предыдущем примере небольшой баг. Если юзать TAB, то выделение в EDIT'ах остается. Поэтому помимо нотификации EN_UPDATE надо обрабатывать EN_KILLFOCUS. Поправил. Потестил в Win95, Win2000 SP0, WinXP SP3, Server 2008 SP2 везде работает.
Всем спасибо. Нагуглил ещё способ с отрисовкой фона Edit'a той же кисточкой, что и у родительского окна, с соответствующей установкой координат через SetBrushOrgEx http://dump.ru/file/4166761
Clerk Да, странно, что /4 не поставил. Вроде ставил, а оказывается нет... kero Видимо по этому и не запускается. Попробуйте пересобрать исходник с исправленной строкой. Jupiter Так и должно быть