如何取消CMFCPropertyGridCtrl切出时的选中状态或自定义选中颜色?
解决CMFCPropertyGridCtrl深色模式下切出后选中状态残留问题
针对你遇到的深色模式下,CMFCPropertyGridCtrl在通过Tab键切换到其他控件时仍保留选中行的问题,提供两种可行解决方案:
方案一:切出控件时自动取消选中状态
通过派生CMFCPropertyGridCtrl子类,处理失去焦点事件来清除选中项:
- 创建自定义子类并重写
OnKillFocus消息响应函数:
class CMyPropertyGridCtrl : public CMFCPropertyGridCtrl { protected: afx_msg void OnKillFocus(CWnd* pNewWnd); DECLARE_MESSAGE_MAP() }; BEGIN_MESSAGE_MAP(CMyPropertyGridCtrl, CMFCPropertyGridCtrl) ON_WM_KILLFOCUS() END_MESSAGE_MAP() void CMyPropertyGridCtrl::OnKillFocus(CWnd* pNewWnd) { CMFCPropertyGridCtrl::OnKillFocus(pNewWnd); // 清除当前选中的属性项 SetCurSel(nullptr); // 强制刷新控件界面 RedrawWindow(); }
- 将对话框中的CMFCPropertyGridCtrl控件关联到这个子类对象,后续当控件失去焦点(如Tab切换)时,会自动取消选中状态,避免深色模式下的高亮残留。
方案二:自定义无焦点时的选中行颜色
若希望保留选中状态但修改显示颜色,可通过重载绘制函数实现:
- 派生子类并重写
OnDrawProperty方法,根据控件是否有焦点调整绘制颜色:
class CMyPropertyGridCtrl : public CMFCPropertyGridCtrl { protected: virtual void OnDrawProperty(CDC* pDC, CMFCPropertyGridProperty* pProp); }; void CMyPropertyGridCtrl::OnDrawProperty(CDC* pDC, CMFCPropertyGridProperty* pProp) { const BOOL bHasFocus = (GetFocus() == this); const COLORREF clrOriginalBack = pDC->GetBkColor(); const COLORREF clrOriginalText = pDC->GetTextColor(); // 针对无焦点时的选中项,设置自定义深色模式适配颜色 if (pProp == GetCurSel() && !bHasFocus) { // 示例:低对比度背景色+柔和文本色,可根据你的深色主题调整 pDC->SetBkColor(RGB(45, 45, 45)); pDC->SetTextColor(RGB(200, 200, 200)); } // 调用基类完成常规绘制 CMFCPropertyGridCtrl::OnDrawProperty(pDC, pProp); // 恢复原有颜色设置 pDC->SetBkColor(clrOriginalBack); pDC->SetTextColor(clrOriginalText); }
- 该方案既保留了选中项的状态标识,又通过自定义颜色避免了深色模式下的刺眼高亮,适配界面风格。
内容的提问来源于stack exchange,提问作者Andrew Truckle
相关产品推荐
相关产品推荐

