Как изменить цвет кнопок диалогового окна
Когда-то давно в одной из статей я рассказывал, как менять цвета различных элементов диалоговых окон Windows. Наверняка вы обратили внимание, что элемент типа BUTTON, то есть кнопка, выбивается из общей схемы и на изменение цвета не реагирует должным образом. Решить эту проблему все-таки можно, но для этого придется самостоятельно отрисовывать все компоненты кнопки - фон, рамку и надпись. Зато такой способ открывает неограниченные возможности по кастомизации кнопок.Первым делом в ресурсах или в функции создания кнопки через CreateWindow(Ex) надо дополнить стиль модифицируемой кнопки параметром BS_OWNERDRAW. С этого момента все функции по рисованию перекладываются на наше приложение. Для этого приложение должно обрабатывать сообщение WM_DRAWITEM. Окну-владельцу кнопки в параметре lParam этого сообщения передается указатель на структуру DRAWITEMSTRUCT, на основании которой мы и будем заниматься рисованием.
Code (Assembler) : Убрать нумерацию
- cmp [msg],WM_DRAWITEM
- je color_button
- ...
- ...
- color_button:
- ; Указатель на структуру DRAWITEMSTRUCT
- mov ebx,[lparam]
- ; Установить режим смешивания фоновых цветов
- invoke SetBkMode,[ebx+DRAWITEMSTRUCT.hDC],TRANSPARENT
- ; Кнопка активна?
- test [ebx+DRAWITEMSTRUCT.itemState],ODS_SELECTED
- jz @f
- invoke GetSysColor,COLOR_ACTIVEBORDER
- invoke CreatePen,PS_SOLID,1,eax
- invoke SelectObject,[ebx+DRAWITEMSTRUCT.hDC],eax
- invoke GetSysColor,COLOR_3DLIGHT
- invoke CreateSolidBrush,eax
- invoke SelectObject,[ebx+DRAWITEMSTRUCT.hDC],eax
- ; Прямоугольник с заливкой
- invoke Rectangle,[ebx+DRAWITEMSTRUCT.hDC],\
- [ebx+DRAWITEMSTRUCT.rcItem.left],\
- [ebx+DRAWITEMSTRUCT.rcItem.top],\
- [ebx+DRAWITEMSTRUCT.rcItem.right],\
- [ebx+DRAWITEMSTRUCT.rcItem.bottom]
- jmp loc_text
- @@:
- ; Установить цвет и стиль рамки
- invoke GetSysColor,COLOR_3DDKSHADOW
- invoke CreatePen,PS_SOLID,3,eax
- invoke SelectObject,[ebx+DRAWITEMSTRUCT.hDC],eax
- ; Установить цвет фона
- invoke GetSysColor,COLOR_HIGHLIGHT
- invoke CreateSolidBrush,eax
- invoke SelectObject,[ebx+DRAWITEMSTRUCT.hDC],eax
- ; Прямоугольник с заливкой
- invoke Rectangle,[ebx+DRAWITEMSTRUCT.hDC],\
- [ebx+DRAWITEMSTRUCT.rcItem.left],\
- [ebx+DRAWITEMSTRUCT.rcItem.top],\
- [ebx+DRAWITEMSTRUCT.rcItem.right],\
- [ebx+DRAWITEMSTRUCT.rcItem.bottom]
- loc_text:
- ; Длина надписи на кнопке
- invoke GetWindowTextLength,[ebx+DRAWITEMSTRUCT.hwndItem]
- inc eax
- mov [len],eax
- invoke GetWindowText,[ebx+DRAWITEMSTRUCT.hwndItem],buff,[len]
- ; Установить цвет текста
- invoke SetTextColor,[ebx+DRAWITEMSTRUCT.hDC],0x0000FFFF
- ; Для нажатой кнопки сдвинуть текст вниз-вправо
- test [ebx+DRAWITEMSTRUCT.itemState],ODS_SELECTED
- jz @f
- ; Установить цвет текста
- invoke SetTextColor,[ebx+DRAWITEMSTRUCT.hDC],0x000000FF
- add [ebx+DRAWITEMSTRUCT.rcItem.left],2
- add [ebx+DRAWITEMSTRUCT.rcItem.top],2
- @@:
- ; Надпись на кнопке
- lea esi,[ebx+DRAWITEMSTRUCT.rcItem]
- invoke DrawText,[ebx+DRAWITEMSTRUCT.hDC],buff,[len],esi,\
- DT_SINGLELINE+DT_VCENTER+DT_CENTER
В приложении пример программы с исходным текстом, демонстрирующей создание и обработку кастомизированной кнопки в диалоговом окне.
Просмотров: 2179 | Комментариев: 0
Метки: Assembler
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Комментариeв нет
Добавить комментарий
Заполните форму для добавления комментария