Кнопка является, пожалуй, самым простым и часто использующим управляющим элементом операционных систем семейства Microsoft Windows, реализованный системным оконном классе Button. Фактически данный класс предоставляет программисту несколько управляющих элементов, в зависимости от установленных стилей окна:
· Обычная кнопка PUSHBUTTON;
· Check Box;
· Radio Box;
Кроме того, согласно SDK for the Microsoft Windows 10, если установлен стиль BS_OWNERDRAW, то перерисовка управляющего элемента осуществляется родительским окном в новигационном сообщении WM_DRAWITEM. Согласно упомянутого SDK DRAWITEMSRUCT Structure , если установлен статус контрольного элемента, который необходимо нарисовать в сообщении WM_DRAWITEM, ODS_HOTLIGHT в поле itemState структуры DRAWITEMSTRUCT, то элемент перерисовывается, когда на него наводится указатель (курсор) мыши. Но для кнопки PUSHBUTTON этот статус почему-то не работает, и сообщение WM_DRAWITEM не приходит родительскому окну, когда на кнопку наводится курсор мыши, хотя, судя по поведению стандартной кнопки, она должна перерисовываться, когда мышь на нее наводится.
Когда я это понял, я решил сделать субкласс кнопки, переопределив обработчик системного сообщение WM_PAINT.
Переопределив обработчик указанного системного сообщение и сбросив стиль BS_OWNERDRAW, заметил, что отрисовка кнопки и ее поведение не изменилось. Тогда я понял, что отрисовка стандартной кнопки происходит не в сообщении WM_PAINT, а вызовом функции перерисовки окна напрямую, где это необходимо. В этом я убедился, когда я стал переопределять сообщения от мыши. Перед вызовом обработчика сообщения стандартной кнопки, приходится отключать отрисовку окна с помощью сообщения WM_SETREDRAW, а после включать и перерисовывать кнопку с помощью функции InvalidateRect или RedrawWindow. Вторая функция более гибче и быстрее работает, так как не ставит сообщения в очередь, а вызывает обработчики необходимых сообщений напрямую.
Данная информация проверена автором в операционной системе Microsoft Windows 10 Home