|
|
Két Desktop használatát lehetővé tevő komponens
Double Desktop 1. rész
|
|
Példaprogram letöltése
13855 bájt
|
Ha valaki kisebb monitorral rendelkezik, akkor gyakran szembesülhet azzal a ténnyel, hogy a mai alkalmazások futtatásához ezek mérete nem felel meg a követelményeknek. Egy lehetséges megoldás lehet azonban a két Desktop alkalmazása, amik között egy billentyűvel válthatunk.
A mellékelt példaprogram megnyitása előtt a DoubleDesktop.pas-ban lévő komponenst telepítenie kell a Delphi alá.
Egy trükköt fogunk alkalmazni, ugyanis szó sincs arról, hogy még egy Dekstop-ot létrehozunk. A trükk abban áll, hogy amikor a komponens Swap metódusát meghívjuk (vagy a Desktop property-jét megváltoztatjuk) akkor a Dekstop-on lévő ablakokat elrejtjük, de közben el is tároljuk ezek azonosítóit (Handle). Amikor újra meghívjuk a metódust, a listában eltárolt ablakokat megjelenítjük, amelyek pedig láthatók voltak, elrejtjük. Ezt a műveletet a ShowHideDesktopWindows eljárás végzi el.
Van néhány ablak, amelyet nem szabad elrejteni, például az, amelyen az ikonok találhatók, és a TaskBar ablak a Start menüvel. Ezek azonosítóját eltároljuk egy-egy globális változóban. Az azonosítót a FindWindow függvénnyel kérdezhetjük le, paraméterként megadva az osztályok nevét:
FTrayWnd:=FindWindow('Shell_TrayWnd', nil);
FProgmanWnd:=FindWindow('Progman', nil);
Az OwnerAlwysVisible property-ben beállíthatjuk, hogy az ablak, amelyikre a komponenst helyeztük látható maradjon-e. Ha igen (a property értéke igaz), akkor az FOwnerWnd globális változóban eltároljuk ennek az azonosítóját is.
A látható ablakok azonosítóit egy TList típusú listában fogjuk tárolni (clist). A listát az EnumDesktopWindows függvénnyel készítjük el. Ennek viszont szüksége van a Desktop azonosítójára, amit a GetThreadDesktop függvénnyel kérdezünk le:
var
hd: HDESK;
...
hd:=GetThreadDesktop(GetCurrentThreadId);
Az EnumDesktopWindows függvény második paramétere egy függvény címe, amely minden ablaknál lefut. Ez az EnumWindowsProc függvény, erről lejjebb még lesz szó.
A harmadik paraméter egy 4 bájtos érték, ami tulajdonképpen egy pointer is lehet. Mi ezt arra használjuk fel, hogy a clist objektumot átadjuk az EnumWindowsProc függvénynek.
Az EnumWindowsProc függvény első paraméterként megkapja a soron következő ablak Handle azonosítóját. A második paraméter az az érték, amit az EnumDesktopWindows eljárás utolsó paramétereként adtunk meg.
Ebben a függvényben ellenőrizzük, hogy a Handle azonosító nem olyan ablakhoz tartozik-e, amit nem kell elrejteni. Ezek azok, amelyek azonosítója az FOwnerWnd, FTrayWnd és FProgmanWn globális változókban van eltárolva, illetve arra is ügyelünk, hogy csak a látható ablakokat rejtsük el. Ez utóbbit az IsWindowVisible függvénnyel kérdezzük le. Ha az ablak megfelel a feltételeknek, akkor az azonosítóját hozzáadjuk a listához:
if ... then TList(list).Add(Pointer(Handle));
A ShowHideDesktopWindows eljárásban tovább haladva a következő művelet a ShowAllWindows eljárás meghívása. Ez a public részben van deklarálva, és az összes, az FList objektumban (TList) tárolt azonosítójú ablakot megjeleníti. Ezzel tulajdonképpen az összes alkalmazás ablaka látható lesz. Ezzel együtt törli is az FList objektum tartalmát.
Ezután már csak át kell másolni a clist objektumból az FList objektumba az azonosítókat, és az ablakokat el kell rejteni. Ez egy ciklusban történik.
Az ablakok elrejtése és megjelenítése a ShowWindow függvénnyel történhet. Ennek első paramétere az ablak azonosítója, a második pedig az SW_HIDE, vagy az SW_SHOW, attól függően, hogy elrejteni, vagy megjeleníteni szeretnénk-e.
A második részben további lehetőségekkel ruházzuk fel a komponenst. Ilyen lesz például az, hogy egy ablakot „áttolhatunk” a másik Desktopra. Így ha átváltunk a másik Desktop-ra, akkor az ablaknak az a része fog látszani, ami a másik Desktop-ból kilógott.
|
Könyv
Ez a cikk megtalálható ebben a könyvben:
Delphi Software Offline 2001 évkönyv 525. 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!
|