我想为列表视图创建HIMAGELIST
。它实际上需要包含文件图标。
这是我的代码:
HIMAGELIST imageList = ImageList_Create(GetSystemMetrics(SM_CXSMICON),
GetSystemMetrics(SM_CYSMICON),
ILC_MASK, 1, 1);
HICON ico = reinterpret_cast<HICON>(LoadImage(0,IDI_APPLICATION,
IMAGE_ICON,0,0,LR_SHARED));
ImageList_AddIcon(imageList, ico);
ListView_SetImageList(listView, imageList, LVSIL_SMALL);
包含三个元素的列表视图现在有三个应用程序项。
但是当我尝试添加另一个图标(在这种情况下为IDI_HAND
)时,我仍然会得到相同的3个图标。
我遇到的另一个问题是我无法获取所需的实际文件图标:
SHFILEINFO sfi;
SHGetFileInfo (L"C:\\test.txt", NULL, &sfi, sizeof (sfi), SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
ImageList_AddIcon(imageList, sfi.hIcon);
这会产生空图标,而不是我想要的txt
图标。
我一直在为此奋斗,我非常感谢你的帮助。
更新
我正在使用我在互联网上找到的示例代码来填充列表视图(显然这不是我想要的):
UINT columnMask = LVCF_TEXT|LVCF_FMT|LVCF_SUBITEM|LVCF_WIDTH;
LVCOLUMN lc[] = {
{ columnMask, 0, 150, L"Text...",0, 0,0,0 },
{ columnMask, LVCFMT_CENTER, 70, L"Number",0, 1,0,0 },
{ columnMask, 0, 100, L"Whatever",0, 2,0,0 },
};
ListView_InsertColumn(listView, 0, &lc[0]);
ListView_InsertColumn(listView, 1, &lc[1]);
ListView_InsertColumn(listView, 2, &lc[2]);
UINT itemMask = LVIF_TEXT;
LVITEM li[] = {
{ itemMask, 0,0, 0,0, L"...for the first item!",0, 0,0,0,0,0,0 },
{ itemMask, 0,1, 0,0, L"1",0, 0,0,0,0,0,0 },
{ itemMask, 0,2, 0,0, L"14 bucks",0, 0,0,0,0,0,0 },
{ itemMask, 1,0, 0,0, L"...for the second item!",0, 0,0,0,0,0,0 },
{ itemMask, 1,1, 0,0, L"24",0, 0,0,0,0,0,0 },
{ itemMask, 1,2, 0,0, L"2 suns",0, 0,0,0,0,0,0 },
{ itemMask, 2,0, 0,0, L"...for the second item!",0, 0,0,0,0,0,0 },
{ itemMask, 2,1, 0,0, L"24",0, 0,0,0,0,0,0 },
{ itemMask, 2,2, 0,0, L"2 suns",0, 0,0,0,0,0,0 },
{ itemMask, 3,0, 0,0, L"...for the second item!",0, 0,0,0,0,0,0 },
{ itemMask, 3,1, 0,0, L"24",0, 0,0,0,0,0,0 },
{ itemMask, 3,2, 0,0, L"2 suns",0, 0,0,0,0,0,0 },
};
// setting an icon like this doesn't work
li[0].iImage = sfi.iIcon;
ListView_InsertItem(listView, &li[0]);
ListView_SetItem(listView, &li[1]);
ListView_SetItem(listView, &li[2]);
ListView_InsertItem(listView, &li[3]);
ListView_SetItem(listView, &li[4]);
ListView_SetItem(listView, &li[5]);
ListView_InsertItem(listView, &li[6]);
ListView_SetItem(listView, &li[7]);
ListView_SetItem(listView, &li[8]);
答案 0 :(得分:3)
iImage
LVICON
成员是您传递给ListView_SetImageList
的图片列表中图标的索引。您正在传递系统图像列表中图标的索引,但传递给ListView_SetImageList
的图像列表是您的私有图像列表。任
ListView_SetImageList
将图片列表与您的私有图片列表相关联,并将iImage
设置为您的私有图片列表中的索引(来自ImageList_AddIcon
的返回值)ListView_SetImageList
将图像列表与系统图像列表关联,并将iImage
设置为系统图像列表中的索引。答案 1 :(得分:2)
对于你的第二个问题,尝试只传递.extension,在你的情况下传递.txt作为第一个参数,并且这些标志:SHGFI_SYSICONINDEX或SHGFI_USEFILEATTRIBUTES或SHGFI_SMALLICON或SHGFI_ICON并且返回时,sfi.hIcon应该包含的句柄txt文件图标
如果没有SHGFI_ICON,SHGetFileInfo只是填写sfi.iIcon这是系统图像列表中图标的索引,通过添加SHGFI_ICON,SHGetFileInfo也将填写sfi.hIcon,这就是你想要的。
您是如何添加listview项目的?显示填写LVITEM结构的代码。