0

我想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我想要的图标。

我一直在为此苦苦挣扎,非常感谢您在这里的帮助。

更新

我正在使用在 Internet 上找到的示例代码来填充列表视图(显然这不是我想要的):

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]);
4

2 回答 2

3

iImage成员LVICON是您传递给的图像列表中图标的索引ListView_SetImageList。您正在系统图像列表中传递图标的索引,但您传递给的图像列表ListView_SetImageList是您的私有图像列表。任何一个

  1. 用于ListView_SetImageList将图像列表与您的私有图像列表相关联,并将 设置为iImage您的私有图像列表中的索引(从 的返回值ImageList_AddIcon
  2. 用于ListView_SetImageList将 imagelist 与系统 imagelist 关联,并将 设置为iImage系统 imagelist 中的索引。
于 2012-05-26T18:28:24.913 回答
2

对于您的第二个问题,请尝试仅传递 .extension,在您的情况下传递 .txt 作为第一个参数,以及这些标志:SHGFI_SYSICONINDEX 或 SHGFI_USEFILEATTRIBUTES 或 SHGFI_SMALLICON 或 SHGFI_ICON 并在返回时,sfi.hIcon 应包含 txt 文件图标的句柄

如果没有 SHGFI_ICON,SHGetFileInfo 只是填写 sfi.iIcon 是系统图像列表中图标的索引,通过添加 SHGFI_ICON,SHGetFileInfo 也将填写 sfi.hIcon 这就是你想要的。

你是如何添加列表视图项目的?显示填写 LVITEM 结构的代码。

于 2012-05-26T18:11:48.573 回答