Декоративные элементы в приложениях на MFC

Помимо стандартных элементов графического интерфейса Windows, нередко можно встретить элементы окна диалога, чей внешний вид отличается от привычных элементов Windows, будь то кнопки, списки, статические надписи или выпадающие пункты меню. В данной статье приводится пример создания таких элементов в виде командных кнопок. Внешний вид этих кнопок на окне диалога выглядит следующим образом:

Внешний вид окна диалога

Каждая такая кнопка создаётся на основе стандартного элемента BUTTON, у которой в значении стиля присутствует флаг WS_OWNERDRAW. При создании окна диалога в редакторе Visual Studio, значение Owner Draw в списке свойств для данной кнопки должно быть установлено в True.
Для перехвата событий кнопки и реализации собственных процедур её отображения, а так же реакции на сообщения от мыши и клавиатуры, необходимо создать собственный класс C++, производный от класса CButton. В исходном коде проекта, который прилагается в качестве примера к данной статье, эти классы называются CPanelButton и CToggleButton. Класс CToggleButton реализует кнопку, которая имеет два фиксированных состояния. При нажатии на кнопку CToggleButton происходит переключение из одного состояния в другое и обратно при повторном нажатии. Для связывания класса C++ и графического элемента панели диалога Windows в библиотеке MFC используются специальные DDX — функции. Интегрированная среда Visual C++ имеет специальный визард, который позволяет автоматически объявлять в классе окна диалога объекты классов С++, соответствующие графическим элементам управления, и связывает их при помощи функций DDX. В данном случае для кнопок будут объявлены объекты класса CButton. Тип CButton следует заменить на тип CPanelButton или CToggleButton. Для этого в программный код окна диалога необходимо включить заголовочные файлы PanelButton.h и ToggleButton.h
Классы CPanelButton или CToggleButton имеют дополнительные методы указания текста всплывающих подсказок при наведении мыши на кнопку - SetToolTipText, а так же назначение кнопке графических изображений вместо текстовых надписей - SetImageBitmap. Для класса CtoggleButton применяются методы SetPressedBitmap и SetUnpressedBitmap. Процедура выполнения командных действий при нажатии этих кнопок такая же, как и для обычных кнопок панели диалога.

Исходный программный код проекта можно загрузить отсюда: