
A mellékelt példaprogram megnyitása előtt a HeaderListBox.pas-ban lévő komponenst telepítenie kell a Delphi alá. Ehhez válassza a Component - Install Component menüpontot.
A példában egy olyan ListBox komponenst készítünk, amelynek a felső részén az első elem helyén egy tetszőleges feliratot jeleníthetünk meg, tetszőleges háttérszínnel. Ehhez azt kell megoldanunk, hogy a kliens területet (amire a lista elemeit rajzolja) lejjebb toljuk. Ehhez a WM_NCCALCSIZE üzenethez kell készítenünk egy üzenetkezelő eljárást:
procedure WMNcCalcSize(var Message: TWMNcCalcSize); message WM_NCCALCSIZE;
Az eljárás paramétereként kapunk egy TWMNcCalcSize típusú struktúrát, ami a következőképpen néz ki:
TWMNCCalcSize = packed record
Msg: Cardinal;
CalcValidRects: BOOL;
CalcSize_Params: PNCCalcSizeParams;
Result: Longint;
end;
Az Msg mezőben az üzenet kódja található (WM_NCCALCSIZE). Ha a CalcValidRects mező értéke igaz, akkor az alkalmazásnak meg kell határoznia az érvényes kliens területet, ellenkező esetben nem. Ha igaz, akkor a CalcSize paraméterben egy pointert kapunk egy TNCCalcSizeParams struktúrára, ellenkező esetben pedig egy TRect struktúrára. Ez utóbbi esetben a TRect struktúra az ablak ajánlott koordinátáit (ami egyben a méretét is meghatározza) tartalmazza. Ebben a struktúrában adhatjuk meg a kliens terület koordinátáit képernyő koordinátákban.
A TNCCalcSizeParams struktúra a következőképpen néz ki:
tagNCCALCSIZE_PARAMS = packed record
rgrc: array[0..2] of TRect;
lppos: PWindowPos;
end;
TNCCalcSizeParams = tagNCCALCSIZE_PARAMS;
Az rgrc mező egy tömb, ami három TRect struktúrát tartalmaz. Az első struktúrában az ablak elmozgatás (átméretezés) utáni (jelenlegi) koordinátáit találjuk meg. A második struktúra tartalmazza az ablak jelenlegi, vagyis az elmozgatás előtti koordinátáit. A harmadik struktúra tartalmazza a kliens terület koordinátáit.
Az lppos mező egy TWindowPos struktúrára mutató pointer. Ez a struktúra a következőképpen néz ki:
tagWINDOWPOS = packed record
hwnd: HWND;
hwndInsertAfter: HWND;
x: Integer;
y: Integer;
cx: Integer;
cy: Integer;
flags: UINT;
end;
TWindowPos = tagWINDOWPOS;
A hwnd mező az ablak leíróját tartalmazza. A hwndInsertAfter mező annak az ablaknak a leírója, ami Z-Order közvetlenül az ablak mögött van. Az x és y az ablak bal felső sarkának koordinátáit határozza meg, a cx és cy mezők pedig a szélességet és a magasságot. A flag mezőben a ShowWindow függvénynél használható tulajdonságokat tartalmazza.
Arról is gondoskodnunk kell, hogy a felszabadult területre kirajzoljuk a lista fejlécét, amit a WM_PAINT üzenetnél tudunk megtenni.