2016-05-12 2 views
3

Ich versuche, Spaltenfilterung auf einem ListView Steuerelement (Windows Forms/C#/win32 über pinvoke) zu implementieren, auf dieselbe Weise wie Windows Explorer. Für diejenigen, die es nicht benutzt haben, sieht es wie folgt aus:Wie Windows Explorer-Spaltenfilterung auf ListView-Steuerkopfzeile replizieren

enter image description here

Wenn Sie über die Säule schweben ein Drop-Header Pfeil nach unten angezeigt wird, den Abfall klicken, wird unten ein Kontextmenü mit verschiedenen Filteroptionen. Sobald Sie eine Option mit den Pfeil Bild Änderungen an einem Häkchen Bild ausgewählt, die immer sichtbar ist, ist wie folgt: enter image description here

ich den Dropdown-Pfeil habe, indem er eine HDM_SETITEM Nachricht an das Listview mit dem HDF_SPLITBUTTON anzuzeigen Formatflag angegeben. Ich kann auch das Filtermenü anzeigen.

Das Problem, das ich habe, ist, dass ich nicht herausfinden kann, wie man das "Zecke" Bild anzeigt. Nun, abgesehen von der Verwendung von Eigentümer Zeichnung, die wirklich wie ein Overkill scheint. Ich habe die API-Dokumentation für ListView und Header-Steuerelemente durchgelaufen und es scheint keine Windows-Nachricht zu geben, die Sie senden können, um das Bild zu ändern.

um es zu umgehen Ich habe versucht, einen Header-Bild verwenden, dass die Filterung aktiv ist, um anzuzeigen, aber die HDITEM Dokumentation nach Ihnen nicht HDF_IMAGE oder HDF_BITMAP zugleich als HDF_SORTUP oder HDF_SORTDOWN verwenden können. Also habe ich neue Bilder erstellt, um sowohl den Sortier- als auch den Filterstatus anzugeben, aber jetzt sind alle meine ListView Elemente um die Größe des Spaltenkopfbilds eingerückt (scheint ein bekanntes Problem mit dem C# ListView Steuerelement zu sein).

Ich habe etwas gefunden, das vielversprechend aussah: BCM_SETSPLITINFO lässt Sie die Glyphe einer geteilten Taste einstellen. Jedoch habe ich einen ListView-Header, nicht eine Split-Taste, es sei denn, die Kopfzeile hat Unterfenster, die Split-Schaltflächen sind

So hat jemand Ideen, wie man diese "Tick" -Markierung replizieren, ohne einen vollständigen Besitzer zu implementieren Lösung? schließlich

Dank

Greg

+2

Es sieht aus wie ein ListView, [aber es ist nicht] (http://stackoverflow.com/questions/4089196/netuihwnd-and-directuihwnd). –

+0

Ah! Das würde es erklären, ich habe vorher noch nichts von DirectUIHWND gehört. Kein Wunder, dass es mir mit dem Win32 ListView Steuerelement so schwer gefallen ist. Ich habe es tatsächlich mit Spy ++ versucht, aber ich habe nur so weit herausgefunden, dass der Header ein separates Fenster ist. – Greg

Antwort

0

Wenn Sie wirklich gute Sache benötigen, werden Sie zum Besitzer zurückgreifen ziehen. Ich glaube nicht, dass Header-Control irgendeine Nachricht/Benachrichtigung/notify-reflect für diese Sache gibt.

Für jetzt können Sie nur fool der Benutzer durch Häkchen-Symbol auf der ganz linken Spalte Namen. Wenn kein Häkchen angezeigt wird, wird links eine Menge Leerzeichen angezeigt. Sie können ein solches Symbol nicht richtig platzieren, da der Benutzer die Größe der Spalte ändern kann und das Häkchen nicht ganz rechts steht.

Abhängig von der gewählten Schriftart kann die Anzahl der Leerzeichen, die Sie anstelle des Tick-Symbols setzen, mehr oder weniger betragen.

+0

Ich benutze derzeit den "Trick ein Bild links von der Spalte Name" Trick, das war die beste Arbeit, die ich mir vorstellen konnte. Leider funktioniert das .Net-Steuerelement nicht so gut, also habe ich mich dazu entschlossen, die Header-Bildliste manuell mit HDM_SETIMAGELIST zu setzen.Das hat meistens funktioniert, aber jetzt, wenn ich das Bild lösche (LVM_SETCOLUMN mit iImage = I_IMAGENONE), wird der Text nicht neu ausgerichtet, d. H. Das Bild ist verschwunden, aber der Platz, der dafür zugewiesen wurde, ist noch da. – Greg

+0

Um diesen Speicherplatz zu unterdrücken, müssen Sie 'HDF_IMAGE' in' item.fmt' zurücksetzen (befindet sich in 'HDITEM' Struktur). – Velcro