5

在我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));
4

1 回答 1

3

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

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

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

于 2016-10-19T01:29:20.110 回答