问题清除Vista上的Listview标题图像

时间:2009-04-15 21:17:46

标签: c++ winapi listview

我在使用Listview控件的Vista上遇到问题,特别是在标题上设置自定义图标。通常在XP或任何以前版本的Windows下,如果我添加了一个图标(在C ++中),我可以使用以下内容:

HeaderItem.mask     = HDI_FORMAT | HDI_IMAGE;
Header_GetItem(HeaderHWND, Column, &HeaderItem);

TurnOn(HeaderItem.fmt, HDF_IMAGE);
HeaderItem.iImage = Image;
if (Header_SetItem(HeaderHWND, Column, &HeaderItem) == 0)
    printf("Failed to set header [%d:%.8X]\n", GetLastError(), GetLastError());

然后要删除特定列上的图像,我可以使用相同的过程,但不要打开HDF_IMAGE位,只需将其关闭即可。

然而,在Vista上,当我关闭它时,它似乎并没有真正接受这种改变。所以,例如,当我开始我的fmt是:

0x4000(或基本上是HDF_STRING)

我打开图标,它变为:

0x5800(或基本上是HDF_STRING | HDF_IMAGE | HDF_BITMAP_ON_RIGHT)

然后我再将其关闭,但结果是:

0x4800(或基本上是HDF_STRING | HDF_IMAGE)

我已经检查过了,我只将它设置为HDF_STRING,但是一旦设置了HDF_IMAGE,似乎无法删除。 Header_SetImage不会返回任何错误,因此我无所适从。我也试过从控件中删除Imagelist,但它仍然留下空间,好像那里还有一个图像。

在一天结束时,我需要能够添加和删除标题中的图标,当它们被删除时,我需要再次提供所有标题空间(因为它们在显示之前就已存在。任何帮助都会很大感谢 - 提前感谢!

2 个答案:

答案 0 :(得分:1)

如果您阅读文档http://msdn.microsoft.com/en-us/library/bb775247(VS.85).aspx,如果您在掩码中指示HDI_IMAGE,则iImage应该是有效索引,您必须将其设置为I_IMAGENONE才能将其删除。

如果您想要移动图像,您必须执行以下操作:

HeaderItem.mask = HDI_FORMAT | HDI_IMAGE;
Header_GetItem(HeaderHWND, Column, &HeaderItem);
HeaderItem.fmt &= ~(HDF_IMAGE | HDF_BITMAP_ON_RIGHT);
HeaderItem.iImage = I_IMAGENONE;
Header_SetItem(HeaderHWND, Column, &HeaderItem);

答案 1 :(得分:0)

嗯,我只是弄明白了 - 就传递的参数而言,它们现在的工作方式略有改变。

之前,我总是在删除HDF_IMAGE属性时将iImage设置为0 - 但是现在看起来如果你执行一个Set,并且你的掩码包含HDI_IMAGE,那么它就不会删除HDF_IMAGE位,即使你明确了做。

因此,解决方案是确保在尝试删除图像时不发送与图像相关的内容。由于我在网上搜索并找不到任何相关内容,希望这篇文章现在可以帮助其他有类似问题的人。