【发布时间】:2021-04-08 00:12:03
【问题描述】:
请注意,我发现我需要添加类似于 LVITEM 的 COMBOBOXEXITEM 值,基于这本书:Image Lists and ComboBoxEx Controls | Programming Windows with MFC, Second Edition (flylib.com)
仅供参考,我在SetImageList 通话中收到上述错误:
// Add color icons to combobox
for (int nCount = 0; nCount < m_colorBarTemplateFiles.GetCount(); nCount++) {
CBitmap colorTemplateBitmap;
const CString fname = colorBarTemplateDirectory + "\\" + m_colorBarTemplateImageFileNames[nCount];
HANDLE colorTemplateImageHandle = LoadImage(0, fname, IMAGE_BITMAP, 16, 16, LR_LOADFROMFILE);
colorTemplateBitmap.FromHandle((HBITMAP)colorTemplateImageHandle);
m_colorBarTemplateImages.Add(&colorTemplateBitmap, (COLORREF)0xFFFFFF);
}
SetImageList(&m_colorBarTemplateImages);
在我链接的书中,作者写了这段代码(顺便说一句,我已经购买了希望随 CD 一起提供的书,但要再过 3 周才会到货):
m_il.Create (IDB_IMAGES, 16, 1, RGB (255, 0, 255));
SetImageList (&m_il);
但不幸的是,网站上的代码没有 *.rc 文件:
所以我不知道他如何设置IDB_IMAGES。据我了解,IDB_IMAGES 是一个大位图,被划分为不同的图标,但不清楚如何在 MFC 中进行设置。
这是 afxcmn2.inl 第 334 行:
_AFXCMN_INLINE CImageList* CComboBoxEx::SetImageList(_In_ CImageList* pImageList)
{ ASSERT(::IsWindow(m_hWnd)); return CImageList::FromHandle((HIMAGELIST) ::SendMessage(m_hWnd, CBEM_SETIMAGELIST, 0, (LPARAM)pImageList->GetSafeHandle())); }
所以不知何故,我没有正确创建句柄。我还查看了其他帖子,例如:
visual c++ - How to add Images to CListCtrl in MFC - Stack Overflow
ccombobox - MFC CComboBoxEx icon update issue - Stack Overflow
CImageList Class | Microsoft Docs
CComboBoxEx Class | Microsoft Docs
你有什么建议吗? TIA。
更新:
请注意,我刚刚了解到我需要能够在运行时动态添加这些颜色,因此我无法使用*.rc 文件和CBitmaps。相反,我将不得不研究在 OnPaint 或 OnDraw 中添加一个彩色区域到 ComboBoxEx 以某种方式使用这样的东西:
COLORREF itemColor = colorArray[subitem][item];
CRect rect;
GetSubItemRect(item, subitem, LVIR_LABEL, rect);
CDC* pDc = GetDC();
pDc->FillRect(rect, &CBrush(itemColor));
ReleaseDC(pDc);
所以我会及时告诉你我的发现。
【问题讨论】:
-
使用内置的图像编辑器(嗯,这是一个非常基本的)或另一个(外部)图像编辑器创建它并将其导入您的资源。当然,它会被分配一个资源 ID(在示例中为
IDB_IMAGES)。这将创建一个图像列表。位图必须由固定宽度的部分组成。查看 MFC 向导生成的工具栏位图,查看示例。 -
据我所见,最有可能的罪魁祸首是
ASSERT(::IsWindow(m_hWnd))。你什么时候调用这个代码?它不能在组合框或对话框的构造函数中。它需要在您的组合框的 DoDataExchange() 之后调用...假设您的组合框的 DoDataExchange() 中有一个 DDX_Control() 条目。首选方法是从 OnInitDialog() 中的某个地方调用它。组合框必须已在 Windows 中创建。它可能是断言,因为您的组合框的 m_hWnd 是 NULL ...即组合框的窗口尚未创建。 -
您是否阅读了断言对话框中的说明?
-
谢谢,我是 MFC 的新手,所以我会仔细看看。
-
显然你想为你的
ComboBoxEx控件创建一个图像列表。调用Create()成员(将位图资源ID 作为参数的成员)并不是初始化图像列表的唯一方法。您可以改为调用Create(),初始图像数量为 0,然后调用Add()方法,将一个或多个图像添加到图像列表中。Add()反过来将CBitmap对象作为参数,可以从外部图像文件加载或以编程方式创建。查看CImageList类文档了解详细信息(在 MS-Docs 上)。