HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

Ablak kliens területének meghatározása átméretezés nélkül


Példaprogram letöltése

5218 bájt

Egy Form vagy egy komponens kliens területének méretét megadhatjuk a ClientWidth és ClientHeight property-k segítségével. Ez a legtöbb esetben elég is, de mi van akkor, ha a komponens méretét nem, csak a kliens terület méretét szeretnénk megváltoztatni, például amikor egy Form keretének vastagságát akarjuk meghatározni, vagy egy ListBox komponensben akarunk egy fejlécet elhelyezni. Ez sem probléma, csupán a megfelelő ablak üzenetet kell felhasználni.

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.

Könyv
Ez a cikk megtalálható ebben a könyvben: Delphi Software Offline 2002 évkönyv 317. oldal

Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |