Megosztás:


Tudnivalók a fejlécvezérlőkről

A fejlécvezérlő egy ablak, amely általában szöveg- vagy számoszlopok felett helyezkedik el. Minden oszlophoz tartalmaz egy címet, és részekre osztható. A felhasználó az egyes oszlopok szélességének beállításához húzhatja a részeket elválasztó elválasztó elemeket. Az alábbi ábrán egy fejlécvezérlő látható, amely címkézett oszlopokkal rendelkezik, amelyek részletes információkat nyújtanak a címtárban lévő fájlokról.

képernyőfelvétel egy párbeszédpanelről egy háromoszlopos fejlécvezérlővel

Fejlécvezérlőt a CreateWindowEx függvénnyel hozhat létre, megadva a WC_HEADER ablakosztályt és a megfelelő fejlécvezérlő stílusokat. Ez az ablakosztály a közös vezérlő DLL betöltésekor van regisztrálva. A DLL betöltésének ellenőrzéséhez használja az InitCommonControlsEx függvényt. Miután létrehozott egy fejlécvezérlőt, részekre oszthatja, az egyes részekben beállíthatja a szöveget, és élőfejablak-üzenetekkel szabályozhatja az ablak megjelenését.

Az fejlécvezérlő létrehozható egy másik vezérlőelem, például egy listamező, gyermekablakaként. A szülő vezérlőelem azonban nincs tisztában a fejléc vezérlőelemmel, és nem veszi figyelembe a fejléc által foglalt területet, aminek következtében a listaelemek megjelennek a fejléc mögött. Ha fejléc vezérlőelemet szeretne használni egy listamezőben vagy más vezérlőelemben, a szülő vezérlőelemnek tulajdonosi rajzolásúnak kell lennie, hogy az összes elem a megfelelő helyen jelenjen meg.

A listanézet vezérlői már rendelkeznek fejlécvezérlőkkel. A listanézet-vezérlők fejlécvezérlőjének létrehozása helyett LVM_GETHEADER vagy ListView_GetHeader használatával kéri le a meglévő vezérlőt.

Fejlécvezérlő mérete és pozíciója

A fejlécvezérlő méretét és pozícióját általában úgy kell beállítania, hogy elférjen egy adott téglalap határain belül, például egy ablak ügyfélterületén. A HDM_LAYOUT üzenet használatával lekérheti a megfelelő méret- és pozícióértékeket a fejlécvezérlőből.

A HDM_LAYOUTküldésekor meg kell adnia egy HDLAYOUT szerkezet címét, amely tartalmazza a fejlécvezérlő által elfoglalt téglalap koordinátáit, és egy WINDOWPOS struktúrára mutató mutatót biztosít. A vezérlő kitölti a WINDOWPOS szerkezetet a vezérlőelemnek a megadott téglalap tetején való elhelyezéséhez megfelelő méret- és pozícióértékekkel. A magasságérték a vezérlőelem vízszintes szegélyeinek magasságát és a karakterek átlagos magasságát adja meg a vezérlőelem eszközkörnyezetében jelenleg kijelölt betűtípusban.

Ha a HDM_LAYOUT szeretné beállítani egy fejlécvezérlő kezdeti méretét és pozícióját, állítsa be a vezérlő kezdeti láthatósági állapotát úgy, hogy az rejtett legyen. Miután elküldte a HDM_LAYOUT a méret- és pozícióértékek lekéréséhez, a SetWindowPos függvénnyel állíthatja be az új méretet, pozíciót és láthatósági állapotot.

Elemek

A fejlécvezérlők általában több olyan fejlécelemet tartalmaznak, amelyek meghatározzák a vezérlőelem oszlopait. Egy elemet ad hozzá egy fejlécvezérlőhöz, ha a HDM_INSERTITEM üzenetet küldi el a vezérlőnek. Az üzenet egy HDITEM--struktúra címét tartalmazza. Ez a struktúra határozza meg a fejlécelem tulajdonságait, amelyek tartalmazhatnak sztringet, bitleképet, kezdeti méretet és alkalmazás által definiált LPARAM értéket.

Az elem HDITEM szerkezetének fmt tagja a HDF_STRING vagy HDF_BITMAP jelzővel jelezheti, hogy a vezérlő megjeleníti-e az elem sztringjét vagy bitképét. Ha sztringet és bitképet is meg szeretne jeleníteni, hozzon létre egy tulajdonos által rajzolt elemet úgy, hogy a fmt tagot úgy állítja be, hogy az tartalmazza a HDF_OWNERDRAW jelzőt. A HDITEM struktúra formázási jelzőket is meghatároz, amelyek jelzik a vezérlőelemnek, hogy középre, balra vagy jobbra igazítsa-e a sztringet vagy a bitképet az elem téglalapjában.

HDM_INSERTITEM az újonnan hozzáadott elem indexét adja vissza. Az indexet más üzenetekben is használhatja tulajdonságok beállításához vagy az elem adatainak lekéréséhez. Egy elemet a HDM_DELETEITEM üzenet használatával törölhet, megadva a törölni kívánt elem indexét.

A HDM_SETITEM üzenettel beállíthatja egy meglévő fejlécelem tulajdonságait, a HDM_GETITEM üzenet pedig lekérheti egy elem aktuális tulajdonságait. A fejlécvezérlő elemeinek számának lekéréséhez használja a HDM_GETITEMCOUNT üzenetet.

Owner-Drawn fejlécvezérlők

A fejléc vezérlőelem egyes elemeit megadhatja tulajdonos által rajzolt elemeknek. Ezzel a technikával jobban szabályozhatja a fejlécelemek megjelenését, mint egyébként.

A HDM_INSERTITEM üzenettel új, tulajdonos által rajzolt elemet szúrhat be egy fejlécvezérlőbe, vagy a HDM_SETITEM üzenettel egy meglévő elemet tulajdonos által rajzolt elemgé alakíthat. Mindkét üzenet egy HDITEM--struktúra címét tartalmazza, amelynek fmt mezőjét a HDF_OWNERDRAW értékre kell állítsa.

Ha egy fejléc vezérlőelemnek meg kell rajzolnia egy tulajdonos által rajzolt elemet, a WM_DRAWITEM üzenetet küldi a szülőablakba. Az üzenet wParam paramétere a fejlécvezérlő gyermekablak-azonosítója, az lParam paraméter pedig egy DRAWITEMSTRUCT struktúra címe. A szülőablak a struktúra információi alapján rajzolja meg az elemet. A fejléc vezérlőelemben lévő tulajdonos által rajzolt elem esetében a DRAWITEMSTRUCT struktúra a következő információkat tartalmazza.

Tag Leírás
CtlType ODT_HEADER tulajdonos által rajzolt vezérlőtípus.
CtlID A fejlécvezérlő gyermekablak-azonosítója.
tételazonosító A megrajzolandó elem indexe.
itemAction ODA_DRAWENTIRE rajzműveleti jelző.
tételállapot ODS_SELECTED rajzolási művelet zászlaja, ha a kurzor az elemen van, és az egérgomb le van nyomva. Ellenkező esetben ez a tag nulla.
hwndItem Fogópont a fejléc vezérlőelemhez.
hDC Kezelje a fejlécvezérlő eszközkörnyezetét.
rcItem A megrajzolandó fejlécelem koordinátái. A koordináták a fejléc vezérlőelem bal felső sarkához viszonyítva vannak.
itemData Az elemhez társított alkalmazás által definiált 32 bites érték.

 

Fejlécvezérlő szűrők

A fejlécvezérlő HDS_FILTERBAR ablakstílusának megadásával engedélyezheti a szűrő szerkesztési mezőinek elhelyezését az oszlopfejlécek alatt. Megjelenik egy szűrőgomb a szerkesztési mező mellett. A szűrést HDN_BEGINFILTEREDIT, HDN_ENDFILTEREDIT, HDN_FILTERBTNCLICKvagy HDN_FILTERCHANGE értesítési kódokra válaszolva valósíthatja meg.

Alapértelmezés szerint a szerkesztési mező egy, a felhasználónak a szöveg megadására vonatkozó kérést tartalmaz. A szerkesztési mezőt az alapértelmezett állapotba állíthatja vissza Header_ClearFilter vagy Header_ClearAllFiltershasználatával.

Az alábbi kódpéldából megtudhatja, hogyan kérdezheti le a fejlécvezérlőt egy listanézet-vezérlőből, és hogyan adhat hozzá szűrősávot.

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

Alapértelmezett fejlécvezérlő üzenetfeldolgozása

Ez a szakasz a WC_HEADER ablakosztály ablakműveletei által kezelt ablaküzeneteket ismerteti.

Üzenet Elvégzett feldolgozás
WM_CREATE Inicializálja a fejlécvezérlőt.
WM_DESTROY Nem inicializálja a fejlécvezérlőt.
WM_ERASEBKGND Kitölti a fejlécvezérlő hátterét a vezérlő aktuális háttérszínével.
WM_GETDLGCODE A DLGC_WANTTAB és DLGC_WANTARROWS értékek kombinációját adja vissza.
WM_GETFONT A fogópontot az aktuális betűtípusra adja vissza, amelyet a fejlécvezérlő a szöveg rajzolásához használ.
WM_LBUTTONDBLCLK Rögzíti az egér bemenetét. Ha az egérmutató egy elválasztón van, a vezérlő elküldi a HDN_BEGINTRACK értesítési kódot, és elkezdi húzni az elválasztót. Ha a kurzor egy elemen van, az elem megnyomott állapotban jelenik meg.
WM_LBUTTONDOWN Ugyanaz, mint a WM_LBUTTONDBLCLK üzenet.
WM_LBUTTONUP Felszabadítja az egérrögzítést. Ha a vezérlő nyomon követte az egér mozgását, elküldi a HDN_ENDTRACK értesítési kódot, és újrarajzozza a fejlécvezérlőt. Ellenkező esetben a vezérlő elküldi a HDN_ITEMCLICK értesítési kódot, és újrarajzozza a kattintott fejlécelemet.
WM_MOUSEMOVE Ha egy elválasztó húzása történik, a vezérlő elküldi a HDN_TRACK értesítési kódot, és megjeleníti az elemet az új pozícióban. Ha a bal egérgomb le van kapcsolva, és a kurzor egy elemen van, az elem megnyomott állapotban jelenik meg.
WM_NCCREATE Belső adatstruktúra lefoglalása és inicializálása.
WM_NCDESTROY Felszabadítja a fejlécvezérlő által lefoglalt erőforrásokat, miután a fejlécvezérlő nem inicializálódott.
WM_PAINT A fejlécvezérlő érvénytelen területét festi. Ha a wParam paraméter nem NULL, a vezérlő feltételezi, hogy az érték egy HDC, és azzal az eszközkörnyezettel rajzol.
WM_SETCURSOR Beállítja a kurzor alakzatát, attól függően, hogy elválasztón vagy fejléceleven van-e a kurzor.
WM_SETFONT Új betűtípus-leírót jelöl ki az eszközkörnyezetben a fejlécvezérlőhöz.