Informationen zu Headersteuerelementen

Ein Kopfzeilensteuerelement ist ein Fenster, das in der Regel oberhalb von Text- oder Zahlenspalten positioniert ist. Sie enthält einen Titel für jede Spalte und kann in Teile unterteilt werden. Der Benutzer kann die Trennlinien ziehen, die die Teile trennen, um die Breite der einzelnen Spalten festzulegen. Die folgende Abbildung zeigt ein Headersteuerelement mit beschrifteten Spalten, die detaillierte Informationen zu Dateien in einem Verzeichnis enthalten.

Screenshot eines Dialogfelds mit einem dreispaltigen Kopfzeilensteuerelement

Sie können ein Headersteuerelement erstellen, indem Sie die CreateWindowEx-Funktion verwenden und dabei die WC_HEADER Fensterklasse und die entsprechenden Headersteuerelementstile angeben. Diese Fensterklasse wird registriert, wenn die allgemeine Steuerelement-DLL geladen wird. Verwenden Sie die Funktion InitCommonControlsEx , um sicherzustellen, dass diese DLL geladen wird. Nachdem Sie ein Headersteuerelement erstellt haben, können Sie es in Teile unterteilen, den Text in jedem Teil festlegen und die Darstellung des Fensters mithilfe von Headerfenstermeldungen steuern.

Ein Headersteuerelement kann als untergeordnetes Fenster eines anderen Steuerelements erstellt werden, z. B. als Listenfeld. Das übergeordnete Steuerelement kennt das Headersteuerelement jedoch nicht und lässt den vom Header belegten Speicherplatz nicht zu, sodass Listenelemente hinter dem Header angezeigt werden. Wenn Sie ein Kopfzeilensteuerelement in einem Listenfeld oder einem anderen Steuerelement verwenden möchten, muss das übergeordnete Steuerelement besitzerseitig gezeichnet werden, damit alle Elemente an der richtigen Position angezeigt werden.

Listenansichtssteuerelemente verfügen bereits über Headersteuerelemente. Anstatt ein Headersteuerelement für ein Listenansichtssteuerelement zu erstellen, verwenden Sie LVM_GETHEADER oder ListView_GetHeader , um das vorhandene Steuerelement abzurufen.

Größe und Position des Headersteuerelements

In der Regel müssen Sie die Größe und Position eines Headersteuerelements so festlegen, dass sie in die Grenzen eines bestimmten Rechtecks passen, z. B. der Clientbereich eines Fensters. Mithilfe der HDM_LAYOUT-Nachricht können Sie die entsprechenden Größen- und Positionswerte aus dem Headersteuerelement abrufen.

Wenn Sie HDM_LAYOUT senden, geben Sie die Adresse einer HDLAYOUT-Struktur an, die die Koordinaten des Rechtecks enthält, das das Headersteuerelement belegen soll, und stellt einen Zeiger auf eine WINDOWPOS-Struktur bereit. Das Steuerelement füllt die WINDOWPOS-Struktur mit Größen- und Positionswerten aus, die zum Positionieren des Steuerelements am oberen Rand des angegebenen Rechtecks geeignet sind. Der Height-Wert ist die Summe der Höhe der horizontalen Rahmen des Steuerelements und der durchschnittlichen Höhe der Zeichen in der Schriftart, die derzeit im Gerätekontext des Steuerelements ausgewählt ist.

Wenn Sie HDM_LAYOUT verwenden möchten, um die Anfangsgröße und Position eines Headersteuerelements festzulegen, legen Sie den anfänglichen Sichtbarkeitsstatus des Steuerelements so fest, dass es ausgeblendet wird. Nachdem Sie HDM_LAYOUT gesendet haben, um die Größen- und Positionswerte abzurufen, können Sie die SetWindowPos-Funktion verwenden, um die neue Größe, Position und den neuen Sichtbarkeitsstatus festzulegen.

Items

Ein Headersteuerelement verfügt in der Regel über mehrere Headerelemente, die die Spalten des Steuerelements definieren. Sie fügen einem Headersteuerelement ein Element hinzu, indem Sie die HDM_INSERTITEM-Nachricht an das Steuerelement senden. Die Nachricht enthält die Adresse einer HDITEM-Struktur . Diese Struktur definiert die Eigenschaften des Headerelements, die eine Zeichenfolge, ein Bitmapbild, eine Anfangsgröße und einen anwendungsdefinierten LPARAM-Wert enthalten können.

Das fmt-Element der HDITEM-Struktur eines Elements kann entweder das HDF_STRING - oder HDF_BITMAP-Flag enthalten, um anzugeben, ob das Steuerelement die Zeichenfolge oder Bitmap des Elements anzeigt. Wenn Sie sowohl eine Zeichenfolge als auch eine Bitmap anzeigen möchten, erstellen Sie ein vom Besitzer gezeichnetes Element, indem Sie das fmt-Element so festlegen, dass das flag HDF_OWNERDRAW eingeschlossen wird. Die HDITEM-Struktur gibt auch Formatierungsflags an, die dem Steuerelement mitteilen, ob die Zeichenfolge oder Bitmap im Rechteck des Elements zentriert, linksbündig oder rechts ausgerichtet werden soll.

HDM_INSERTITEM gibt den Index des neu hinzugefügten Elements zurück. Sie können den Index in anderen Nachrichten verwenden, um Eigenschaften festzulegen oder Informationen über das Element abzurufen. Sie können ein Element löschen, indem Sie die HDM_DELETEITEM Nachricht verwenden und dabei den Index des zu löschenden Elements angeben.

Sie können die HDM_SETITEM Nachricht verwenden, um die Eigenschaften eines vorhandenen Headerelements und die HDM_GETITEM Nachricht festzulegen, um die aktuellen Eigenschaften eines Elements abzurufen. Verwenden Sie die HDM_GETITEMCOUNT Nachricht, um die Anzahl der Elemente in einem Headersteuerelement abzurufen.

Owner-Drawn-Headersteuerelemente

Sie können einzelne Elemente eines Headersteuerelements als besitzergezeichnete Elemente definieren. Wenn Sie dieses Verfahren verwenden, haben Sie mehr Kontrolle über die Darstellung eines Kopfzeilenelements, als sie andernfalls hätten.

Sie können die HDM_INSERTITEM Nachricht verwenden, um ein neues vom Besitzer gezeichnetes Element in ein Kopfzeilensteuerelement oder die HDM_SETITEM-Nachricht einzufügen, um ein vorhandenes Element in ein vom Besitzer gezeichnetes Element zu ändern. Beide Nachrichten enthalten die Adresse einer HDITEM-Struktur , für die der fmt-Member auf den HDF_OWNERDRAW-Wert festgelegt sein sollte.

Wenn ein Headersteuerelement ein vom Besitzer gezeichnetes Element zeichnen muss, sendet es die WM_DRAWITEM Nachricht an das übergeordnete Fenster. Der wParam-Parameter der Nachricht ist der bezeichner des untergeordneten Fensters des Headersteuerelements, und der lParam-Parameter ist eine Adresse einer DRAWITEMSTRUCT-Struktur . Das übergeordnete Fenster verwendet die Informationen in der -Struktur, um das Element zu zeichnen. Für ein vom Besitzer gezeichnetes Element in einem Headersteuerelement enthält die DRAWITEMSTRUCT-Struktur die folgenden Informationen.

Member BESCHREIBUNG
CtlType ODT_HEADER vom Besitzer gezeichneten Steuerelementtyp.
CtlID Bezeichner für untergeordnete Fenster des Headersteuerelements.
Itemid Index des zu zeichnenden Elements.
itemAction ODA_DRAWENTIRE Zeichenaktionsflag.
itemState ODS_SELECTED Zeichenaktionsflag, wenn sich der Cursor auf dem Element befindet und die Maustaste nach unten ist. Andernfalls ist dieser Member null.
hwndItem Handle mit dem Headersteuerelement.
Hdc Handle mit dem Gerätekontext des Headersteuerelements.
rcItem Koordinaten des zu zeichnenden Kopfzeilenelements. Die Koordinaten sind relativ zur oberen linken Ecke des Kopfzeilensteuerelements.
Itemdata Anwendungsdefinierter 32-Bit-Wert, der dem Element zugeordnet ist.

 

Filter für Headersteuerelemente

Durch Angeben des HDS_FILTERBAR Fensterstils für ein Headersteuerelement können Sie die Platzierung von Filterbearbeitungsfeldern unter den Spaltenüberschriften aktivieren. Neben dem Bearbeitungsfeld wird eine Filterschaltfläche angezeigt. Sie können die Filterung implementieren, indem Sie auf HDN_BEGINFILTEREDIT, HDN_ENDFILTEREDIT, HDN_FILTERBTNCLICK oder HDN_FILTERCHANGE Benachrichtigungscodes reagieren.

Standardmäßig enthält das Bearbeitungsfeld eine Aufforderung für den Benutzer, Text einzugeben. Sie können das Bearbeitungsfeld mithilfe von Header_ClearFilter oder Header_ClearAllFilters auf diesen Standardzustand wiederherstellen.

Das folgende Codebeispiel zeigt, wie Sie das Headersteuerelement aus einem Listenansicht-Steuerelement abrufen und eine Filterleiste hinzufügen.

// hList is the HWND of the list-view control.
HWND hHeader = ListView_GetHeader(hList);
LONG_PTR styles = GetWindowLongPtr(hHeader, GWL_STYLE);
SetWindowLongPtr(g_hHeader, GWL_STYLE, styles | HDS_FILTERBAR);

Standardmäßige Headersteuerelement-Nachrichtenverarbeitung

In diesem Abschnitt werden die Fenstermeldungen beschrieben, die von der Fensterprozedur für die WC_HEADER-Fensterklasse verarbeitet werden.

Nachricht Durchgeführte Verarbeitung
WM_CREATE Initialisiert das Headersteuerelement.
WM_DESTROY Hebt die Initialisierung des Headersteuerelements auf.
WM_ERASEBKGND Füllt den Hintergrund des Kopfzeilensteuerelements unter Verwendung der aktuellen Hintergrundfarbe des Steuerelements aus.
WM_GETDLGCODE Gibt eine Kombination aus den DLGC_WANTTAB - und DLGC_WANTARROWS-Werten zurück.
WM_GETFONT Gibt das Handle an die aktuelle Schriftart zurück, die vom Headersteuerelement zum Zeichnen des zugehörigen Texts verwendet wird.
WM_LBUTTONDBLCLK Erfasst Mauseingaben. Wenn sich der Mauscursor auf einer Trennlinie befindet, sendet das Steuerelement den HDN_BEGINTRACK Benachrichtigungscode und beginnt mit dem Ziehen der Trennlinie. Wenn sich der Cursor auf einem Element befindet, wird das Element im gedrückten Zustand angezeigt.
WM_LBUTTONDOWN Identisch mit der WM_LBUTTONDBLCLK-Nachricht .
WM_LBUTTONUP Gibt die Mausaufnahme frei. Wenn das Steuerelement mausbewegungen nachverfolgt hat, sendet es den HDN_ENDTRACK Benachrichtigungscode und zeichnet das Headersteuerelement neu. Andernfalls sendet das Steuerelement den HDN_ITEMCLICK Benachrichtigungscode und zeichnet das Kopfzeilenelement, auf das geklickt wurde, neu.
WM_MOUSEMOVE Wenn eine Trennlinie gezogen wird, sendet das Steuerelement den HDN_TRACK Benachrichtigungscode und zeigt das Element an der neuen Position an. Wenn die linke Maustaste nach unten und der Cursor auf einem Element angezeigt wird, wird das Element im gedrückten Zustand angezeigt.
WM_NCCREATE Ordnet eine interne Datenstruktur zu und initialisiert sie.
WM_NCDESTROY Gibt die vom Headersteuerelement zugeordneten Ressourcen frei, nachdem das Headersteuerelement nicht initialisiert wurde.
WM_PAINT Zeichnet den ungültigen Bereich des Headersteuerelements. Wenn der wParam-Parameter nicht NULL ist, geht das Steuerelement davon aus, dass der Wert ein HDC ist, und zeichnet mit diesem Gerätekontext.
WM_SETCURSOR Legt die Cursorform fest, je nachdem, ob sich der Cursor auf einer Trennlinie oder in einem Kopfzeilenelement befindet.
WM_SETFONT Wählt ein neues Schriftarthandle im Gerätekontext für das Headersteuerelement aus.