C# 如何在ListView控件标头上复制Windows资源管理器列筛选

C# 如何在ListView控件标头上复制Windows资源管理器列筛选,c#,winforms,winapi,C#,Winforms,Winapi,我正试图通过pinvoke在ListView控件(Windows窗体/c#/win32)上实现列过滤,方法与Windows资源管理器相同。对于那些以前没有使用过它的人,它看起来是这样的: 将鼠标悬停在列标题上方时,会出现一个下拉箭头,单击该下拉菜单将显示一个包含各种筛选选项的关联菜单。选择选项后,箭头图像将变为始终可见的记号图像,如下所示: 我通过指定HDF\u SPLITBUTTONformat标志向ListView发送一条HDM\u SETITEM消息来显示下拉箭头。我还可以显示过滤菜单

我正试图通过pinvoke在
ListView
控件(Windows窗体/c#/win32)上实现列过滤,方法与Windows资源管理器相同。对于那些以前没有使用过它的人,它看起来是这样的:

将鼠标悬停在列标题上方时,会出现一个下拉箭头,单击该下拉菜单将显示一个包含各种筛选选项的关联菜单。选择选项后,箭头图像将变为始终可见的记号图像,如下所示:

我通过指定
HDF\u SPLITBUTTON
format标志向ListView发送一条HDM\u SETITEM消息来显示下拉箭头。我还可以显示过滤菜单

我的问题是,我不知道如何显示“勾号”图像。好吧,除了使用业主图纸,这真的似乎是一种过度使用。我已经阅读了ListView和Header控件的API文档,似乎没有任何windows消息可以用来更改图像

为了解决这个问题,我尝试使用一个标题图像来表示过滤处于活动状态,但根据HDITEM文档,您不能在
HDF\u SORTUP
HDF\u SORTDOWN
的同时使用
HDF\u图像或
HDF\u位图
。因此,我创建了新的图像来指示排序和筛选状态,但现在我所有的
ListView
项都按列标题图像的大小缩进(这似乎是c#
ListView
控件的一个已知问题)

我确实发现了一些很有希望的东西:
BCM_SETSPLITINFO
可以设置拆分按钮的图示符。但是,我有一个ListView标题,而不是拆分按钮,除非标题中有拆分按钮的子窗口

那么,有没有人知道如何在不实现完全由所有者绘制的解决方案的情况下复制“勾号”标记

谢谢


格雷格

如果你需要真正的好东西,你最终会求助于业主抽签。我不认为header控件为这件事提供任何消息/通知/通知反射

现在,您可以通过在列名的最左边添加勾号符号来愚弄用户。如果没有勾选,则在左侧显示一组空格。您不能将这样的符号放在右边,因为用户可能会调整列的大小,勾号不会在最右边


根据所选字体的不同,您放置的空格集(而不是勾号符号)可能或多或少有所不同

它看起来像一个列表视图,。啊!那就可以解释了,我以前没听说过DirectuihWind。难怪我在使用Win32 ListView控件时遇到如此困难。我确实尝试过Spy++,但我只知道标题是一个单独的窗口。我目前正在使用“将图像放在列名左侧”的技巧,这是我能想到的最好的解决方法。不幸的是.Net控件不能很好地处理这个问题,所以我求助于使用HDM_SETIMAGELIST手动设置标题图像列表。这主要起到了作用,但现在当我清除图像时(LVM_SETCOLUMN with iImage=I_IMAGENONE),标题并没有重新排列文本,即图像消失了,但分配给它的空间仍然存在。为了抑制此空间,必须在
项.fmt
结构中重置
HDF_image
(位于
HDITEM
结构中).