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

MrT*_*Tux 5 c++ mfc accessibility high-contrast cmfcmenubutton

在我正在CMFCMenuButton使用MSVC 2013 的C++ MFC项目中.

当我切换高对比度模式时,按钮没有正确重新绘制(为了比较,显示正常按钮):

在切换高对比度模式后重新打印CMFCMenuButton

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

更新:切换对比度模式后强制颜色只会使按钮文本可见,但按钮本身(边框)不可见.

m_ctrlOkButton.SetFaceColor(::GetSysColor(COLOR_BTNFACE));
m_ctrlOkButton.SetTextColor(::GetSysColor(COLOR_BTNTEXT));
Run Code Online (Sandbox Code Playgroud)

MrT*_*Tux 3

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

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

  2. 正确获取边框和背景:
    处理WM_THEMECHANGED事件并调用CMFCVisualManager::GetInstance()->DestroyInstance();以关闭所有打开的主题数据句柄