Создаю эдитконтрол: Код (Text): mov lf.lfHeight,-10 mov lf.lfWeight,50 invoke CreateFontIndirect,addr lf mov hFontN,eax invoke CreateWindowEx,WS_EX_CLIENTEDGE,ADDR EditClName,ADDR Textmemo1,WS_VSCROLL or WS_CHILD or ES_LEFT or ES_AUTOVSCROLL or WS_VISIBLE,0 ,112,305,315,hWnd,memo1ID,hInstance,0 mov hwndmemo1,eax invoke SendMessage,hwndmemo1,WM_SETFONT,hFontN,1 Дальше - хочу поменять его фон. Подскажите как это правильно сделать. Суперклассинг не дает ничего. Единственно, чего добился - Код (Text): RGB 255,0,0 invoke CreateSolidBrush,eax MOV Brush,eax WndProc proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM .... .ELSEIF uMsg == WM_CTLCOLOREDIT mov eax,lParam .if eax == hwndmemo1 RGB 255, 0, 0 invoke SetTextColor,wParam,eax RGB 0, 255, 0 invoke SetBkColor,wParam,eax mov eax, Brush .endif Но - изменяеся ТОЛЬКО цвет текста и фона под ним.
Неужели тема настолько неинтересна? Хотелось бы все таки научиться перехватывать системные цвета и изменять их на свой вкус... Существует ли лекарство? Поделитесь рабочим исходником, плиз
В добавок к твоему коду (на ассемблере, конечно): 1. Через SetWindowLong() сделать sub-classing. 2. Затем в новой процедуре: Код (Text): case WM_ERASEBKGND: GetClientRect (hWnd, &r); FillRect ((HDC) wParam, &r, [b]<your brush handle goes here>[/b]); return 1; 3. Не забывать вызывать оригинальную процедуру в новой процедуре. Естественно, кроме "case WM_ERASEBKGND:".
OFFSIDE >Но - изменяеся ТОЛЬКО цвет текста и фона под ним WM_CTLCOLOREDIT ... ret .endif А супер/саб классинг тут без надобности, как и обработка WM_ERASEBKGND.
AsmGuru62 и kero Гран мерси за подсказку. Оба варианта работают. Но если выбрать стиль WM_DISABLED или EM_READONLY для эдитконтрола, то не работают оба варианта. Хотелось бы перехватывать все системные цвета. Если нужно создавать для этого собственный контрол, подскажите как.
В случае sub-classing попробуй отлавливать WM_ENABLE(WM_DISABLE - хорошая шутка...) и принудительно посылать самому себе WM_ERASEBKGND. А че это за месседж EM_READONLY?( понятно что для edit но почему-то в SDK его нет...)
OFFSIDE >Оба варианта работают. Но если выбрать стиль WM_DISABLED или EM_READONLY для эдитконтрола, то не работают оба варианта. 1) ret - не вариант, а то, как надо, если хотите, чтобы работало mov eax, Brush. 2) Почитайте в MSDN о WM_CTLCOLOR* сообщениях. Узнаете, например, что WS_DISABLED или ES_READONLY edit шлет не WM_CTLCOLOREDIT, а WM_CTLCOLORSTATIC.
CodeTao Очепятка. Конечно же ES_READONLY. В этом случае фон окна становиться системным дисаблед, а цвет шрифта остается системным по умолчанию. А WM_ERASEBKGND посылать не получаеться, не работает почему то... kero 1. Работает и без ret Код (Text): .ELSEIF uMsg == WM_CTLCOLOREDIT mov eax,lParam .if eax == hwndmemo1 RGB 255, 150, 66 invoke SetTextColor,wParam,eax RGB 0, 0, 0 invoke SetBkColor,wParam,eax mov eax, Brush .endif ..... .ELSE invoke DefWindowProc,hWnd,uMsg,wParam,lParam ret .ENDIF ret WndProc endp 2. Действительно, спасибо за подсказку. Я и до этого прочитал но не дошло)... Знание английского - сила!
OFFSIDE >1. Работает и без ret Разве ? - > .ELSEIF uMsg == WM_CTLCOLOREDIT > mov eax,lParam > .if eax == hwndmemo1 > RGB 255, 150, 66 > invoke SetTextColor,wParam,eax > RGB 0, 0, 0 > invoke SetBkColor,wParam,eax > mov eax, Brush > .endif >..... > .ELSE > invoke DefWindowProc,hWnd,uMsg,wParam,lParam > ret > .ENDIF > ret >WndProc endp А вот винды предписывают mov eax,FALSE перед этим ret (т.е. return 0), выводы делайте сами.
kero По поводу этого куска кода все более или менее ясно(ret нужен). А если я захочу изменить допустим цвет фона скролбара у этого эдитбокса?
OFFSIDE >А если я захочу изменить допустим цвет фона скролбара у этого эдитбокса? Если, допустим, подумали о WM_CTLCOLORSCROLLBAR, - читайте в MSDN и Remarks: >The WM_CTLCOLORSCROLLBAR message is used only by child scrollbar controls. >Scrollbars attached to a window (WS_SCROLL and WS_VSCROLL) do not generate this message. >To customize the appearance of scrollbars attached to a window, use the flat scroll bar functions.
kero Большое Вам спасибо... За свое незнание предмета обязан скорее всего своей непроходимой темности. Буду работать над собой в достижении нирваны и старании постичь все премудрости дзена. (Сорри за оффтоп).