c++ - 试图创建 HIMAGELIST,我在这里做错了什么?

标签 c++ winapi

我想为 ListView 创建一个 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);

具有三个元素的 ListView 现在具有三个应用程序项。

但是,当我尝试添加另一个图标(在本例中为 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 上找到的示例代码来填充 ListView (显然这不是我想要的):

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

最佳答案

iImage LVICON的成员是您传递给 ListView_SetImageList 的图像列表中图标的索引.您正在传递系统图像列表中图标的索引,但您传递给 ListView_SetImageList 的图像列表是您的私有(private)图像列表。要么

  1. 使用ListView_SetImageList将图像列表与您的私有(private)图像列表相关联,并设置 iImage到您的私有(private)图片列表中的索引(ImageList_AddIcon 的返回值)
  2. 使用ListView_SetImageList将图像列表与系统图像列表相关联,并设置 iImage到系统图像列表中的索引。

关于c++ - 试图创建 HIMAGELIST,我在这里做错了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10768529/

相关文章:

c++ - ReadConsoleOutputCharacter 在请求超过 0xCFE1 个字符时给出 ERROR_NOT_ENOUGH_MEMORY,有没有办法解决这个问题?

c++ - std::vector 是否有转换运算符?我看到了什么?

未找到 C++ graphics.h -lbgi

c++ - 如何计算 C++ 中 double vector 的累积和?

c++ - 使用管道 Win32 连续读取/写入数据

c# - 如何在 Windows 中迭代无响应的程序?

c++ - 查找数组中第二/第三小元素的递归方法

c++ - 如何根据 X 坐标(QWT)获取绘图曲线的 Y 坐标?

c# - 使用 C# 以编程方式打开魅力栏、电源栏和开始菜单

c - 如何在默认程序中打开文件