You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 17:07:08