Изменение цвета окна

Тема в разделе "WASM.BEGINNERS", создана пользователем OFFSIDE, 10 фев 2007.

  1. OFFSIDE

    OFFSIDE New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2006
    Сообщения:
    106
    Создаю эдитконтрол:
    Код (Text):
    1.        
    2.                 mov     lf.lfHeight,-10
    3.         mov     lf.lfWeight,50
    4.         invoke  CreateFontIndirect,addr lf
    5.         mov     hFontN,eax
    6. 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
    7.         mov     hwndmemo1,eax
    8.         invoke  SendMessage,hwndmemo1,WM_SETFONT,hFontN,1
    Дальше - хочу поменять его фон. Подскажите как это правильно сделать. Суперклассинг не дает ничего. Единственно, чего добился -

    Код (Text):
    1.     RGB 255,0,0
    2.     invoke CreateSolidBrush,eax
    3.     MOV Brush,eax
    4.  
    5. WndProc proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
    6.  
    7. ....
    8.     .ELSEIF uMsg == WM_CTLCOLOREDIT
    9.         mov eax,lParam
    10.         .if eax == hwndmemo1
    11.         RGB 255, 0, 0
    12.         invoke SetTextColor,wParam,eax
    13.         RGB 0, 255, 0
    14.         invoke SetBkColor,wParam,eax
    15.         mov      eax, Brush    
    16.         .endif
    Но - изменяеся ТОЛЬКО цвет текста и фона под ним.
     
  2. OFFSIDE

    OFFSIDE New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2006
    Сообщения:
    106
    Неужели тема настолько неинтересна? Хотелось бы все таки научиться перехватывать системные цвета и изменять их на свой вкус... Существует ли лекарство? Поделитесь рабочим исходником, плиз ;)
     
  3. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    В добавок к твоему коду (на ассемблере, конечно):

    1. Через SetWindowLong() сделать sub-classing.
    2. Затем в новой процедуре:
    Код (Text):
    1. case WM_ERASEBKGND:
    2.     GetClientRect (hWnd, &r);
    3.     FillRect ((HDC) wParam, &r, [b]<your brush handle goes here>[/b]);
    4.     return 1;
    3. Не забывать вызывать оригинальную процедуру в новой процедуре.
    Естественно, кроме "case WM_ERASEBKGND:".
     
  4. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    OFFSIDE
    >Но - изменяеся ТОЛЬКО цвет текста и фона под ним

    WM_CTLCOLOREDIT
    ...
    ret
    .endif

    А супер/саб классинг тут без надобности, как и обработка WM_ERASEBKGND.
     
  5. OFFSIDE

    OFFSIDE New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2006
    Сообщения:
    106
    AsmGuru62 и kero
    Гран мерси за подсказку. Оба варианта работают. Но если выбрать стиль WM_DISABLED или EM_READONLY для эдитконтрола, то не работают оба варианта. Хотелось бы перехватывать все системные цвета. Если нужно создавать для этого собственный контрол, подскажите как.
     
  6. CodeTao

    CodeTao Евгений

    Публикаций:
    0
    Регистрация:
    31 окт 2006
    Сообщения:
    177
    Адрес:
    штаты
    В случае sub-classing попробуй отлавливать WM_ENABLE(WM_DISABLE - хорошая шутка...) и принудительно посылать самому себе WM_ERASEBKGND. А че это за месседж EM_READONLY?( понятно что для edit но почему-то в SDK его нет...)
     
  7. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    OFFSIDE
    >Оба варианта работают. Но если выбрать стиль WM_DISABLED или EM_READONLY для эдитконтрола, то не работают оба варианта.

    1) ret - не вариант, а то, как надо, если хотите, чтобы работало mov eax, Brush.

    2) Почитайте в MSDN о WM_CTLCOLOR* сообщениях. Узнаете, например, что WS_DISABLED или ES_READONLY edit шлет не WM_CTLCOLOREDIT, а WM_CTLCOLORSTATIC.
     
  8. OFFSIDE

    OFFSIDE New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2006
    Сообщения:
    106
    CodeTao
    Очепятка. Конечно же ES_READONLY. В этом случае фон окна становиться системным дисаблед, а цвет шрифта остается системным по умолчанию. А WM_ERASEBKGND посылать не получаеться, не работает почему то...

    kero

    1. Работает и без ret :)

    Код (Text):
    1.     .ELSEIF uMsg == WM_CTLCOLOREDIT
    2.         mov eax,lParam
    3.         .if eax == hwndmemo1
    4.         RGB 255, 150, 66
    5.         invoke SetTextColor,wParam,eax
    6.         RGB 0, 0, 0
    7.         invoke SetBkColor,wParam,eax
    8.         mov      eax, Brush
    9.         .endif
    10. .....
    11.     .ELSE
    12.         invoke  DefWindowProc,hWnd,uMsg,wParam,lParam
    13.         ret
    14.     .ENDIF
    15.     ret
    16. WndProc endp
    2. Действительно, спасибо за подсказку. Я и до этого прочитал но не дошло)... Знание английского - сила!
     
  9. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    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), выводы делайте сами.
     
  10. OFFSIDE

    OFFSIDE New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2006
    Сообщения:
    106
    kero
    По поводу этого куска кода все более или менее ясно(ret нужен). А если я захочу изменить допустим цвет фона скролбара у этого эдитбокса?
     
  11. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    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.
     
  12. OFFSIDE

    OFFSIDE New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2006
    Сообщения:
    106
    kero

    Большое Вам спасибо...

    За свое незнание предмета обязан скорее всего своей непроходимой темности.
    Буду работать над собой в достижении нирваны и старании постичь все премудрости дзена. (Сорри за оффтоп).