MFC对话框中为未选中组合框绘制红框的问题排查
MFC对话框组合框未选中项边框绘制问题
我开发了一个包含两个组合框的MFC简单对话框应用,尝试通过对话框的OnPaint处理程序为未选中项的组合框绘制红色矩形边框:
void CFieldServiceGroupManagerDlg::OnPaint() { CPaintDC dc(this); // Device context for painting // Lambda for drawing a red rectangle around a control auto drawRedRect = [&](CWnd* pCtrl) { if (!pCtrl) return; CRect rect; pCtrl->GetWindowRect(&rect); ScreenToClient(&rect); // Inflate slightly to make it visible around the border rect.InflateRect(2, 2); CPen redPen(PS_SOLID, 2, RGB(255, 0, 0)); CPen* pOldPen = dc.SelectObject(&redPen); dc.SelectStockObject(NULL_BRUSH); dc.Rectangle(&rect); dc.SelectObject(pOldPen); }; // Only draw rectangles if there’s no selection if (m_cbGroupOverseer.GetCurSel() == CB_ERR) drawRedRect(&m_cbGroupOverseer); if (m_cbGroupAssistant.GetCurSel() == CB_ERR) drawRedRect(&m_cbGroupAssistant); }
尽管代码已执行,但未显示任何矩形。参考相关方案仍无效,且矩形参数值看似正确。
更新
我尝试按照评论中的方法修改,新增两个函数:
void CFieldServiceGroupManagerDlg::DrawRedRectAroundControl(CWnd* pCtrl) { if (!pCtrl || !::IsWindow(pCtrl->GetSafeHwnd())) return; CClientDC dc(this); int nSavedDC = dc.SaveDC(); CRect rect; pCtrl->GetWindowRect(&rect); ScreenToClient(&rect); rect.InflateRect(2, 2); CPen redPen(PS_SOLID, 2, RGB(255, 0, 0)); CPen* pOldPen = dc.SelectObject(&redPen); CBrush* pOldBrush = static_cast<CBrush*>(dc.SelectStockObject(NULL_BRUSH)); dc.Rectangle(&rect); dc.SelectObject(pOldPen); dc.SelectObject(pOldBrush); dc.RestoreDC(nSavedDC); } void CFieldServiceGroupManagerDlg::HighlightUnselectedCombos(bool const checkOverseer, bool const checkAssistant) { if (checkOverseer && m_cbGroupOverseer.GetCurSel() == -1) { DrawRedRectAroundControl(&m_cbGroupOverseer); } if (checkAssistant && m_cbGroupAssistant.GetCurSel() == -1) { DrawRedRectAroundControl(&m_cbGroupAssistant); } }
在两个组合框的选择变更处理程序中分别调用HighlightUnselectedCombos(true, false);或HighlightUnselectedCombos(false, true);,但出现问题:当组合框因未选中项显示红框后,选中项时红框仍未消失。
内容的提问来源于stack exchange,提问作者Andrew Truckle
相关产品推荐
相关产品推荐

