Проблемы со статиком

Тема в разделе "WASM.BEGINNERS", создана пользователем Sergei_2006, 4 дек 2006.

  1. Sergei_2006

    Sergei_2006 New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2006
    Сообщения:
    30
    Не хотелось начинать еще еще один топик но из поиска не нашел ответ.

    Создаю Static

    invoke CreateWindowEx,NULL,ADDR StaticClassName,ADDR StaticTextN,\
    WS_CHILD or WS_VISIBLE,30,60,140,16,hWnd,IDC_STATIC,hInstance,NULL

    ADDR StaticTextN "произвольный"
    ADDR StaticClassName "Static"

    Все работает отлично.
    Но когда обрабатываю

    WM_CTLCOLORSTATIC
    invoke SetBkMode,IDC_STATIC,OPAQUE
    invoke SetTextColor,IDC_STATIC,0000ff00h
    invoke GetStockObject,NULL_BRUSH
    ret
    (Например) то фон на котором расположен текст во всю длину остается прежним и никак не хочет меняться а изменяется только после текста.
    Как это можно исправить.

    И если есть может нормальный исходник на асме скините только чтоб все работало гуд.
     
  2. Sergei_2006

    Sergei_2006 New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2006
    Сообщения:
    30
    Ну неужели некто не сталкивался и идей нет.
     
  3. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Sergei_2006
    Кисть, которая возвращается обработчиком, используется для заполнения общего фона. OPAQUE означает, что текст должен отрисовываться "не прозрачно". Фоном текста служит однотонный цвет, который задан через SetBkColor (а у Вас он не задан и используется значение по умолчанию). Получается, что имеем 2 фона: общий и текстовый. Чтобы был один фон, нужно использовать TRANSPARENT и создавать кисть нужного цвета (или прозрачную NULL_BRUSH). Или же при использовании режима OPAQUE явно задавать цвет фона через SetBkColor, чтобы он соответствовал цвету общего фона, но, если этот цвет не входит в стандартную 16-цветную палитру, на слабых адаптерах будут заметны отличия.
     
  4. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    и к тому же, SetBkMode и SetTextColor первым параметром принимают не ID контрола, а хендл контекста рисования.
     
  5. Sergei_2006

    Sergei_2006 New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2006
    Сообщения:
    30
    Спасибо Quantum rmn все работает.
     
  6. murtix

    murtix New Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    110
    Адрес:
    Russia
    Почему этот код не работает. Т.е. нет реакции, а в олле и GetDlgItem и GetDC работают нормально, а SetBkColor всегда почему то возвращает 00FFFFFF
    Код (Text):
    1. ......................
    2. clOLineColor        dd ColorsLimeGreen
    3. ......................
    4. .elseif uMsg==WM_PAINT
    5.     invoke  GetDlgItem, hWndOp, IDC_lbColor
    6.     mov     ecx, eax
    7.     invoke  GetDC, ecx
    8.     mov     ecx, eax
    9.     invoke  SetBkColor, ecx, clOLineColor
    10.     xor     eax, eax
    11.     ret
    12. ..................
     
  7. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    murtix
    А что он по-твоему должен возвращать?
     
  8. murtix

    murtix New Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    110
    Адрес:
    Russia
    ;MSDN
    Return Values
    If the function succeeds, the return value specifies the previous background color as a COLORREF value.
    If the function fails, the return value is CLR_INVALID.

    ;c:\masm32\include\windows.inc
    CLR_INVALID equ 0FFFFh

    Так что по закону уже во второй раз он должен вернуть clOLineColor
    вроде бы 0FFFFh != 00FFFFFFh
     
  9. murtix

    murtix New Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    110
    Адрес:
    Russia
    ;c:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Include\WinGDI.h

    #define CLR_INVALID 0xFFFFFFFF
     
  10. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    murtix
    Жёлтый - это вполне валидный цвет.

    Белый тоже вполне валиден :)
     
  11. murtix

    murtix New Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    110
    Адрес:
    Russia
    Quantum
    Я имел ввиду то что SetBkColor возвращает валидный цвет, то есть выполняется без ошибок
    Значит он должен вернуть предыдушее значение фонового цвета, а он возвращает (всегда !!!!) белый вместо clOLineColor.
    Sergei_2006
    Ты не мог бы вытащить на обозрение народу то что работает. :)
     
  12. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    murtix
    2 раза подряд вызываешь SetBkColor и 2й раз он снова возращает белый? При этом, clOlineColor != белый? Не может такого быть.
     
  13. murtix

    murtix New Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    110
    Адрес:
    Russia
    Quantum
    Не подряд, а в WM_Paint
     
  14. murtix

    murtix New Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    110
    Адрес:
    Russia
    Поучилось!!!!!! Вот все работает

    Код (Text):
    1. ;-----это вставить где нужно
    2.     mov      eax, Color              ; какой нужен
    3.     and      eax, 00FFFFFFh       ; A из ARGB должен быть =0, т.е. первый байт
    4.     invoke   CreateSolidBrush, eax
    5.     mov      hbrLineClrBrush, eax
    6. ;-----
    7. .if uMsg==WM_INITDIALOG
    8. ...............
    9.     invoke   GetSysColor, COLOR_BTNFACE
    10.     invoke   CreateSolidBrush, eax
    11.     mov      hbrBtnFaceBrush, eax
    12. ...............
    13. .elseif uMsg==WM_CTLCOLORSTATIC
    14.     invoke   SetBkMode, wParam, TRANSPARENT
    15.     invoke   SetTextColor, wParam, 0
    16.     mov eax, lParam
    17.     .if     eax == hlbLineColor
    18.         mov      eax, hbrLineClrBrush    ; после этого и до выхода из проц-ры еах не должен менятся
    19.     .else
    20.         mov      eax, hbrBtnFaceBrush   ; после этого и до выхода из проц-ры еах не должен менятся
    21.     .endif
    22.     ret
    23. .................
    24. .elseif uMsg==WM_CLOSE
    25.     invoke   DeleteObject, hbrLineClrBrush
    26.     invoke   DeleteObject, hbrBtnFaceBrush
    27. .....................
    Удачи в святой борьбе с матрицей :)