如何在 setFocus 上绘制 CComboBox

Posted

技术标签:

【中文标题】如何在 setFocus 上绘制 CComboBox【英文标题】:How to draw an CComboBox on setFocus 【发布时间】:2021-12-23 13:56:55 【问题描述】:
HBRUSH CDialog23::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)

    HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);

    int Element = pWnd->GetFocus()->GetDlgCtrlID();

    if (pWnd->GetDlgCtrlID() == Element && nCtlColor != CTLCOLOR_STATIC)
    
        pDC->SetBkMode(TRANSPARENT);
        pDC->SetBkColor(RGB(255, 230, 153));
        hbr = m_Gelb;
        return hbr;
    
    else
    
        pDC->SetBkMode(TRANSPARENT);
        pDC->SetBkColor(RGB(255, 255, 255));
        hbr = m_Weiss;
        return hbr;
    

使用此代码,当我将焦点设置到其中一个时,我的 ComboBox 将变为黄色。但是,如果当前焦点设置为组合框之一,则当我使用光标悬停在它们上时(不单击它们),所有其他组合框都将变为黄色。此外,组合框的列表不会着色(它们的格式为下拉菜单)。

有什么想法吗?

【问题讨论】:

【参考方案1】:

这是因为您没有检查组合框 ID 是否等于焦点组合 ID。下拉组合框永远不会获得焦点。它是包含子编辑控件的复杂控件,该控件的 ID=1001 (0x03E9)。因此,您将注意力集中在 ID 为 1001 的窗口上,并且该 ID 的所有窗口也会更改背景。 更改逻辑并使用窗口句柄而不是 ID。 至于下拉列表是一个位于组合框窗口之上的弹出窗口,您将不得不使用不同的方法更改背景。您无法控制下拉列表的创建,唯一的方法是使用挂钩动态子类化此窗口。

【讨论】:

以上是关于如何在 setFocus 上绘制 CComboBox的主要内容,如果未能解决你的问题,请参考以下文章

vba textbox在失去焦点后如何重新获取焦点

访问表单控件闪烁控件是来自Class的setFocus

ItemizedOverlay 的 setFocus(overlayItem) 不起作用

C语言FindWindow和SetFocus的问题

Flex:在输入 ENTER 后 setFocus 不起作用

MFC C++:setfocus 也设置捕获吗?