CComboBoxEx:在组合框编辑组件中显示项目时隐藏项目的图像



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

我似乎找不到一种方法来做到这一点,并且想知道CComboBoxEx是否有可能.

如果不进行子类化或处理WM_PAINT消息,就想不出一个简单的解决方案。 如果您查看带有SPY++的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);
}
}

我认为你在这里无能为力。ComboBoxEx 实际上是在 Win32 中作为 ComboBox 子类实现的,执行所有者绘制操作。仅此一项就使事情变得更加困难。因此,我可以想到两种可能的解决方案。

首先,检查是否可以捕获WM_DRAWITEM消息(并且它实际上正在被调用(,以及是否可以区分对列表中项目的调用和"编辑"部分。如果是这样,您可以对编辑部分执行自定义绘制,并为列表中的项目调用默认值。有两条消息,CBEM_GETCOMBOCONTROLCBEM_GETEDITCONTROL(GetComboBoxCtrl()GetEditCtrl()在MFCCComboBoxEx(,您可以查看,尽管我不知道您是否可以在那里修改以及可以修改什么。编辑控件在下拉列表组合框的情况下不可用。

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

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

最新更新