Delphi - Nyomógombok egy Form fejlécén

forráskód letöltése
Mellékelt példában egy komponenst hozunk létre, melynek segítségével képesek leszünk nyomógombokat elhelyezni egy TForm fejlécén.

Ehhez a gombokhoz ezek után rendelhetünk szöveget vagy képet, de akár mindkettőt egyszerre is. A mellékelt példaprogram megnyitása előtt a CaptionButton.pas-ban lévő komponenst telepítenie kell a Delphi alá.

A gomb láthatóságát a Visible property-vel szabályozhatjuk.

Méreteinek beállításához a Width és Height property-ket használhatjuk. A komponens magassága nem lehet nagyobb, mint a Form fejlécének magassága.

A gomb helyzetét a Right property-vel szabályozhatjuk. Itt pixelben adhatjuk meg, hogy mekkora legyen a Form jobb szélétől számított távolsága a nyomógombnak.

A nyomógomb szövegét a Caption property-n keresztül adhatjuk meg, míg hogy milyen kép legyen a gombon, azt a Bitmap property-n keresztül.

A gomb szövegéhez a Font property-ben megadott betűtípust használja a komponens.

Ha az AutoSize property igaz, akkor a Width property-nek az értéke automatikusan akkora lesz, hogy a Caption-ban megadott szöveg teljes mértékben látható legyen.

Amikor a felhasználó kattint a gombon, akkor jön létre az OnClick esemény.



Nézzük most a komponens működését.

Létrehozáskor a konstruktorban lecseréljük a Form ablakkezelő eljárását a komponensben létrehozott NewWndProc eljárásra. Ettől kezdve a Form minden üzenetét megkapja a komponensünk is, amire szükség is lesz, hiszen csak így tudja kezelni a komponensünk a Form fejlécét.

Létrehozunk egy RedrawButton eljárást, mely a gomb kirajzolását végzi. Ha ez az eljárás igaz értéket kap, akkor egy lenyomott állapotban lévő gombot rajzol, különben felengedettet.

A gomb rajzolásához a DrawFrameControl Windows függvényt használjuk fel. Ezután már csak az esetlegesen megadott kép másolása és a szöveg kiírása van hátra.

Rajzoláshoz létrehozunk egy TCanvas-t, melyhez a Form fejlécét rendeljük hozzá, így arra tetszőleges grafikát elhelyezhetünk.

Ennek a grafikának az életre keltését, vagyis a gomb működését a NewWndProc-ban valósítjuk meg.

Itt, ha CM_TEXTCHANGED, WM_NCPAINT, WM_NCACTIVATE üzenetek egyike érkezik, akkor kell rajzolnunk a gombot alapállapotban.

Amikor a WM_NCHITTEST üzenet érkezik, akkor kell eldöntenünk, hogy az egér a gomb területe felett jár-e. Ha igen és ráadásul az egér gombja le is van nyomva, akkor frissítenünk kell a kirajzolt grafikát. Hogy az egér gombja mikor van lenyomva, azt a WM_NCLBUTTONDOWN és WM_NCLBUTTONUP üzenetek figyelésével oldhatjuk meg. Ekkor a globális FButtonDown logikai változóba eltároljuk, hogy gomb lenyomott-e vagy sem.