切换高对比度模式时 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 继承,以便我可以处理一些事件:
获取右侧按钮的颜色:
处理 WM_SYSCOLORCHANGE
事件并调用 GetGlobalData()->UpdateSysColors();
(确保它之前已传播到我们的父项,例如,通过 __super::OnSysColorChange();
)
正确设置边框和背景:
处理WM_THEMECHANGED
event and call CMFCVisualManager::GetInstance()->DestroyInstance();
in order to close all opened theme data handles。
在 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 继承,以便我可以处理一些事件:
获取右侧按钮的颜色:
处理WM_SYSCOLORCHANGE
事件并调用GetGlobalData()->UpdateSysColors();
(确保它之前已传播到我们的父项,例如,通过__super::OnSysColorChange();
)正确设置边框和背景:
处理WM_THEMECHANGED
event and callCMFCVisualManager::GetInstance()->DestroyInstance();
in order to close all opened theme data handles。