Единственный способ, которым я знаю, чтобы по-настоящему заняться этим, - это использовать «пользовательскую ничью», а не «ничью владельца». Настраиваемое рисование появилось в Windows 2000, но используется только кнопочными элементами управления с comctrl32 6.0 (начиная с Windows XP и далее), не очень четко задокументировано и не является чем-то особенным, что поддерживает MFC.
В любом случае, хорошая вещь в пользовательском рисовании заключается в том, что он позволяет вам подключаться к различным точкам процесса рисования, в отличие от рисования владельцем, что заставляет вас иметь дело со всем этим. Посмотрите в MSDN сообщение-уведомление NM_CUSTOMDRAW.
Для другой части вашей проблемы, обнаружив «горячее» состояние, самый простой способ сделать это - использовать сообщения WM_MOUSEMOVE и функцию TrackMouseEvent () для отслеживания, находится ли мышь над вашей кнопкой.
К сожалению, это немного расплывчатый ответ: объем кода, который вам необходим для демонстрации кнопки, использующей пользовательское рисование, слишком велик для ввода в эти поля для ответов! У меня есть проект, который демонстрирует такие методы, используя пользовательскую кнопку рисования (возврат к рисованию владельца в старых версиях Windows), которая добавляет небольшую стрелку к кнопке. Вы можете взглянуть на исходный код, получив
Windows_UI_source.zip
Откройте его и посмотрите на класс "DropArrowButton". Важным битом является обработчик OnCustomDraw () и его вспомогательная функция DrawControl (): они вызываются на различных этапах рисования кнопок и используют UxTheme для соответствующего рисования элемента управления.