HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

Két Desktop használatát lehetővé tevő komponens


Double Desktop 2. rész

Példaprogram letöltése

9087 bájt

Ahogy az előző részben ígértük, a DoubleDesktop komponenst új lehetőségekkel egészítjük ki, melyek a következők lesznek: a Desktop-ról jobbra, vagy balra kilógó ablakok a másik Desktop-on is megjelennek, mintha átlógnának arra, valamint megadhatunk egy listát, amelyben azoknak az ablakoknak a neveit vagy osztályait sorolhatjuk fel, melyekre a komponens nem lesz hatással.
A mellékelt példaprogram megnyitása előtt a DoubleDesktopEx.pas-ban lévő komponenst telepítenie kell a Delphi alá.

Ez a cikk feltételezi az előző rész ismeretét, ezért csak a módosítások leírását tartalmazza.

Először is felveszünk egy új property-t, ami TStringList típusú, a neve ProtectedWindows. Ebben lehet felsorolni azoknak az ablakoknak a neveit, vagy osztályait (az osztályok neveit), amelyek mindkét Desktop-on láthatók. Több új property-re nem lesz szükség, de néhány eljárást illetve függvényt módosítani kell.
Létrehozunk egy rekord típust, amelyben két TList típusú objektumot tudunk tárolni. Erre azért lesz szükség, hogy az EnumDesktopWindows függvény meghívásakor két listát is át tudjunk adni az EnumWindowsProc függvénynek. Az egyik lista a már előző részben is használt, az elrejtendő ablakok azonosítóit tartalmazó lista (List). A második azoknak az ablakoknak az azonosítóit fogja tartalmazni, amelyeket nem kell elrejteni (ProtList).
  TEnumInfo = record
    List: TList;
    ProtList: TList;
  end;
  PEnumInfo = ^TEnumInfo;
Mivel ebben vesszük fel a Desktop és a TaskBar, valamint az OwnerAlwaysVisible property igaz értéke esetén a saját ablak azonosítóját is, ezért nem lesz szükség az előző verzióban használt globális változókra.
A ShowHideDesktopWindows eljárásban létrehozunk egy belső függvényt (AddProtectedWnd). Ez az eljárás a paraméterként megadott nevű vagy osztályú ablakok azonosítóit felveszi a ProtList objektumba. A ShowHideDesktopWindows eljárás elején a Desktop és a TaskBar ablakait mindjárt fel is vesszük erre a listára, illetve a saját alkalmazásét is, ha az OwnerAlwaysVisible property értéke igaz:
  AddProtectedWnd('Shell_TrayWnd', nil);
  AddProtectedWnd('Progman', nil);
Ezután végigmegyünk a ProtectedWindows property elemein, és azokat is felvesszük erre a listára. A property-ben megadható az ablak neve is, de ha biztosra akarunk menni, akkor érdemesebb az osztály nevét. Ez például a Jegyzettömb esetén „Notepad”.

Az EnumWindowsProc függvény is jelentősen megváltozott. Ebben az előzetes ellenőrzések után (a Handle azonosító tényleg ablakhoz tartozik-e, és az ablak látszik-e) egy ciklusban ellenőrizzük, hogy a Handle azonosító nem egy „védett” ablakhoz tartozik-e, vagyis nincs-e abban a listában, amely azoknak az ablakoknak az azonosítóját tartalmazza, melyeket nem kell elrejteni. Ha a ciklus végén az ok logikai változó értéke hamis, akkor az ablakot nem rejtjük el, vagyis nem vesszük fel az elrejtendő ablakok listájára (List). Ellenkező esetben megvizsgáljuk, hogy az ablak nem lóg-e ki a Desktop jobb, vagy bal oldalán. Ekkor ugyanis nem rejtjük el, hanem a képernyőről kilógó részeit tesszük láthatóvá. Ez egyben azt is eredményezi, hogy ha az ablak jobb oldala lógott ki a képernyőből, akkor most a bal oldalra fog kerülni, és fordítva.
Egy TWindowInfo típusú struktúrába lekérdezzük az ablak adatait. Ez a pozíción és méreten kívül több tulajdonságot is tartalmaz, de nekünk arra is szükségünk van, hogy az ablak nincs-e maximalizálva. Ekkor ugyanis a szélei kilógnak a képernyőből, de ezt ebben az esetben nem vesszük figyelembe.
Szükségünk van még a Desktop széleinek koordinátáira, melyeket a dl (baloldali) és dr (jobboldali) változókban tároljuk el.
  dl:=Screen.DesktopLeft;
  dr:=Screen.DesktopWidth+dl-1;
Ugyanezt megtesszük az ablak széleinek koordinátáival is, melyeket a wl és wr változókban tárolunk el.
  wl:=wi.rcWindow.Left;
  wr:=wi.rcWindow.Right;
Ahhoz, hogy egy ablak nem elrejtendő, hanem „eltolandó” lesz, a következő feltételeknek kell teljesülniük:
  • az ablak bal szélének koordinátája kisebb, mint a Desktop-é, vagy
  • az ablak jobb szélének koordinátája nagyobb, mint a Dekstop-é
  • az ablak nincs maximalizálva
A forráskódban ez a következőképpen néz ki:
var
  wi: TWindowInfo;
...
  if ((wr>dr) or (wl<dl)) and ((wi.dwStyle and WS_MAXIMIZE)=0) then ...
Ha az ablak megfelel ezeknek a feltételeknek, akkor kiszámoljuk az új koordinátáit, és a SetWindoPos függvénnyel beállítjuk azt:
  if wl<0 then wl:=dr+wl else wl:=-(dr-wl);
  SetWindowPos(Handle, 0, wl, wi.rcWindow.Top, 0, 0, SWP_NOSIZE+SWP_NOZORDER);
Ha a feltétel nem teljesül, akkor az ablak azonosítóját hozzáadjuk a List objektumhoz, így az el lesz rejtve.


Cikksorozat

#IDKategóriaCikk címeSorozat
1166DelphiOsztály hierarchia lekérdezése1. rész
1180DelphiOsztály hierarchia lekérdezése2. rész


Könyv
Ez a cikk megtalálható ebben a könyvben: Delphi Software Offline 2001 évkönyv 548. 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 |