切换高对比度模式时 CMFCMenuButton 无法正确重绘

CMFCMenuButton not properly repainting when toggling high contrast mode

在 C++ MFC 项目中,我使用 CMFCMenuButton 使用 MSVC 2013。

当我切换 high contrast mode 按钮时,按钮没有正确重绘(为了比较,显示了一个普通按钮):

调用 Invalidate()ShowWindow(SW_HIDE);ShowWindow(SW_SHOW); 似乎没有效果 - 即使最小化对话框也不会导致正确的重绘。如何强制按钮使用更新后的系统颜色重新绘制?

更新: 在切换对比度模式后强制使用颜色只会使按钮文本可见,但是按钮本身,即边框,是不可见的。

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

花了我一段时间,但我能够解决这个问题。我从 CMFCMenuButton class 继承,以便我可以处理一些事件:

  1. 获取右侧按钮的颜色:
    处理 WM_SYSCOLORCHANGE 事件并调用 GetGlobalData()->UpdateSysColors();(确保它之前已传播到我们的父项,例如,通过 __super::OnSysColorChange();)

  2. 正确设置边框和背景:
    处理WM_THEMECHANGED event and call CMFCVisualManager::GetInstance()->DestroyInstance(); in order to close all opened theme data handles