HyperLink


Bejelentkezés
E-mail: 
Jelszó: 






Skip Navigation Links
 

Átlátszó TEdit komponens


Példaprogram letöltése

39645 bájt

Mellékelt példában egy olyan TEdit komponenst készítünk, melynek háttere átlátszó abban az esetben, ha a komponens nem birtokolja a fókuszt. Így például, ha egy háttérképet helyezünk a TEdit-ek mögé, akkor ez látszik a TEdit területén is, és a komponensnek csak a körvonala, illetve a benne lévő szöveg jelenik meg.
A mellékelt példaprogram megnyitása előtt a TransparentEdit.pas-ban lévő komponenst telepítenie kell a Delphi alá.

A komponens a TEdit-ből származik. Kiegészítjük egy új property-vel, mely logikai típusú és Transparent névre hallgat. Ennek állításával változtathatjuk, hogy a komponensünk területe átlátszó legyen-e vagy sem.

Amikor állítjuk ezt a property-t, akkor kerül meghívásra a SetTransparent eljárás. Itt egy RecreateWnd hívásával újra generáltatjuk az TEdit ablakát.
procedure TTransparentEdit.SetTransparent
    (const Value: boolean);
begin
  FTransparent:=Value;
  RecreateWnd;
end;
Amikor ez bekövetkezik, akkor kerül meghívásra a CreateParams, komponensünk által is felülírt metódusa. Itt a komponens stílusához hozzáadjuk a WS_EX_TRANSPARENT értéket, abban az esetben, ha a Transparent property igaz értékre van állítva.

Amikor a komponens birtokolja a fókuszt, akkor ideiglenesen meg kell szüntetnünk a komponens átlátszóságát. Erre azért van szükségünk, mert a szöveg szerkesztésekor átlátszó háttér esetén nem kerül a háttér törlésre, így a begépelt szöveg is olvashatatlan lesz egy idő után.

A fókusz változásának figyelése érdekében felülírjuk a DoEnter és DoExit metódusokat. Ezek akkor kerülnek meghívásra, amikor a felhasználó belép a komponensbe, illetve elhagyja azt. Ekkor egy FExit belső logikai változónak értéket adunk, hogy a későbbiek folyamán is tudomásunk legyen arról, hogy a komponensünk aktív vagy sem. Egyúttal intézkedünk arról is, hogy a komponens háttere átlátszó legyen-e vagy sem.

A helyes működés érdekében még néhány eseményt kezelnie kell a komponensünknek. Ilyen a WM_ERASEBKGND, mely akkor jön létre, amikor az objektumunk hátterét törölni kell.

Ebben az esetben, ha a Transparent property igaz értéket tartalmaz és a komponensünk nem birtokolja a fókuszt, akkor meghívjuk a belsőleg létrehozott RedrawInvalidate eljárásunkat, különben az inherited kulcsszóval aktivizáljuk a komponens eredeti WM_ERASEBKGND üzenet kezelőjét, mely az aktuális ablak színnel törli annak hátterét.

Nézzük mit is tesz a RedrawInvalidate. Ebben az esetben átlátszó háttérre van szükségünk, de a komponens kerete azért látható kell, hogy legyen.

Ennek érdekében meghatározzuk a komponens kliens területének mértékét, majd a RedrawWindow segítségévével egy keretet rajzolunk erre a területre.
procedure TTransparentEdit.RedrawInvalidate;
var
  r: TRect;
begin
  if Assigned(Parent) and FTransparent and FExit then begin
    r:=ClientRect;
    r.TopLeft:=Parent.ScreenToClient(ClientToScreen(r.TopLeft));
    r.BottomRight:=Parent.ScreenToClient(
          ClientToScreen(r.BottomRight));
    RedrawWindow(Handle, nil, 0, RDW_FRAME+RDW_INVALIDATE);
  end;
end;


Könyv
Ez a cikk megtalálható ebben a könyvben: Delphi Software Offline 2000 évkönyv 429. 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-2010 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |