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