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

标签 c++ mfc accessibility high-contrast cmfcmenubutton

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

当我切换 high contrast mode 时按钮未正确重绘(为了比较显示正常按钮):

broken repaint of CMFCMenuButton after toggling high contrast mode

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

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

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

最佳答案

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

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

  2. 正确设置边框和背景:
    处理WM_THEMECHANGED事件并调用 CMFCVisualManager::GetInstance()->DestroyInstance(); 以关闭所有 opened theme data handles .

关于c++ - 切换高对比度模式时 CMFCMenuButton 无法正确重绘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40120130/

相关文章:

c++ - std::tr1::array 和 boost::array 之间的区别

c++ - 对于这种情况,什么是好的构建模式? (分区工具)

c++ - 当主 GUI 线程被阻塞时,如何从工作线程创建无模式对话框?

javascript - 为什么 JAWS 仍然可以读取隐藏的表单元素?

java - 为什么我的 JTable 在 OS X 上使用 VoiceOver 时总是报告为空?

c++ - 错误:将 ‘const Flacon’作为 ‘this’参数传递会丢弃限定符[-fpermissive]

c++ - 将货币金额四舍五入到最接近的五分之一、四分之一、1 美元、5 美元等面额的最佳方法是什么?

c++ - 在哪里初始化另一个对话框上的丰富编辑控件?

visual-c++ - 有条件地阻止 CPropertySheet 从页面 OnOK 按钮处理程序关闭

Android - 阻止 TalkBack 读取应用程序名称和当前方向