C++11 CComboxEx:在组合框编辑组件中显示项目时隐藏该项目的图像

C++11 CComboxEx:在组合框编辑组件中显示项目时隐藏该项目的图像,c++11,visual-c++,mfc,C++11,Visual C++,Mfc,是否可以让ccomboxex不在CEdit部件内显示所选项目的图像,即使所选项目具有显示下拉列表时的图像 我似乎找不到一种方法来做到这一点,我想知道是否有可能使用ccomboxex如果不子类化或处理WM\u PAINT消息,我想不出一个简单的解决方案。 如果您使用SPY++查看ComboBoxEx控件,您会注意到即使在组合框关闭时,图标也是组合框的一部分 不过,您可以通过注册到CBN_下拉列表和CBN_特写发送到父窗口(通常是对话框)的通知消息来控制项目的选定图像 一般的想法是在组合框关闭时将选

是否可以让
ccomboxex
不在
CEdit
部件内显示所选项目的图像,即使所选项目具有显示下拉列表时的图像


我似乎找不到一种方法来做到这一点,我想知道是否有可能使用
ccomboxex

如果不子类化或处理
WM\u PAINT
消息,我想不出一个简单的解决方案。 如果您使用SPY++查看
ComboBoxEx
控件,您会注意到即使在组合框关闭时,图标也是组合框的一部分

不过,您可以通过注册到
CBN_下拉列表
CBN_特写
发送到父窗口(通常是对话框)的通知消息来控制项目的选定图像

一般的想法是在组合框关闭时将选定的图像索引设置为-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);
    }
}

如果没有子类化或处理
WM_PAINT
消息,就无法想出一个简单的解决方案。 如果您使用SPY++查看
ComboBoxEx
控件,您会注意到即使在组合框关闭时,图标也是组合框的一部分

不过,您可以通过注册到
CBN_下拉列表
CBN_特写
发送到父窗口(通常是对话框)的通知消息来控制项目的选定图像

一般的想法是在组合框关闭时将选定的图像索引设置为-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);
    }
}

我认为你在这里做不了什么。ComboBox实际上在Win32中作为ComboBox子类实现,执行所有者绘制操作。光是这一点就让事情变得更加困难。因此,我可以想出两种可能的解决办法

首先,检查您是否可以捕获
WM_DRAWITEM
消息(它实际上正在被调用),以及您是否可以区分对列表中某个项目的调用和“编辑”部分。如果是这样,则可以为编辑零件执行自定义绘制,并调用列表中项目的默认值。有两条消息,
CBEM_getcomboxControl
CBEM_GETEDITCONTROL
getcomboxCtrl()
GetEditCtrl()
在MFC的
ccomboxEx
中),您可以签出它们,尽管我不知道是否可以修改它们,也不知道可以修改什么。对于下拉列表组合框,编辑控件不可用

另一种可能的“解决方案”(而不是解决方法)是在组合框的编辑部分(即覆盖它)的顶部放置一个编辑(在下拉框中)或静态(在下拉列表框中)控件。使用“剪辑子对象”样式以确保正确绘制。您需要编写一些小代码来同步这两个控件,例如当列表中的选定项发生更改时更新静态控件。例如,Excel中字体的下拉(?)控件似乎采用了这种技术。它实际上是一个丰富的编辑控件(用Spy++检查)。最后一种方法(也是非常简单的方法),一个空白的静态控件(没有任何文本),只覆盖编辑部分中的图像


还要查看
CB_SETDROPPEDWIDTH
消息。不确定它是否可以在ComboBoxEx控件中使用(它用于普通的组合框),但由于ComboBoxEx是一个子类,它可能也可以工作。

我认为您在这里做不了什么。ComboBox实际上在Win32中作为ComboBox子类实现,执行所有者绘制操作。光是这一点就让事情变得更加困难。因此,我可以想出两种可能的解决办法

首先,检查您是否可以捕获
WM_DRAWITEM
消息(它实际上正在被调用),以及您是否可以区分对列表中某个项目的调用和“编辑”部分。如果是这样,则可以为编辑零件执行自定义绘制,并调用列表中项目的默认值。有两条消息,
CBEM_getcomboxControl
CBEM_GETEDITCONTROL
getcomboxCtrl()
GetEditCtrl()
在MFC的
ccomboxEx
中),您可以签出它们,尽管我不知道是否可以修改它们,也不知道可以修改什么。对于下拉列表组合框,编辑控件不可用

另一种可能的“解决方案”(而不是解决方法)是在组合框的编辑部分(即覆盖它)的顶部放置一个编辑(在下拉框中)或静态(在下拉列表框中)控件。使用“剪辑子对象”样式以确保正确绘制。您需要编写一些小代码来同步这两个控件,例如当列表中的选定项发生更改时更新静态控件。例如,Excel中字体的下拉(?)控件似乎采用了这种技术。它实际上是一个丰富的编辑控件(用Spy++检查)。最后一种方法(也是非常简单的方法),一个空白的静态控件(没有任何文本),只覆盖编辑部分中的图像


还要查看
CB_SETDROPPEDWIDTH
消息。不确定它是否可以在ComboBoxEx控件中使用(它用于普通的组合框),但由于ComboBoxEx是一个子类,它也可以工作。

OP知道如何将图像分配给组合框项目。但这不是问题所在。问题是,是否可以在下拉列表中包含图像,但在下拉列表折叠后不在嵌入式编辑控件中显示图像。OP知道如何将图像分配给组合框项目。但这不是问题所在。问题是,是否可以在下拉列表中包含图像,但在下拉列表折叠后不在嵌入式编辑控件中显示图像。