是否可以有 CComboBoxEx
不显示所选项目的图像在 CEdit
部分,即使选中的项目有一个图像,当下拉列表是可见的?
我似乎找不到一种方法可以做到这一点,我想知道是否可以在使用 CComboBoxEx
.
想不到一个简单的解决方案,而不需要子类或处理 WM_PAINT
信息。如果你看一下 ComboBoxEx
控件,你会发现,即使组合框关闭,图标也是组合框的一部分。
不过,你还是可以通过注册为 CBN_DROPDOWN
和 CBN_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_GETCOMBOCONTROL
和 CBEM_GETEDITCONTROL
(GetComboBoxCtrl()
和 GetEditCtrl()
在 CComboBoxEx
的),你可以去看看,虽然我不知道你是否可以修改那里的内容。在下拉列表组合框的情况下,编辑控制是不可用的。
另一个可能的 "解决方案"(而是一个变通方法)是在组合框的编辑部分上面放置一个编辑(在下拉的情况下)或静态(在下拉列表的情况下)控件(即覆盖它)。使用夹子样式来确保正确的绘制。你将需要写一些小代码来同步这两个控件,例如当列表中选定的项目发生变化时更新静态控件。例如,Excel中字体的下拉(?)控件似乎就采用了这样的技术。实际上,它是一个富编辑控件(用Spy++检查过)。最后的办法(也是一个非常简单的办法),一个空白的静态控件(没有任何文字),只是在编辑部分覆盖图片。
也可以看一下 CB_SETDROPPEDWIDTH
消息。不知道它是否可以用在ComboBoxEx控件中(它是用于普通的组合框的),但由于ComboBoxEx是一个子类,它可能也可以用。