|
|
|
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!
|