|
|
Mozgatható átlátszó ablak készítése
|
|
Példaprogram letöltése
7896 bájt
|
Készítünk egy olyan alkalmazást, amelyben a Form-ot átlátszóvá tehetjük úgy, hogy annak területe mögött a háttérben futó alkalmazás látszik, míg a Form-on csak a rajta lévő komponensek lesznek láthatóak. A Form mozgatható is ebben az állapotban, így az átlátszó terület folyamatosan az aktuális képet mutatja.
A Button1 lenyomására átlátszó lesz a Form, míg a Button2-vel visszaállíthatjuk az eredeti állapotot.
A megoldás elve a következő: készítünk egy új régiót, melyet alkalmazunk a Form-on. Ebben a régióban csak a Form fejléce, illetve a rajta lévő komponensek lesznek láthatóak. Ezt úgy érjük el, hogy kiindulunk egy üres régióból, majd ehhez folyamatosan hozzáadjuk azokat a téglalap régiókat, melyek területe az egyes komponensek területét fedi. A folyamat végére elő áll a kívánt régió.
procedure TForm1.Button1Click(Sender: TObject);
…
Kezdjük tehát egy üres, null régióval.
Szükség lesz egy ciklusra, mely végigmegy a Form-on lévő összes komponensen.
for i:=0 to ControlCount-1 do begin
Lekérdezzük mindegyik komponens befoglaló téglalapjának méretét.
rect:=Controls[i].BoundsRect;
Majd ezt a méretet konvertáljuk a képernyő és kliens terület közötti értéken.
OffsetRect(rect, ClientOrigin.x-Left, ClientOrigin.y-top);
Ebből a téglalapból előállítunk egy régiót a CreateRectRgnIndirect függvény hívásával.
r2:=CreateRectRgnIndirect(rect);
Ha a ciklusmag most fut először, akkor ez lesz az első régió.
if r1=0 then begin
r1:=r2;
end else begin
Ha már nem null régióval dolgozunk, akkor a CombineRgn hívásával az eddigi régiókhoz hozzáadjuk a mostani régiót is.
CombineRgn(r1, r1, r2, RGN_OR);
Ezek után törölhetjük az átmenetileg létrehozott régiót.
DeleteObject(r2);
end;
end;
A ciklus végén a Form fejlécének mérete alapján még egy újabb régiót is hozzáadunk az eddigiekhez, hogy a fejléc is látható maradjon. Szintén itt vesszük figyelembe, hogy a Form-on található-e menürendszer. Ha igen, akkor természetesen ezt is meghagyjuk láthatónak.
r2:=CreateRectRgn(0, 0, Width, GetSystemMetrics(SM_CYCAPTION)+GetSystemMetrics(SM_CYSIZEFRAME)
+GetSystemMetrics(SM_CYMENU)*Ord(Menu<>nil));
CombineRgn(r1, r1, r2, RGN_OR);
DeleteObject(r2);
Legvégső lépésként a létrehozott új régiót kényszerítjük rá a Form-ra, melynek ezután csak ott lesznek látható részei, ahol annak területén komponens is található.
SetWindowRgn(Handle, r1, true);
end;
Fenti hatás megszüntetésének módja egyszerűbb. A megoldás hasonló: most is egy régiót húzunk rá a Form-ra, viszont most egy egyszerű téglalapból állót, mely lefedi a teljes Form-ot és így láthatóvá válik annak minden részlete.
procedure TForm1.Button2Click(Sender: TObject);
var
r1: HRGN;
begin
r1:=CreateRectRgn(0, 0, Width, Height);
SetWindowRgn(Handle, r1, true);
end;
|
Könyv
Ez a cikk megtalálható ebben a könyvben:
Delphi Software Offline 2001 évkönyv 582. 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!
|