CMFCMenuButton неправильно перерисовывается при переключении режима высокой контрастности

В проекте C++ MFC я использую CMFCMenuButton с использованием MSVC 2013.

Когда я переключаю режим высокой контрастности кнопка не перекрашивается должным образом (для сравнения отображается обычная кнопка):

сломанная перерисовка CMFCMenuButton после переключения режима высокой контрастности

Вызов Invalidate() или ShowWindow(SW_HIDE);ShowWindow(SW_SHOW);, кажется, не имеет никакого эффекта - даже минимизация диалог не вызывает правильную перерисовку. Как я могу заставить кнопку перекрашиваться обновленным системным цветом?

Обновление: принудительное изменение цветов после переключения режима контрастности просто делает текст кнопки видимым, однако сама кнопка, граница, не видна.

m_ctrlOkButton.SetFaceColor(::GetSysColor(COLOR_BTNFACE));
m_ctrlOkButton.SetTextColor(::GetSysColor(COLOR_BTNTEXT));

person MrTux    schedule 19.10.2016    source источник
comment
CMFCMenuButton рисуется владельцем. Похоже, что элемент управления не обнаруживает изменение цветовой схемы пользовательского интерфейса, поэтому вам может потребоваться обнаружить изменение режима контрастности и изменить цвета кнопки, чтобы она отображалась.   -  person 1201ProgramAlarm    schedule 19.10.2016
comment
@ 1201ProgramAlarm Спасибо за подсказку, тем временем я смог решить эту проблему ...   -  person MrTux    schedule 19.10.2016


Ответы (1)


Мне потребовалось некоторое время, но я смог решить эту проблему. Я наследую от класса CMFCMenuButton, чтобы я мог обрабатывать некоторые события:

  1. Выберите правильный цвет кнопки:
    обработайте WM_SYSCOLORCHANGE событие и вызвать GetGlobalData()->UpdateSysColors(); (убедитесь, что оно передано нашему родителю раньше, например, __super::OnSysColorChange();)

  2. Установите правильную границу и фон:
    Обработайте WM_THEMECHANGED и вызовите CMFCVisualManager::GetInstance()->DestroyInstance();, чтобы закрыть все открытые дескрипторы данных темы.

person MrTux    schedule 19.10.2016