2016-05-12 54 views
3

我試圖通過Windows資源管理器以相同的方式在ListView控件(Windows窗體/ c#/ win32通過pinvoke)上實施列過濾。對於那些還沒有使用它之前,它看起來像這樣:如何在ListView控件標題上覆制Windows資源管理器列過濾

enter image description here

當你將鼠標懸停在列向下箭頭出現頭下降,單擊下拉顯示各種過濾選項的上下文菜單。一旦你選擇一個選項箭頭圖像的變化,始終是可見的,這樣的刻度標記的圖像: enter image description here

我有下拉箭頭通過發送HDM_SETITEM消息到ListView與HDF_SPLITBUTTON顯示格式標誌指定。我也可以顯示過濾菜單。

我遇到的問題是我無法確定如何顯示「打勾」圖像。那麼除了訴諸使用所有者繪圖,這真的看起來像一個矯枉過正。我已經瀏覽了ListView和Header控件的API文檔,並且似乎沒有任何Windows消息可以發送來更改圖像。

要解決它,我嘗試使用的報頭的圖像,這表明篩選是有效的,但根據HDITEM文檔不能在同一時間作爲HDF_SORTUPHDF_SORTDOWN使用HDF_IMAGEHDF_BITMAP。因此,然後我創建了新的圖像來指示排序和篩選狀態,但現在我的所有ListView項都縮進列標題圖像的大小(似乎是c#ListView控件的已知問題)。

我確實發現了一些看起來很有前途的東西:BCM_SETSPLITINFO可讓您設置拆分按鈕的字形。不過,我有一個ListView標題,而不是一個拆分按鈕,除非標題有子窗口是分割按鈕...

所以沒有任何人有任何想法如何複製該「勾號」標記而不實施完整的所有者繪製解?

感謝

格雷格

+2

它看起來像一個ListView,[但它不是](http://stackoverflow.com/questions/4089196/netuihwnd-and-directuihwnd)。 –

+0

啊!這將解釋它,我以前沒有聽說過DirectUIHWND。難怪我在Win32 ListView控件上遇到過如此艱難的時刻。我其實也嘗試了Spy ++,但我只是想知道標題是一個單獨的窗口。 – Greg

回答

0

如果你需要真正的好東西,你將訴諸業主最終得出。我不認爲標題控制給出任何消息/通知/通知 - 反映這件事情。

現在,你可以只用傻瓜用戶通過在列名的左邊有刻度符號。如果沒有打勾,則在左側顯示一組空白。你不能把這樣的符號放在正確的位置,因爲用戶可能調整列的大小,並且刻度標記不會在最右邊。

根據選定的字體,您放置的空格而不是勾號符號可能會更多或更少。

+0

我目前正在使用「把圖像放在列名左側」的訣竅,那是我能想到的最好的工作。不幸的是.Net控件不能很好地處理,所以我採用HDM_SETIMAGELIST手動設置標題圖像列表。這大部分工作,但現在當我清除圖像(LVM_SETCOLUMN與IImage = I_IMAGENONE)頭不重新排列的文本,即圖像消失,但分配的空間仍然存在。 – Greg

+0

爲了消除這個空間,你必須重置'item.fmt'(位於'HDITEM'結構)中的'HDF_IMAGE'。 – Velcro