HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

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.
  r1:=0;
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;



Cikksorozat

#IDKategóriaCikk címeSorozat
3916WindowsA javascript nyelv bemutatása1. rész
3946WindowsJavascript változók és operátorok2. rész
3975WindowsKódvezérlés JScript-ben3. rész
4004WindowsFüggvények és objektumok4. rész
4036WindowsFejlett funkciók a JavaScript nyelvben5. rész
4066WindowsFejlett funkciók a JavaScript nyelvben - folytatás6. rész
4116WindowsReguláris kifejezések7. rész
4145WindowsReguláris kifejezések - folytatás8. rész


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!

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