CComboBoxEx:当一个项目的图像显示在组合框编辑组件中时,隐藏该图像。

问题描述 投票:0回答:1

是否可以有 CComboBoxEx 不显示所选项目的图像在 CEdit 部分,即使选中的项目有一个图像,当下拉列表是可见的?

我似乎找不到一种方法可以做到这一点,我想知道是否可以在使用 CComboBoxEx.

c++11 visual-c++ mfc
1个回答
0
投票

想不到一个简单的解决方案,而不需要子类或处理 WM_PAINT 信息。如果你看一下 ComboBoxEx 控件,你会发现,即使组合框关闭,图标也是组合框的一部分。

不过,你还是可以通过注册为 CBN_DROPDOWNCBN_CLOSEUP 通知信息,发送到您的父窗口(通常是对话框)。

一般的想法是当组合框关闭时,将选定的图像索引设置为-1。

这段代码假设项目索引也是图片列表中图片的索引。

// CBN_DROPDOWN-> called when the combo is opened. Need to set 
// the selected image.
void CMFCApplication2Dlg::OnCbnDropdownComboboxex1()
{
    int i = m_combo.GetCurSel();
    if (i > CB_ERR)
    {
        COMBOBOXEXITEM cmbItem = { 0 };
        CString strText;
        cmbItem.iItem = i;
        cmbItem.mask = CBEIF_SELECTEDIMAGE;
        m_combo.GetItem(&cmbItem);
        cmbItem.iSelectedImage = i;
        m_combo.SetItem(&cmbItem);
    }
}

// CBN_DROPDOWN -> called when the combo is closed. Need to 
// set the selected image to -1.
void CMFCApplication2Dlg::OnCbnCloseupComboboxex1()
{
    int i = m_combo.GetCurSel();
    if (i > CB_ERR)
    {
        COMBOBOXEXITEM cmbItem = { 0 };
        CString strText;            
        cmbItem.iItem = i;
        cmbItem.mask = CBEIF_SELECTEDIMAGE;

        m_combo.GetItem(&cmbItem);      

        cmbItem.iSelectedImage = -1;
        m_combo.SetItem(&cmbItem);
    }
}

0
投票

我认为你在这里做不了什么。ComboBoxEx在Win32中其实是以ComboBox子类的形式实现的,执行所有者绘制动作。仅此一点就增加了难度。因此,我可以想到两个可能的解决方案。

首先,检查你是否可以捕获 WM_DRAWITEM 消息(并且它实际上被调用了),如果你能区分对列表中的项目和 "编辑 "部分的调用。如果是这样,你可以对编辑部分进行自定义绘制,并对列表中的项目进行默认调用。有两个信息。CBEM_GETCOMBOCONTROLCBEM_GETEDITCONTROL (GetComboBoxCtrl()GetEditCtrl()CComboBoxEx 的),你可以去看看,虽然我不知道你是否可以修改那里的内容。在下拉列表组合框的情况下,编辑控制是不可用的。

另一个可能的 "解决方案"(而是一个变通方法)是在组合框的编辑部分上面放置一个编辑(在下拉的情况下)或静态(在下拉列表的情况下)控件(即覆盖它)。使用夹子样式来确保正确的绘制。你将需要写一些小代码来同步这两个控件,例如当列表中选定的项目发生变化时更新静态控件。例如,Excel中字体的下拉(?)控件似乎就采用了这样的技术。实际上,它是一个富编辑控件(用Spy++检查过)。最后的办法(也是一个非常简单的办法),一个空白的静态控件(没有任何文字),只是在编辑部分覆盖图片。

也可以看一下 CB_SETDROPPEDWIDTH 消息。不知道它是否可以用在ComboBoxEx控件中(它是用于普通的组合框的),但由于ComboBoxEx是一个子类,它可能也可以用。

© www.soinside.com 2019 - 2024. All rights reserved.