Не хотелось начинать еще еще один топик но из поиска не нашел ответ. Создаю 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 (Например) то фон на котором расположен текст во всю длину остается прежним и никак не хочет меняться а изменяется только после текста. Как это можно исправить. И если есть может нормальный исходник на асме скините только чтоб все работало гуд.
Sergei_2006 Кисть, которая возвращается обработчиком, используется для заполнения общего фона. OPAQUE означает, что текст должен отрисовываться "не прозрачно". Фоном текста служит однотонный цвет, который задан через SetBkColor (а у Вас он не задан и используется значение по умолчанию). Получается, что имеем 2 фона: общий и текстовый. Чтобы был один фон, нужно использовать TRANSPARENT и создавать кисть нужного цвета (или прозрачную NULL_BRUSH). Или же при использовании режима OPAQUE явно задавать цвет фона через SetBkColor, чтобы он соответствовал цвету общего фона, но, если этот цвет не входит в стандартную 16-цветную палитру, на слабых адаптерах будут заметны отличия.
и к тому же, SetBkMode и SetTextColor первым параметром принимают не ID контрола, а хендл контекста рисования.
Почему этот код не работает. Т.е. нет реакции, а в олле и GetDlgItem и GetDC работают нормально, а SetBkColor всегда почему то возвращает 00FFFFFF Код (Text): ...................... clOLineColor dd ColorsLimeGreen ...................... .elseif uMsg==WM_PAINT invoke GetDlgItem, hWndOp, IDC_lbColor mov ecx, eax invoke GetDC, ecx mov ecx, eax invoke SetBkColor, ecx, clOLineColor xor eax, eax ret ..................
;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
;c:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Include\WinGDI.h #define CLR_INVALID 0xFFFFFFFF
Quantum Я имел ввиду то что SetBkColor возвращает валидный цвет, то есть выполняется без ошибок Значит он должен вернуть предыдушее значение фонового цвета, а он возвращает (всегда !!!!) белый вместо clOLineColor. Sergei_2006 Ты не мог бы вытащить на обозрение народу то что работает.
murtix 2 раза подряд вызываешь SetBkColor и 2й раз он снова возращает белый? При этом, clOlineColor != белый? Не может такого быть.
Поучилось!!!!!! Вот все работает Код (Text): ;-----это вставить где нужно mov eax, Color ; какой нужен and eax, 00FFFFFFh ; A из ARGB должен быть =0, т.е. первый байт invoke CreateSolidBrush, eax mov hbrLineClrBrush, eax ;----- .if uMsg==WM_INITDIALOG ............... invoke GetSysColor, COLOR_BTNFACE invoke CreateSolidBrush, eax mov hbrBtnFaceBrush, eax ............... .elseif uMsg==WM_CTLCOLORSTATIC invoke SetBkMode, wParam, TRANSPARENT invoke SetTextColor, wParam, 0 mov eax, lParam .if eax == hlbLineColor mov eax, hbrLineClrBrush ; после этого и до выхода из проц-ры еах не должен менятся .else mov eax, hbrBtnFaceBrush ; после этого и до выхода из проц-ры еах не должен менятся .endif ret ................. .elseif uMsg==WM_CLOSE invoke DeleteObject, hbrLineClrBrush invoke DeleteObject, hbrBtnFaceBrush ..................... Удачи в святой борьбе с матрицей