Udostępnij przez


Informacje o kontrolkach nagłówka

Kontrolka nagłówka to okno, które zwykle znajduje się powyżej kolumn tekstowych lub liczbowych. Zawiera tytuł dla każdej kolumny i można go podzielić na części. Użytkownik może przeciągnąć separatory oddzielające części, aby ustawić szerokość każdej kolumny. Poniższa ilustracja przedstawia kontrolkę nagłówka zawierającą kolumny z etykietami, które zawierają szczegółowe informacje o plikach w katalogu.

zrzut ekranu okna dialogowego z trzema kolumnami sterowania nagłówkiem

Kontrolkę nagłówka można utworzyć przy użyciu funkcji CreateWindowEx, określając klasę okna WC_HEADER i odpowiednie style kontrolki nagłówka . Ta klasa okna jest rejestrowana, gdy biblioteka DLL wspólnych kontrolek zostanie załadowana. Aby upewnić się, że ta biblioteka DLL jest załadowana, użyj funkcji InitCommonControlsEx. Po utworzeniu kontrolki nagłówka można podzielić ją na części, ustawić tekst w każdej części i kontrolować wygląd okna przy użyciu komunikatów okna nagłówka.

Kontrolkę nagłówka można utworzyć jako okno podrzędne innej kontrolki, na przykład pole listy. Jednak kontrolka nadrzędna nie jest świadoma kontrolki nagłówka i nie uwzględnia miejsca zajętego przez nagłówek, co skutkuje tym, że elementy listy będą wyświetlane za nagłówkiem. Jeśli chcesz użyć kontrolki nagłówka w polu listy lub innej kontrolce, kontrolka nadrzędna musi być rysowana przez właściciela, aby wszystkie elementy zostały wyświetlone we właściwej pozycji.

Kontrolki widoku listy mają już kontrolki nagłówka. Zamiast tworzyć kontrolkę nagłówka dla kontrolki widoku listy, należy użyć LVM_GETHEADER lub ListView_GetHeader, aby pobrać istniejącą kontrolkę.

Rozmiar i położenie kontrolki nagłówka

Zazwyczaj należy ustawić rozmiar i położenie kontrolki nagłówka, aby mieścić się w granicach określonego prostokąta, takiego jak obszar klienta okna. Za pomocą komunikatu HDM_LAYOUT można pobrać odpowiednie wartości rozmiaru i położenia z kontrolki nagłówka.

Podczas wysyłania HDM_LAYOUTnależy określić adres struktury HDLAYOUT, która zawiera współrzędne prostokąta przeznaczonego dla kontrolki nagłówka i dostarcza wskaźnik do struktury WINDOWPOS. Kontrolka wypełnia strukturę WINDOWPOS z wartościami rozmiaru i położenia odpowiednimi do pozycjonowania kontrolki u góry określonego prostokąta. Wartość wysokości jest sumą wysokości obramowań poziomych kontrolki oraz średniej wysokości znaków w czcionce aktualnie wybranej w kontekście urządzenia kontrolki.

Jeśli chcesz użyć HDM_LAYOUT, aby ustawić początkowy rozmiar i położenie kontrolki nagłówka, ustaw początkowy stan widoczności kontrolki, aby był ukryty. Po wysłaniu HDM_LAYOUT w celu pobrania wartości rozmiaru i pozycji można użyć funkcji SetWindowPos, aby ustawić nowy rozmiar, położenie i stan widoczności.

Elementy

Kontrolka nagłówka zwykle zawiera kilka elementów nagłówka, które definiują kolumny kontrolki. Element można dodać do kontrolki nagłówka, wysyłając komunikat HDM_INSERTITEM do kontrolki. Komunikat zawiera adres struktury HDITEM. Ta struktura definiuje właściwości elementu nagłówka, które może zawierać ciąg znaków, obraz bitmapowy, rozmiar początkowy i wartość LPARAM zdefiniowaną przez aplikację.

Element fmt elementu hdITEM struktury może zawierać flagę HDF_STRING lub HDF_BITMAP, aby wskazać, czy kontrolka wyświetla ciąg lub mapę bitową elementu. Jeśli chcesz wyświetlić zarówno ciąg, jak i mapę bitową, utwórz element rysowany przez właściciela, ustawiając element fmt do uwzględnienia flagi HDF_OWNERDRAW. Struktura HDITEM określa również flagi formatowania, które informują kontrolkę, czy powinna wyśrodkować, wyrównać do lewej lub do prawej ciąg lub mapę bitową w prostokącie elementu.

HDM_INSERTITEM zwraca indeks nowo dodanego elementu. Możesz użyć indeksu w innych komunikatach, aby ustawić właściwości lub pobrać informacje o elemencie. Element można usunąć przy użyciu komunikatu HDM_DELETEITEM, określając indeks elementu do usunięcia.

Możesz użyć komunikatu HDM_SETITEM, aby ustawić właściwości istniejącego elementu nagłówka i komunikat HDM_GETITEM w celu pobrania bieżących właściwości elementu. Aby pobrać liczbę elementów w kontrolce nagłówka, użyj komunikatu HDM_GETITEMCOUNT.

Kontrolki nagłówka Owner-Drawn

Poszczególne elementy kontrolki nagłówka można zdefiniować jako elementy rysowane przez właściciela. Użycie tej techniki daje ci większą kontrolę nad wyglądem elementu nagłówka, niż miałbyś bez niej.

Możesz użyć komunikatu HDM_INSERTITEM, aby wstawić nowy element wciągnięty przez właściciela do kontrolki nagłówka lub komunikat HDM_SETITEM, aby zmienić istniejący element na element rysowany przez właściciela. Oba komunikaty obejmują adres strukturyHDITEM, która powinna mieć element członkowski fmt ustawiony na wartość HDF_OWNERDRAW.

Gdy kontrolka nagłówka musi rysować element rysowany przez użytkownika, wysyła komunikat WM_DRAWITEM do okna nadrzędnego. Parametr wParam komunikatu jest identyfikatorem okna podrzędnego kontrolki nagłówka, a parametr lParam jest adresem struktury DRAWITEMSTRUCT. Okno nadrzędne używa informacji w strukturze do rysowania elementu. W przypadku elementu rysowanego przez właściciela w kontrolce nagłówka struktura DRAWITEMSTRUCT zawiera następujące informacje.

Członek Opis
CtlType ODT_HEADER typ kontrolki rysowany przez właściciela.
CtlID Identyfikator okna podrzędnego kontrolki nagłówka.
itemID Indeks elementu do narysowania.
itemAction ODA_DRAWENTIRE flaga akcji rysunku.
stanElementu ODS_SELECTED flagę akcji rysunku, jeśli kursor znajduje się na elemencie, a przycisk myszy jest wciśnięty. W przeciwnym razie ten członek wynosi zero.
hwndItem Uchwyt do kontrolki nagłówka.
hDC Uchwyt do kontekstu urządzenia kontrolki nagłówka.
rcItem Współrzędne elementu nagłówka, który ma być narysowany. Współrzędne są podawane w odniesieniu do lewego górnego rogu kontrolki nagłówka.
itemData Zdefiniowana przez aplikację wartość 32-bitowa skojarzona z elementem.

 

Filtry kontroli nagłówka

Określając styl okna HDS_FILTERBAR dla kontrolki nagłówka, można włączyć umieszczanie pól edycji filtru pod nagłówkami kolumn. Obok pola edycji zostanie wyświetlony przycisk filtru. Filtrowanie można zaimplementować, odpowiadając na kody powiadomień HDN_BEGINFILTEREDIT, HDN_ENDFILTEREDIT, HDN_FILTERBTNCLICKlub HDN_FILTERCHANGE.

Domyślnie pole edycji zawiera monit o wprowadzenie tekstu przez użytkownika. Pole edycji można przywrócić do tego stanu domyślnego przy użyciu Header_ClearFilter lub Header_ClearAllFilters.

Poniższy przykład kodu pokazuje, jak pobrać kontrolkę nagłówka z kontrolki widoku listy i dodać pasek filtru.

// 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);

Procesowanie domyślnych komunikatów kontrolki nagłówka

W tej sekcji opisano komunikaty okien, które są obsługiwane przez procedurę okna dla klasy okna WC_HEADER.

Komunikat Przetwarzanie wykonane
WM_CREATE Inicjuje kontrolkę nagłówka.
WM_DESTROY Deinitializuje kontrolkę nagłówka.
WM_ERASEBKGND Wypełnia tło kontrolki nagłówka przy użyciu bieżącego koloru tła kontrolki.
WM_GETDLGCODE Zwraca kombinację wartości DLGC_WANTTAB i DLGC_WANTARROWS.
WM_GETFONT Zwraca uchwyt do ustawionej czcionki, której używa kontrolka nagłówkowa do rysowania jego tekstu.
WM_LBUTTONDBLCLK Przechwytuje dane wejściowe myszy. Jeśli kursor myszy znajduje się na separatorze, kontrolka wysyła kod powiadomienia HDN_BEGINTRACK i rozpoczyna przeciąganie separatora. Jeśli kursor znajduje się na elemencie, element jest wyświetlany w stanie naciśniętym.
WM_LBUTTONDOWN Tak samo jak komunikat WM_LBUTTONDBLCLK.
WM_LBUTTONUP Zwalnia przechwytywanie myszy. Jeśli kontrolka śledziła ruch myszy, wysyła HDN_ENDTRACK kod powiadomienia i ponownie rysuje kontrolkę nagłówka. W przeciwnym razie kontrolka wysyła kod powiadomienia HDN_ITEMCLICK i ponownie rysuje element nagłówka, który został kliknięty.
WM_MOUSEMOVE Jeśli element dzielący jest przeciągany, kontrolka wysyła kod powiadomienia HDN_TRACK i wyświetla element w nowej pozycji. Jeśli lewy przycisk myszy jest w dół, a kursor znajduje się na elemencie, element jest wyświetlany w stanie naciśniętym.
WM_NCCREATE Przydziela i inicjuje wewnętrzną strukturę danych.
WM_NCDESTROY Zwalnia zasoby przydzielone przez kontrolkę nagłówka po jej zainicjowaniu.
WM_PAINT Maluje nieprawidłowy region kontrolki nagłówka. Jeśli parametr wParam nie jest NULL, kontrola przyjmuje, że wartość to HDC i rysuje, używając tego kontekstu urządzenia.
WM_SETCURSOR Ustawia kształt kursora w zależności od tego, czy kursor znajduje się na dzielniku, czy w elemencie nagłówka.
WM_SETFONT Wybiera nowy uchwyt czcionki w kontekście urządzenia dla kontrolki nagłówka.