Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Ez az áttekintés az ablakok olyan funkcióit ismerteti, mint az ablaktípusok, az állapotok, a méret és a pozíció.
- Ablaktípusok
- Ablakok közötti kapcsolatok
- Ablak megjelenítési állapota
- Ablak mérete és pozíciója
- Ablak animációja
- Ablakelrendezés és tükrözés
- Ablak megsemmisítése
Ablaktípusok
Ez a szakasz az ablaktípusokat leíró alábbi témaköröket tartalmazza.
Átfedő ablakok
Az átfedésben lévő ablak egy felső szintű ablak (nem gyermekablak), amely címsorral, szegélyrel és ügyfélterülettel rendelkezik; az alkalmazás főablakaként szolgál. Emellett rendelkezhet ablakmenüvel, kisméretű és teljes méretű gombokkal, valamint görgetősávokkal is. A főablakként használt átfedésben lévő ablakok általában az összes összetevőt tartalmazzák.
A CreateWindowEx függvény WS_OVERLAPPED vagy WS_OVERLAPPEDWINDOW stílusának megadásával az alkalmazás átfedésben lévő ablakot hoz létre. Ha a WS_OVERLAPPED stílust használja, az ablak címsorral és szegélyrel rendelkezik. Ha a WS_OVERLAPPEDWINDOW stílust használja, az ablak címsorral, szegélyméretezéssel, ablakmenüvel, valamint kisméretű és teljes méretű gombokkal rendelkezik.
Előugró ablakok
Az előugró ablak egy speciális típusú átfedésben lévő ablak, amelyet párbeszédpanelekhez, üzenetdobozokhoz és más ideiglenes ablakokhoz használnak, amelyek az alkalmazás főablakán kívül jelennek meg. A címsorok előugró ablakok esetén nem kötelezőek; ellenkező esetben az előugró ablakok megegyeznek a WS_OVERLAPPED stílus átfedésben lévő ablakaiéval.
Előugró ablakot a CreateWindowExWS_POPUP stílusának megadásával hozhat létre. Címsor hozzáadásához adja meg a WS_CAPTION stílust. A WS_POPUPWINDOW stílussal létrehozhat egy előugró ablakot, amely szegélyt és ablakmenüt is használ. A WS_CAPTION stílust a WS_POPUPWINDOW stílussal kell kombinálni, hogy láthatóvá tegye az ablakmenüt.
Gyermek ablakok
A gyermekablakWS_CHILD stílussal rendelkezik, és a szülőablak ügyfélterületére korlátozódik. Az alkalmazások általában gyermekablakokat használnak a szülőablak ügyfélterületének funkcionális területekre való felosztásához. Gyermekablakot a CreateWindowEx függvény WS_CHILD stílusának megadásával hozhat létre.
A gyermekablaknak szülőablakkal kell rendelkeznie. A szülőablak lehet átfedésben lévő ablak, előugró ablak vagy akár egy másik gyermekablak is. A CreateWindowEx hívásakor adja meg a szülőablakot. Ha megadja a WS_CHILD stílust a CreateWindowEx alkalmazásban, de nem ad meg szülőablakot, a rendszer nem hozza létre az ablakot.
A gyermekablakok ügyfélterülettel rendelkeznek, de nincs más funkciójuk, kivéve, ha kifejezetten kérik őket. Az alkalmazások kérhetik a címsort, az ablakmenüt, a kis méretű és teljes méretű gombokat, a szegélyeket és a görgetősávokat egy gyermekablakhoz, de a gyermekablakokban nem lehet menü. Ha az alkalmazás egy menüfogópontot ad meg, akár amikor regisztrálja a gyermekablak osztályt, akár amikor létrehozza a gyermekablakot, a menüfogópont figyelmen kívül marad. Ha nincs megadva szegélystílus, a rendszer szegély nélküli ablakot hoz létre. Az alkalmazások szegély nélküli gyermekablakokkal oszthatják el a szülőablak ügyfélterületét, miközben az osztások láthatatlanok maradnak a felhasználó számára.
Ez a szakasz a gyermekablakok alábbi aspektusait ismerteti:
Elhelyezése
A rendszer mindig a szülőablak ügyfélterületének bal felső sarkához képest elhelyez egy gyermekablakot. A gyermekablak egyetlen része sem jelenik meg a szülőablak határain kívül. Ha egy alkalmazás olyan gyermekablakot hoz létre, amely nagyobb, mint a szülőablak, vagy elhelyez egy gyermekablakot, hogy a gyermekablak egy része vagy egésze a szülő határain túlnyúljon, a rendszer rögzíti a gyermekablakot; vagyis a szülőablak ügyfélterületén kívül eső rész nem jelenik meg. A szülőablakot érintő műveletek az alábbiak szerint a gyermekablakra is hatással lehetnek.
| Szülőablak | Gyermekablak |
|---|---|
| Elpusztult | Elpusztult, mielőtt a szülőablak elpusztul. |
| Rejtett | Rejtett, mielőtt a szülőablak el lenne rejtve. A gyermekablak csak akkor látható, ha a szülőablak látható. |
| Elmozdult | Áthelyezve a szülőablak kliens területével együtt. A gyermekablak feladata az ügyfélterület festése az áthelyezés után. |
| Megjelenítve | A szülőablak megjelenítése után jelenik meg. |
Nyírás
A rendszer nem vágja ki automatikusan a gyermekablakot a szülőablak ügyfélterületéről. Ez azt jelenti, hogy a szülőablak felülírja a gyermekablakot, ha bármilyen rajzolást végez a gyermekablakkal azonos helyen. A rendszer azonban kivágja a gyermekablakot a szülőablak ügyfélterületéről, ha a szülőablak WS_CLIPCHILDREN stílust használ. Ha a gyermekablak ki van vágva, a szülőablak nem húzható fölé.
A gyermekablakok átfedésben lehetnek az ügyfélterület többi gyermekablakával. Testvérablaknak nevezzük azt a gyermekablakot, amely ugyanazzal a szülőablakkal rendelkezik, mint egy vagy több gyermekablak. A testvérablakok egymás ügyfélterületén rajzolhatnak, kivéve, ha az egyik gyermekablak WS_CLIPSIBLINGS stílust használ. Ha egy gyermekablak rendelkezik ezzel a stílussal, a gyermekablakban található testvérablak bármely része ki lesz vágva.
Ha egy ablak WS_CLIPCHILDREN vagy WS_CLIPSIBLINGS stílussal rendelkezik, kisebb teljesítménycsökkenés következik be. Minden ablak rendszererőforrásokat vesz fel, ezért az alkalmazások nem használhatnak megkülönböztetés nélkül gyermekablakokat. A legjobb teljesítmény érdekében egy olyan alkalmazásnak, amelynek logikailag meg kell osztania a főablakát, a főablak ablakeljárásában kell elvégeznie a gyermekablakok használata helyett.
Kapcsolat a szülőablakkal
Az alkalmazások a SetParent függvény meghívásával módosíthatják egy meglévő gyermekablak szülőablakát. Ebben az esetben a rendszer eltávolítja a gyermekablakot a régi szülőablak ügyfélterületéről, és áthelyezi az új szülőablak ügyfélterületére. Ha SetParent egy NULL leírót ad meg, akkor az asztali ablak lesz az új szülőablak. Ebben az esetben a gyermekablak az asztalon lesz rajzolva, bármely más ablak szegélyén kívül. A GetParent függvény egy gyermekablak szülőablakának ablakkezelőjét adja vissza.
A szülőablak átadja kliens területének egy részét a gyermekablaknak, és a gyermekablak minden bemenetet erről a területről fogad. Az ablakosztálynak nem kell azonosnak lennie a szülőablak minden gyermekablakához. Ez azt jelenti, hogy egy alkalmazás kitölthet egy szülőablakot olyan gyermekablakokkal, amelyek másnak tűnnek, és különböző feladatokat hajtanak végre. A párbeszédpanelek például számos típusú vezérlőt tartalmazhatnak, amelyek mindegyike egy gyermekablak, amely különböző típusú adatokat fogad el a felhasználótól.
A gyermekablakokban csak egy szülőablak van, de a szülőnek tetszőleges számú gyermekablaka lehet. Minden gyermekablakban lehetnek gyermekablakok. Ebben az ablakláncban minden gyermekablakot az eredeti szülőablak leszármazott ablakának nevezünk. Az alkalmazások az IsChild függvénnyel derítik fel, hogy egy adott ablak egy gyermekablak vagy egy adott szülőablak leszármazott ablaka.
Az EnumChildWindows függvény egy szülőablak gyermekablakait sorolja fel. Ezután az EnumChildWindows átadja a fogópontot az egyes gyermekablakoknak egy alkalmazás által definiált visszahívási függvénynek. A rendszer az adott szülőablak leszármazott ablakait is számba fogja venni.
Messages
A rendszer közvetlenül a gyermekablak bemeneti üzeneteit továbbítja a gyermekablaknak; a rendszer nem továbbítja az üzeneteket a szülőablakban. Az egyetlen kivétel az, ha az EnableWindow függvény letiltotta a gyermekablakot. Ebben az esetben a rendszer átadja azokat a bemeneti üzeneteket, amelyek a gyermekablakba mentek volna, ehelyett a szülőablakba. Ez lehetővé teszi, hogy a szülőablak megvizsgálja a bemeneti üzeneteket, és szükség esetén engedélyezze a gyermekablakot.
A gyermekablakok egyedi egész számazonosítóval rendelkezhetnek. A gyermekablak-azonosítók fontosak a vezérlőablakok használatakor. Az alkalmazás üzenetek küldésével irányítja a vezérlő tevékenységeit. Az alkalmazás a vezérlő gyermekablak-azonosítójával irányítja az üzeneteket a vezérlőhöz. Emellett a vezérlők értesítési üzeneteket küldenek a szülőablakba. Az értesítési üzenet tartalmazza a vezérlő gyermekablak-azonosítóját, amelyet a szülő az üzenetet küldő vezérlő azonosítására használ. Az alkalmazás más típusú gyermekablakok gyermekablak-azonosítóját úgy adja meg, hogy a CreateWindowEx függvény hMenu paraméterét egy értékre állítja, nem pedig egy menüfogópontra.
Réteges ablakok
A rétegzett ablakok használata jelentősen javíthatja a teljesítményt és a vizuális effektusokat egy összetett alakzattal rendelkező ablak esetében, animálhatja az alakzatát, vagy alfa-keverési effektusokat szeretne használni. A rendszer automatikusan rétegzett ablakokat és a mögöttes alkalmazások ablakait alkotja és fóliázza újra. Ennek eredményeképpen a rétegzett ablakok zökkenőmentesen jelennek meg, az összetett ablakrégiókra jellemző villódzás nélkül. Ezenkívül a rétegzett ablakok részben áttetszőek, vagyis alfa-blendedek lehetnek.
Rétegzett ablak létrehozásához adja meg a WS_EX_LAYERED bővített ablakstílust a CreateWindowEx függvény meghívásakor, vagy hívja meg a SetWindowLong függvényt, hogy WS_EX_LAYERED az ablak létrehozása után. A CreateWindowEx hívás után a rétegzett ablak csak akkor lesz látható, ha ehhez az ablakhoz a SetLayeredWindowAttributes vagy az UpdateLayeredWindow függvény van meghívva.
Megjegyzés:
A Windows 8-tól kezdve a WS_EX_LAYERED gyermekablakokkal és felső szintű ablakokkal is használható. A korábbi Windows-verziók csak a felső szintű ablakok esetében támogatják a WS_EX_LAYERED .
Ha egy adott réteges ablak átlátszósági szintjét vagy átlátszósági színkulcsát szeretné beállítani, hívja meg a SetLayeredWindowAttributes parancsot. A hívás után a rendszer továbbra is megkérheti az ablakot, hogy rajzoljon, amikor az ablak megjelenik vagy átméreteződik. Mivel azonban a rendszer egy rétegzett ablak képét tárolja, a rendszer nem fogja megkérni az ablakot arra, hogy festsen, ha annak részeit a relatív ablak az asztalon való mozgásának eredményeként tárja fel. A régi alkalmazásoknak nem kell átstrukturálniuk a festési kódjukat, ha áttetszőségi vagy áttetszőségi effektusokat szeretnének hozzáadni egy ablakhoz, mert a rendszer átirányítja a SetLayeredWindowAttributes nevű ablakok festését a képernyőn kívüli memóriába, és újrafordítja azt a kívánt hatás elérése érdekében.
A gyorsabb és hatékonyabb animációhoz, vagy ha képpontonkénti alfa szükséges, hívja az UpdateLayeredWindow-t. Az UpdateLayeredWindow elsősorban akkor használható, ha az alkalmazásnak közvetlenül kell megadnia egy rétegzett ablak alakját és tartalmát anélkül, hogy a rendszer által a SetLayeredWindowAttributesen keresztül biztosított átirányítási mechanizmust használták volna. Az UpdateLayeredWindow használata emellett hatékonyabban használja a memóriát, mivel a rendszernek nincs szüksége az átirányított ablak képének tárolásához szükséges további memóriára. Az ablakok animálásának maximális hatékonysága érdekében hívja meg az UpdateLayeredWindow-t a rétegzett ablak pozíciójának és méretének módosításához. Vegye figyelembe, hogy a SetLayeredWindowAttributes meghívása után a későbbi UpdateLayeredWindow-hívások mindaddig sikertelenek lesznek, amíg a rétegzési stílus bit nincs törölve, és újra be nem állítható.
A rétegzett ablak találattesztelése az ablak alakján és átlátszóságán alapul. Ez azt jelenti, hogy az ablak színkulcsos vagy nulla alfaértékkel rendelkező területei átengedik az egér üzenetét. Ha azonban a rétegzett ablak WS_EX_TRANSPARENT bővített ablakstílussal rendelkezik, a rendszer figyelmen kívül hagyja a rétegzett ablak alakját, és az egéreseményeket a rétegzett ablak alatti többi ablaknak átadja.
Csak üzeneteket kezelő ablakok
A csak üzenetküldési ablak lehetővé teszi az üzenetek küldését és fogadását. Nem látható, nincs z-sorrendje, nem lehet számba venni, és nem fogad közvetítési üzeneteket. Az ablak egyszerűen üzeneteket küld.
Csak üzenetre vonatkozó ablak létrehozásához adja meg a CreateWindowEx függvény hWndParent paraméterének HWND_MESSAGE állandóját. A meglévő ablakokat csak üzenetre is módosíthatja a SetParent függvény hWndNewParent paraméterében megadott HWND_MESSAGE megadásával.
Ha csak üzenetablakokat szeretne keresni, adja meg a HWND_MESSAGE a FindWindowEx függvény hwndParent paraméterében. Emellett a FindWindowEx csak üzenettel rendelkező ablakokat és felső szintű ablakokat is keres, ha a hwndParent és a hwndChildAfter paraméter null értékű.
Ablakkapcsolatok
Az ablakok sokféleképpen kapcsolódhatnak a felhasználóhoz vagy egy másik ablakhoz. Az ablak lehet saját ablak, előtérablak vagy háttérablak. Az ablakok z-sorrendben vannak a többi ablakhoz képest. További információkért tekintse meg a következő témaköröket:
Előtér- és háttérablakok
Minden folyamat több végrehajtási szálból áll, és mindegyik szál létrehozhat ablakokat. A felhasználó által jelenleg használt ablakot létrehozó szálat előtérszálnak nevezzük, az ablakot pedig előtérablaknak. Minden más szál háttérszál, a háttérszálak által létrehozott ablakokat pedig háttérablakoknak nevezzük.
Minden szál prioritási szinttel rendelkezik, amely meghatározza a szál által kapott processzoridőt. Bár egy alkalmazás beállíthatja a szálak prioritási szintjét, az előtérszál általában valamivel magasabb prioritási szinttel rendelkezik, mint a háttérszálak. Mivel magasabb prioritással rendelkezik, az előtérszál több processzoridőt kap, mint a háttérszálak. Az előtérszál normál alapprioritása 9; a háttérszál normál alap prioritása 7.
A felhasználó egy ablakra kattintva vagy az ALT+TAB vagy AZ ALT+ESC billentyűkombinációval állítja be az előtérablakot. Ha le szeretne kérni egy kezelőt az előtérablakhöz, használja a GetForegroundWindow függvényt. Annak ellenőrzéséhez, hogy az alkalmazásablak az előtérablak-e, hasonlítsa össze az alkalmazásablak leíróját a GetForegroundWindow által visszaadottal.
Az alkalmazás a SetForegroundWindow függvénnyel állítja be az előtérablakot.
A rendszer korlátozza, hogy mely folyamatok állíthatják be az előtérablakot. A folyamat csak akkor állíthatja be az előtérablakot, ha:
- Az alábbi feltételek mindegyike igaz:
- A SetForegroundWindow meghívása asztali alkalmazáshoz, nem UWP-alkalmazáshoz vagy Windows 8-hoz vagy 8.1-hez tervezett Windows Áruházbeli alkalmazáshoz tartozik.
- Az előtérfolyamat nem tiltotta le a SetForegroundWindow hívásait a LockSetForegroundWindow függvény egy korábbi hívásával.
- Az előtérrögzítési időkorlát lejárt (lásd: SystemParametersInfoSPI_GETFOREGROUNDLOCKTIMEOUT).
- Nincsenek aktív menük.
- Emellett az alábbi feltételek közül legalább az egyik igaz:
- A hívási folyamat az előtérfolyamat.
- A hívási folyamatot az előtérben futó folyamat indította el.
- Jelenleg nincs előtérablak, így nincs előtérfolyamat.
- A hívási folyamat az utolsó bemeneti eseményt kapta.
- Az előtérfolyamat vagy a hívási folyamat hibakeresése folyamatban van.
Előfordulhat, hogy egy folyamatot megfosztanak az előtérablak beállításának jogától, még akkor is, ha megfelel ezeknek a feltételeknek.
Az előtérablak beállítására alkalmas folyamat engedélyezheti egy másik folyamat számára az előtérablak beállítását az AllowSetForegroundWindow függvény meghívásával, vagy a BroadcastSystemMessage függvény meghívásával a BSF_ALLOWSFW jelzővel. Az előtérfolyamat letilthatja a SetForegroundWindow hívásait a LockSetForegroundWindow függvény meghívásával.
Saját Windows
Egy átfedésben lévő vagy előugró ablak tulajdonosa lehet egy másik átfedésben lévő vagy előugró ablak. A tulajdonlás számos korlátozást jelent egy ablakban.
- Egy tulajdonolt ablak mindig a tulajdonosa fölött helyezkedik el a z-sorrendben.
- A rendszer automatikusan megsemmisít egy saját ablakot, amikor a tulajdonosa megsemmisül.
- A saját ablak rejtett, ha a tulajdonosa minimálisra van csökkentve.
Csak átfedésben lévő vagy előugró ablak lehet tulajdonosablak; a gyermekablak nem lehet tulajdonosablak. Egy alkalmazás úgy hoz létre egy saját ablakot, hogy a CreateWindowExhwndParent paramétereként megadja a tulajdonos ablakleíróját, amikor létrehoz egy WS_OVERLAPPED vagy WS_POPUP stílusú ablakot. A hwndParent paraméternek egy átfedésben lévő vagy előugró ablakot kell azonosítania. Ha a hwndParent azonosít egy gyermekablakot, a rendszer tulajdonjogot rendel a gyermekablak legfelső szintű szülőablakához. A saját ablak létrehozása után az alkalmazás nem tudja átadni az ablak tulajdonjogát egy másik ablaknak.
A párbeszédpanelek és az üzenetmezők alapértelmezés szerint a saját ablakok. Az alkalmazás megadja a tulajdonosi ablakot egy párbeszédpanelt vagy üzenetmezőt létrehozó függvény meghívásakor.
Az alkalmazások a GetWindow függvényt használhatják a GW_OWNER jelzővel, hogy lekérjenek egy fogópontot az ablak tulajdonosához.
Z-rendelés
Az ablak z-sorrendje az ablak pozícióját jelzi az átfedésben lévő ablakok halmában. Ez az ablakverem egy képzeletbeli tengely, a z tengely mentén van, amely a képernyőtől kifelé terjed ki. A z-sorrend tetején lévő ablak átfedésben van az összes többi ablakkal. A z-sorrend alján lévő ablakot az összes többi ablak átfedi.
A rendszer egyetlen listában tartja fenn a z-sorrendet. A z-sorrendhez hozzáadja az ablakokat attól függően, hogy azok legfelső ablakok, főszintű ablakok vagy gyermekablakok-e. A legfelső ablak átfedésben van az összes többi nem legfelső szintű ablakkal, függetlenül attól, hogy az aktív vagy az előtérablak. A legfelső ablak WS_EX_TOPMOST stílussal rendelkezik. Az összes legfelső ablak z sorrendben jelenik meg a nem legfelső szintű ablakok előtt. A gyermekablak a szülőablakkal z sorrendben van csoportosítva.
Amikor egy alkalmazás létrehoz egy ablakot, a rendszer az azonos típusú ablakok z-rendelésének tetejére helyezi. A BringWindowToTop függvénnyel az azonos típusú ablakok z-rendelésének elejére helyezheti az ablakot. A z-sorrend átrendezhető a SetWindowPos és a DeferWindowPos függvény használatával.
A felhasználó egy másik ablak aktiválásával módosítja a z-rendelést. A rendszer az aktív ablakot az azonos típusú ablakok z-sorrendjének tetejére helyezi. Amikor egy ablak a z-order elejére kerül, a gyermekablakai is oda kerülnek. A GetTopWindow függvénnyel keresheti a szülőablak összes gyermekablakát, és visszaadhatja a z-sorrendben legmagasabb gyermekablak fogópontját. A GetNextWindow függvény lekéri a fogantyút a következő vagy az előző ablakhoz a z-rendben.
Ablak megjelenítési állapota
Egy adott időpontban egy ablak lehet aktív vagy inaktív; rejtett vagy látható; és minimalizálva, maximalizálva vagy visszaállítva. Ezeket a tulajdonságokat együttesen az ablak megjelenítési állapotának nevezzük. Az ablak megjelenítési állapotát az alábbi témakörök ismertetik:
Aktív ablak
Az aktív ablak annak az alkalmazásnak a legfelső szintű ablaka, amellyel a felhasználó jelenleg dolgozik. Annak érdekében, hogy a felhasználó könnyen azonosíthassa az aktív ablakot, a rendszer a z-sorrend tetején helyezi el, és a címsor és a szegély színét a rendszer által definiált aktív ablakszínre módosítja. Csak felső szintű ablak lehet aktív ablak. Amikor a felhasználó gyermekablakkal dolgozik, a rendszer aktiválja a gyermekablakhoz társított legfelső szintű szülőablakot.
Egyszerre csak egy legfelső szintű ablak aktív a rendszerben. A felhasználó a felső szintű ablak aktiválásához kattintson rá (vagy valamelyik gyermekablakára), vagy használja az ALT+ESC vagy az ALT+TAB billentyűkombinációt. Az alkalmazás a SetActiveWindow függvény meghívásával aktivál egy legfelső szintű ablakot. Más függvények hatására a rendszer egy másik felső szintű ablakot aktiválhat, beleértve a SetWindowPos, a DeferWindowPos, a SetWindowPlacement és a DestroyWindow ablakot. Bár egy alkalmazás bármikor aktiválhat egy másik felső szintű ablakot, a felhasználó megzavarásának elkerülése érdekében ezt csak egy felhasználói műveletre válaszul teheti meg. Az alkalmazás a GetActiveWindow függvénnyel kér le egy leírót az aktív ablakhoz.
Amikor az aktiválás az egyik alkalmazás legfelső szintű ablakáról a másik felső szintű ablakára változik, a rendszer WM_ACTIVATEAPP üzenetet küld mindkét alkalmazásnak, és értesíti őket a változásról. Amikor az aktiválás egy másik felső szintű ablakra változik ugyanabban az alkalmazásban, a rendszer mindkét ablakot WM_ACTIVATE üzenetet küld.
Letiltott Windows
Egy ablak le is tiltható. A letiltott ablakok nem kapnak billentyűzet- vagy egérbemenetet a felhasználótól, de üzeneteket fogadhat más ablakokból, más alkalmazásokból és a rendszerből. Az alkalmazások általában letiltanak egy ablakot, hogy megakadályozzák a felhasználó számára az ablak használatát. Előfordulhat például, hogy egy alkalmazás inaktivál egy nyomógombot egy párbeszédpanelen, hogy a felhasználó ne válassza ki. Az alkalmazások bármikor engedélyezhetik a letiltott ablakokat; az ablak engedélyezése visszaállítja a normál bemenetet.
Alapértelmezés szerint egy ablak létrehozásakor engedélyezve van. Egy alkalmazás azonban megadhatja a WS_DISABLED stílust egy új ablak letiltásához. Az alkalmazások az EnableWindow függvénnyel engedélyezik vagy letiltják a meglévő ablakokat. A rendszer WM_ENABLE üzenetet küld egy ablaknak, amikor az engedélyezett állapota megváltozik. Az alkalmazások az IsWindowEnabled függvénnyel megállapíthatják, hogy engedélyezve van-e egy ablak.
Ha egy gyermekablak le van tiltva, a rendszer átadja a gyermek egérbemeneti üzeneteit a szülőablaknak. A szülő az üzenetekkel határozza meg, hogy engedélyezi-e a gyermekablakot. További információ: Egér beviteli eszköz.
Egyszerre csak egy ablak képes fogadni a billentyűzet bemenetét; ez az ablak mondható a billentyűzet fókuszában lévőnek. Ha egy alkalmazás az EnableWindow függvénnyel tilt le egy billentyűzetfókuszos ablakot, az ablak a letiltás mellett a billentyűzetfókuszt is elveszíti. Az EnableWindow ezután NULL értékűre állítja a billentyűzetfókuszt, ami azt jelenti, hogy egyetlen ablak sincs fókuszban. Ha egy gyermekablakban vagy egy másik leszármazottablakban a billentyűzetfókusz van, a leszármazó ablak elveszíti a fókuszt, amikor a szülőablak le van tiltva. További információ: Billentyűzet bemenete.
Ablak láthatósága
Az ablakok lehetnek láthatóak vagy rejtettek. A rendszer egy látható ablakot jelenít meg a képernyőn. Elrejt egy rejtett ablakot úgy, hogy nem rajzolja meg. Ha egy ablak látható, a felhasználó megadhat bemenetet az ablaknak, és megtekintheti az ablak kimenetét. Ha egy ablak el van rejtve, az gyakorlatilag le van tiltva. A rejtett ablak képes feldolgozni a rendszerből vagy más ablakokból érkező üzeneteket, de nem tudja feldolgozni a felhasználótól érkező bemenetet, és nem tudja megjeleníteni a kimenetet. Az alkalmazás beállítja az ablak láthatósági állapotát az ablak létrehozásakor. Később az alkalmazás módosíthatja a láthatósági állapotot.
Az ablak akkor látható, ha a WS_VISIBLE stílus be van állítva az ablakhoz. Alapértelmezés szerint a CreateWindowEx függvény létrehoz egy rejtett ablakot, hacsak az alkalmazás nem adja meg a WS_VISIBLE stílust. Az alkalmazás általában a WS_VISIBLE stílust állítja be, miután létrehozott egy ablakot, hogy elrejtse a létrehozási folyamat részleteit a felhasználó elől. Előfordulhat például, hogy egy alkalmazás rejtve tart egy új ablakot, miközben testre szabja az ablak megjelenését. Ha a WS_VISIBLE stílus a CreateWindowExben van megadva, a rendszer az ablak létrehozása után, de a megjelenítés előtt elküldi a WM_SHOWWINDOW üzenetet az ablaknak.
Az alkalmazás az IsWindowVisible függvény használatával meghatározhatja, hogy egy ablak látható-e. Az alkalmazások megjeleníthetnek (megjeleníthetnek) vagy elrejthetnek egy ablakot a ShowWindow, a SetWindowPos, a DeferWindowPos vagy a SetWindowPlacement vagy a SetWindowLong függvénnyel. Ezek a függvények az ablak WS_VISIBLE stílusának beállításával vagy eltávolításával jelenítik meg vagy rejtik el az ablakot. A WM_SHOWWINDOW üzenetet is elküldik az ablakba, mielőtt megjelenítenék vagy elrejtenék.
Ha egy tulajdonosi ablak minimálisra van csökkentve, a rendszer automatikusan elrejti a társított saját ablakokat. Hasonlóképpen, a tulajdonosi ablak visszaállításakor a rendszer automatikusan megjeleníti a társított saját ablakokat. Mindkét esetben a rendszer elküldi a WM_SHOWWINDOW üzenetet a saját ablakoknak, mielőtt elrejtené vagy megjelenítené őket. Előfordulhat, hogy egy alkalmazásnak el kell rejtenie a saját ablakokat anélkül, hogy minimalizálnia vagy elrejtenie kellene a tulajdonost. Ebben az esetben az alkalmazás a ShowOwnedPopups függvényt használja. Ez a függvény beállítja vagy eltávolítja az összes saját ablak WS_VISIBLE stílusát, és elrejtés vagy megjelenítés előtt elküldi a WM_SHOWWINDOW üzenetet a saját ablakoknak. A tulajdonosablak elrejtése nincs hatással a saját ablakok láthatósági állapotára.
Ha egy szülőablak látható, a hozzá tartozó gyermekablakok is láthatók. Hasonlóképpen, ha a szülőablak rejtett, a gyermekablakok is rejtve vannak. A szülőablak minimalizálása nincs hatással a gyermekablakok láthatósági állapotára; vagyis a gyermekablakok a szülővel együtt kis méretűek lesznek, de a WS_VISIBLE stílus nem változik.
Még ha egy ablak WS_VISIBLE stílussal is rendelkezik, előfordulhat, hogy a felhasználó nem látja az ablakot a képernyőn; más ablakok teljesen átfedhetik azt, vagy a képernyő széle fölé kerültek. A látható gyermekablakra a szülő-gyermek kapcsolatból adódó kivágási szabályok vonatkoznak. Ha az ablak szülőablaka nem látható, akkor az sem lesz látható. Ha a szülőablak a képernyő széle fölé kerül, a gyermekablak is elmozdul, mert a gyermekablak a szülő bal felső sarkához képest van rajzolva. Előfordulhat például, hogy a felhasználó a gyermekablakot tartalmazó szülőablakot olyan messze helyezi el a képernyő szélétől, hogy a felhasználó nem látja a gyermekablakot, annak ellenére, hogy a gyermekablak és a szülőablak is WS_VISIBLE stílussal rendelkezik.
Kis méretűre állított, teljes képernyős és visszaállított ablakok
A teljes méretű ablak egy WS_MAXIMIZE stílusú ablak. Alapértelmezés szerint a rendszer nagyít egy teljes méretű ablakot, hogy kitöltse a képernyőt, gyermekablak esetén pedig a szülőablak ügyfélterületét. Bár az ablak mérete a teljes méretű ablak méretére állítható be, a teljes méretű ablak kissé eltérő. A rendszer automatikusan áthelyezi az ablak címsorát a képernyő tetejére vagy a szülőablak ügyfélterületének tetejére. Emellett a rendszer letiltja az ablak méretszegélyét és a címsor ablakpozíciós képességét is (így a felhasználó a címsor húzásával nem tudja áthelyezni az ablakot).
A kis méretű ablak olyan ablak , amely WS_MINIMIZE stílussal rendelkezik. Alapértelmezés szerint a rendszer csökkenti a kis méretű ablakot a tálca gombjának méretére, és áthelyezi a kis méretű ablakot a tálcára. A visszaállított ablak egy olyan ablak, amely vissza lett adva a korábbi méretéhez és pozíciójához, vagyis a mérethez, amely a méret minimalizálása vagy teljes méretének csökkentése előtt volt.
Ha egy alkalmazás a CreateWindowEx függvény WS_MAXIMIZE vagy WS_MINIMIZE stílusát adja meg, az ablak kezdetben teljes vagy kis méretű lesz. Az ablak létrehozása után az alkalmazás a CloseWindow függvénnyel minimalizálhatja az ablakot. Az ArrangeIconicWindows függvény az asztalon rendezi az ikonokat, vagy a szülőablak kis méretű gyermekablakait a szülőablakban. Az OpenIcon függvény visszaállít egy kis méretű ablakot a korábbi méretére és pozíciójára.
A ShowWindow függvény minimalizálhatja, maximalizálhatja vagy visszaállíthatja az ablakokat. Az ablak láthatósági és aktiválási állapotát is beállíthatja. A SetWindowPlacement függvény ugyanazokat a funkciókat tartalmazza, mint a ShowWindow, de felülbírálhatja az ablak alapértelmezett minimalizált, teljes és visszaállított pozícióit.
Az IsZoomed és az IsIconic függvény határozza meg, hogy egy adott ablak teljes vagy kis méretű-e. A GetWindowPlacement függvény lekéri az ablak minimális, teljes és visszaállított pozícióit, valamint meghatározza az ablak megjelenítési állapotát is.
Amikor a rendszer kap egy parancsot egy kis méretű ablak maximalizálására vagy visszaállítására, WM_QUERYOPEN üzenetet küld az ablaknak. Ha az ablakeljárás HAMIS értéket ad vissza, a rendszer figyelmen kívül hagyja a teljes méretre vagy visszaállításra vonatkozó parancsot.
A rendszer automatikusan beállítja a teljes méretű ablak méretét és pozícióját a teljes méretű ablak rendszer által definiált alapértelmezett értékére. Az alapértelmezett értékek felülbírálásához az alkalmazás meghívhatja a SetWindowPlacement függvényt, vagy feldolgozhatja az ablak által fogadott WM_GETMINMAXINFO üzenetet, amikor a rendszer az ablak teljes méretére készül. WM_GETMINMAXINFO tartalmaz egy mutatót egy MINMAXINFO-struktúrához , amely a rendszer által a maximális méret és pozíció beállításához használt értékeket tartalmazza. Az értékek cseréje felülírja az alapértelmezett értékeket.
Ablak mérete és pozíciója
Az ablak mérete és pozíciója határoló téglalapként van kifejezve, a képernyőhöz vagy a szülőablakhoz viszonyított koordinátákkal megadva. A felső szintű ablak koordinátái a képernyő bal felső sarkához viszonyítva vannak; a gyermekablak koordinátái a szülőablak bal felső sarkához viszonyítva jelennek meg. Az alkalmazás meghatározza az ablak kezdeti méretét és pozícióját az ablak létrehozásakor, de bármikor módosíthatja az ablak méretét és pozícióját. További információ: Kitöltött alakzatok.
Ez a szakasz a következő témaköröket tartalmazza:
- Alapértelmezett méret és pozíció
- Nyomkövetési méret
- Rendszerparancsok
- Méret- és pozíciófüggvények
- Üzenetek mérete és elhelyezése
Alapértelmezett méret és pozíció
Egy alkalmazás lehetővé teszi a rendszer számára, hogy kiszámítsa egy legfelső szintű ablak kezdeti méretét vagy pozícióját a CreateWindowEx CW_USEDEFAULT megadásával. Ha az alkalmazás az ablak koordinátáit CW_USEDEFAULT értékre állítja, és nem hozott létre más felső szintű ablakot, a rendszer beállítja az új ablak pozícióját a képernyő bal felső sarkához képest; ellenkező esetben az alkalmazás által legutóbb létrehozott felső szintű ablak pozíciójához viszonyítva állítja be a pozíciót. Ha a szélességi és magassági paraméterek CW_USEDEFAULT vannak beállítva, a rendszer kiszámítja az új ablak méretét. Ha az alkalmazás más legfelső szintű ablakokat hozott létre, a rendszer az új ablak méretét az alkalmazás legutóbb létrehozott legfelső szintű ablakának méretére alapozza. Ha gyermek- vagy előugró ablak létrehozásakor CW_USEDEFAULT ad meg, a rendszer az ablak méretét az alapértelmezett minimális ablakméretre állítja be.
Nyomkövetési méret
A rendszer minimális és maximális követési méretet tart fenn egy WS_THICKFRAME stílusú ablakhoz; egy ilyen stílusú ablak méretezőszegélyt használ. A minimális követési méret az az ablakméret, amely az ablak méretező szegélyének húzásával előállítható legkisebb. Hasonlóképpen, a maximális követési méret a méretezési szegély húzásával létrehozható legnagyobb ablakméret.
Az ablak minimális és maximális követési méretei rendszer által meghatározott alapértelmezett értékekre vannak beállítva, amikor a rendszer létrehozza az ablakot. Az alkalmazások az WM_GETMINMAXINFO üzenet feldolgozásával felderíthetik az alapértelmezett értékeket, és felülbírálhatják őket. További információ: Méret és pozícióüzenetek.
Rendszerparancsok
Az ablakmenüvel rendelkező alkalmazások rendszerparancsok küldésével módosíthatják az ablak méretét és pozícióját. A rendszerparancsok akkor jönnek létre, amikor a felhasználó parancsokat választ az ablak menüjéből. Az alkalmazások egy WM_SYSCOMMAND üzenet ablakba küldésével emulálhatják a felhasználói műveletet. Az alábbi rendszerparancsok hatással vannak az ablak méretére és helyzetére.
| Parancs | Description |
|---|---|
| SC_CLOSE | Bezárja az ablakot. Ez a parancs WM_CLOSE üzenetet küld az ablaknak. Az ablak elvégzi a szükséges lépéseket, hogy megtisztítsa és elpusztítsa magát. |
| SC_MAXIMIZE | Teljes méretűre állítja az ablakot. |
| SC_MINIMIZE | Kis méretűre csökkenti az ablakot. |
| SC_MOVE | Áthelyezi az ablakot. |
| SC_RESTORE | Visszaállít egy kisméretű vagy teljes méretű ablakot a korábbi méretére és pozíciójára. |
| SC_SIZE | Elindít egy méretparancsot. Az ablak méretének módosításához használja az egeret vagy a billentyűzetet. |
Méret- és pozíciófüggvények
Az ablak létrehozása után az alkalmazások számos különböző függvény , például a SetWindowPlacement, a MoveWindow, a SetWindowPos és a DeferWindowPos meghívásával állíthatják be az ablak méretét vagy pozícióját. A SetWindowPlacement beállítja az ablak minimális pozícióját, a teljes pozíciót, a visszaállított méretet és pozíciót, valamint az állapot megjelenítését. A MoveWindow és a SetWindowPos függvény hasonló; egy alkalmazásablak méretét vagy pozícióját is beállíthatja. A SetWindowPos függvény olyan jelzőket tartalmaz, amelyek befolyásolják az ablak megjelenítési állapotát; A MoveWindow nem tartalmazza ezeket a jelzőket. A BeginDeferWindowPos, a DeferWindowPos és az EndDeferWindowPos függvény használatával egyszerre több ablak pozícióját állíthatja be, beleértve a méretet, a pozíciót, a z-sorrendben elfoglalt pozíciót és az állapot megjelenítését.
Az alkalmazások a GetWindowRect függvény használatával lekérhetik egy ablak határoló téglalapjának koordinátáit. A GetWindowRect kitölti a RECT-struktúrát az ablak bal felső és jobb alsó sarkának koordinátáival. A koordináták a képernyő bal felső sarkához viszonyítva vannak, még egy gyermekablak esetében is. A ScreenToClient vagy a MapWindowPoints függvény leképezi a gyermekablak határoló téglalapjának képernyőkoordinátáit a szülőablak ügyfélterületéhez viszonyított koordinátákra.
A GetClientRect függvény lekéri az ablak ügyfélterületének koordinátáit. A GetClientRect kitölt egy RECT-struktúrát az ügyfélterület bal felső és jobb alsó sarkának koordinátáival, de a koordináták az ügyfélterülethez viszonyítva vannak. Ez azt jelenti, hogy az ügyfélterület bal felső sarkának koordinátái mindig (0,0), a jobb alsó sarok koordinátái pedig az ügyfélterület szélessége és magassága.
A CascadeWindows függvény kaszkádozza az asztali ablakokat, vagy kaszkádozza a megadott szülőablak gyermekablakait. A TileWindows függvény az asztalon lévő ablakokat vagy a megadott szülőablak gyermekablakait csempézi.
Üzenetek mérete és elhelyezése
A rendszer elküldi a WM_GETMINMAXINFO üzenetet egy olyan ablaknak, amelynek mérete vagy pozíciója megváltozik. Az üzenet például akkor lesz elküldve, ha a felhasználó az Áthelyezés vagya Méret gombra kattint az ablak menüjében, vagy a méretezési szegélyre vagy a címsorra kattint; az üzenet akkor is el lesz küldve, amikor egy alkalmazás meghívja a SetWindowPos-t az ablak áthelyezésére vagy méretére. WM_GETMINMAXINFO tartalmaz egy mutatót egy MINMAXINFO-struktúra felé, amely tartalmazza az ablak alapértelmezett maximális méretét és pozícióját, valamint az alapértelmezett minimális és maximális követési méreteket. Az alkalmazások felülbírálhatják az alapértelmezett értékeket a WM_GETMINMAXINFO feldolgozásával és a MINMAXINFO megfelelő tagjainak beállításával. Az ablaknak WM_GETMINMAXINFO fogadásához WS_THICKFRAME vagy WS_CAPTION stílussal kell rendelkeznie. A WS_THICKFRAME stílussal rendelkező ablak az ablaklétrehozási folyamat során, valamint az áthelyezéskor vagy méretezésekor kapja meg ezt az üzenetet.
A rendszer elküldi a WM_WINDOWPOSCHANGING üzenetet egy olyan ablaknak, amelynek mérete, pozíciója, pozíciója a z-sorrendben vagy a megjelenítési állapotban megváltozik. Ez az üzenet egy WINDOWPOS-struktúrára mutató mutatót tartalmaz, amely meghatározza az ablak új méretét, pozícióját, pozícióját a z sorrendben, és megjeleníti az állapotot. A WINDOWSPOS tagjainak beállításával az alkalmazás hatással lehet az ablak új méretére, pozíciójára és megjelenésére.
Az ablak méretének, pozíciójának, z-sorrendben elfoglalt pozíciójának vagy megjelenítési állapotának módosítása után a rendszer elküldi a WM_WINDOWPOSCHANGED üzenetet az ablaknak. Ez az üzenet tartalmaz egy mutatót a WINDOWPOS-hoz , amely tájékoztatja az ablakot az új méretéről, pozíciójáról, a z-sorrendben elfoglalt pozíciójáról és az állapot megjelenítéséről. A WM_WINDOWPOSCHANGED átadott WINDOWPOS-struktúra tagjainak beállítása nincs hatással az ablakra. A WM_SIZE és WM_MOVE üzeneteket feldolgozó ablaknak WM_WINDOWPOSCHANGED kell átadnia a DefWindowProc függvénynek; ellenkező esetben a rendszer nem küld WM_SIZE és WM_MOVE üzeneteket az ablakba.
A rendszer elküldi a WM_NCCALCSIZE üzenetet egy ablaknak az ablak létrehozásakor vagy méretezésekor. A rendszer az üzenet segítségével kiszámítja az ablak ügyfélterületének méretét és az ügyfélterület pozícióját az ablak bal felső sarkához képest. Egy ablak általában az alapértelmezett ablakműveletnek továbbítja ezt az üzenetet; Ez az üzenet azonban hasznos lehet olyan alkalmazásokban, amelyek testre szabják az ablak nemclient területét, vagy megőrzik az ügyfélterület bizonyos részeit, amikor az ablak mérete meg van adva. További információ: Festés és rajz.
Ablak animációja
Az AnimateWindow függvény használatával speciális effektusokat hozhat létre az ablakok megjelenítésekor vagy elrejtésekor. Ha az ablak ily módon van animálva, a rendszer az AnimateWindow hívásában megadott jelölőktől függően elgördül, csúszkál vagy halványítja az ablakot.
Alapértelmezés szerint a rendszer tekercsanimációt használ. Ezzel az effektussal az ablak úgy tűnik, hogy felgördül (az ablakot jeleníti meg) vagy legördül (elrejti az ablakot). A dwFlags paraméter használatával megadhatja, hogy az ablak vízszintesen, függőlegesen vagy átlósan gördül-e.
A AW_SLIDE jelző megadásakor a rendszer diaanimációt használ. Ezzel az effektussal az ablak a nézetbe csúszik (az ablakot jeleníti meg), vagy kicsúszik a nézetből (elrejti az ablakot). A dwFlags paraméter használatával megadhatja, hogy az ablak vízszintesen, függőlegesen vagy átlósan csúszik-e.
Amikor megadja a AW_BLEND jelzőt, a rendszer alfa-kevert elhalványulást használ.
A AW_CENTER jelzővel azt is beállíthatja, hogy az ablak befelé vagy kifelé összecsukva jelenjen meg.
Ablakelrendezés és tükrözés
Az ablakelrendezés határozza meg, hogy a szöveg és a Windows Grafikus eszközfelület (GDI) objektumai hogyan legyenek elhelyezve egy ablak- vagy eszközkörnyezetben (DC). Egyes nyelvek, például az angol, a francia és a német, balról jobbra (LTR) elrendezést igényelnek. Más nyelvek, például az arab és a héber, jobbról balra (RTL) elrendezést igényelnek. Az ablak elrendezése a szövegre vonatkozik, de az ablak többi GDI-elemére is hatással van, beleértve a bitképeket, az ikonokat, a forrás helyét, a gombokat, a kaszkádolt favezérlőket, valamint azt, hogy a vízszintes koordináták megnőnek-e balra vagy jobbra haladva. Ha például egy alkalmazás beállította az RTL-elrendezést, a forrás az ablak vagy az eszköz jobb szélén helyezkedik el, a vízszintes koordinátát jelképező szám pedig a bal oldali mozgás során nő. Az ablak elrendezése azonban nem minden objektumot érint. Az ablakhoz nem társított párbeszédpanelek, üzenetdobozok és eszközkörnyezetek elrendezését például külön kell kezelni, például metafájlokat és nyomtató-tartományvezérlőket. Ezekre vonatkozó konkrétumokat a jelen témakör későbbi részében említjük meg.
Az ablakfüggvények lehetővé teszik az ablakelrendezés megadását vagy módosítását a Windows arab és héber nyelvű verzióiban. Vegye figyelembe, hogy az RTL-elrendezésre (más néven tükrözésre) való váltás nem támogatott olyan ablakok esetében, amelyek stílusa CS_OWNDC , illetve GM_ADVANCED grafikus módú tartományvezérlők esetében.
Alapértelmezés szerint az ablakelrendezés balról jobbra (LTR) van. Az RTL-ablak elrendezésének beállításához hívja meg a CreateWindowEx-et a WS_EX_LAYOUTRTL stílussal. Emellett alapértelmezés szerint egy gyermekablak (vagyis egy olyan, amelyet a WS_CHILD stílussal hoztak létre, és amely rendelkezik érvényes szülő hWnd paraméterrel a CreateWindow vagy a CreateWindowEx hívásában) ugyanazzal az elrendezéssel rendelkezik, mint a szülője. Ha le szeretné tiltani a tükrözés öröklését minden gyermekablakban, adja meg a WS_EX_NOINHERITLAYOUT paramétert a CreateWindowEx hívásában. Vegye figyelembe, hogy a tükrözést nem örökli a saját (WS_CHILD stílus nélkül létrehozott) ablak, vagy azok, amelyeket olyan hWnd szülő paraméterrel hoztak létre a CreateWindowEx-ben, amely NULL értékre van állítva. Egy adott ablak tükrözési öröklésének letiltásához dolgozza fel a WM_NCCREATE üzenetet a GetWindowLong és a SetWindowLong funkciókkal, hogy kikapcsolja a WS_EX_LAYOUTRTL jelzőt. Ez a feldolgozás minden más feldolgozás mellett szükséges. Az alábbi kódrészlet bemutatja ennek módját.
SetWindowLong (hWnd,
GWL_EXSTYLE,
GetWindowLong(hWnd,GWL_EXSTYLE) & ~WS_EX_LAYOUTRTL))
Az alapértelmezett elrendezést a SetProcessDefaultLayout(LAYOUT_RTL) meghívásával állíthatja be RTL értékre. A hívás után létrehozott összes ablak tükrözve lesz, de a meglévő ablakokra nincs hatással. Az alapértelmezett tükrözés kikapcsolásához hívja meg a SetProcessDefaultLayout(0) parancsot.
Megjegyzés: A SetProcessDefaultLayout csak a tükrözött ablakok tartományvezérlőit tükrözi. Bármely tartományvezérlő tükrözéséhez hívja meg a SetLayout(hdc, LAYOUT_RTL) parancsot. További információt a jelen témakör későbbi részében, a windowshoz nem társított eszközkörnyezetek tükrözéséről szóló cikkben talál.
A tükrözött ablakban lévő bitképek és ikonok is alapértelmezés szerint tükrözve vannak. Ezek közül azonban nem mindegyiket kell tükrözni. A szöveggel, üzleti emblémával vagy analóg órával rendelkezőket például nem szabad tükrözni. A bitképek tükrözésének letiltásához hívja meg a SetLayout-ot a dwLayout LAYOUT_BITMAPORIENTATIONPRESERVED bit beállításával. Ha le szeretné tiltani a tükrözést egy eszközkontextusban, használja a SetLayout(hdc, 0) függvényt.
Az aktuális alapértelmezett elrendezés lekérdezéséhez hívja meg a GetProcessDefaultLayout parancsot. Sikeres visszatérés esetén a pdwDefaultLayout LAYOUT_RTL vagy 0 értéket tartalmaz. Az eszközkörnyezet elrendezési beállításainak lekérdezéséhez hívja meg a GetLayout parancsot. Sikeres visszatérés esetén a GetLayout egy DWORD-t ad vissza, amely a LAYOUT_RTL és a LAYOUT_BITMAPORIENTATIONPRESERVED bitek beállításai alapján jelzi az elrendezési beállításokat.
Az ablak létrehozása után a SetWindowLong függvénnyel módosíthatja az elrendezést. Erre például akkor van szükség, ha a felhasználó módosítja egy meglévő ablak felhasználói felületének nyelvét arab vagy héber nyelvről németre. Egy meglévő ablak elrendezésének módosításakor azonban érvénytelenítenie kell és frissítenie kell az ablakot, hogy az ablak tartalma mind ugyanazon az elrendezésen legyen rajzolva. A következő példakód az ablakelrendezést igény szerint módosító mintakódból származik:
// Using ANSI versions of GetWindowLong and SetWindowLong because Unicode
// is not needed for these calls
lExStyles = GetWindowLongA(hWnd, GWL_EXSTYLE);
// Check whether new layout is opposite the current layout
if (!!(pLState -> IsRTLLayout) != !!(lExStyles & WS_EX_LAYOUTRTL))
{
// the following lines will update the window layout
lExStyles ^= WS_EX_LAYOUTRTL; // toggle layout
SetWindowLongA(hWnd, GWL_EXSTYLE, lExStyles);
InvalidateRect(hWnd, NULL, TRUE); // to update layout in the client area
}
A tükrözésben a "közel" és a "távoli" fogalmakban kell gondolkodni a "bal" és "jobb" helyett. Ennek elmulasztása problémákat okozhat. Az egyik gyakori kódolási gyakorlat, amely problémákat okoz a tükrözött ablakban a képernyőkoordináták és az ügyfélkoordináták közötti megfeleltetés során. Az alkalmazások például gyakran az alábbihoz hasonló kódot használnak egy vezérlőelem ablakba helyezéséhez:
// DO NOT USE THIS IF APPLICATION MIRRORS THE WINDOW
// get coordinates of the window in screen coordinates
GetWindowRect(hControl, (LPRECT) &rControlRect);
// map screen coordinates to client coordinates in dialog
ScreenToClient(hDialog, (LPPOINT) &rControlRect.left);
ScreenToClient(hDialog, (LPPOINT) &rControlRect.right);
Ez problémákat okoz a tükrözés során, mert a téglalap bal széle a tükrözött ablakban a jobb szél lesz, és fordítva. A probléma elkerülése érdekében cserélje le a ScreenToClient-hívásokat a MapWindowPoints hívására az alábbiak szerint:
// USE THIS FOR MIRRORING
GetWindowRect(hControl, (LPRECT) &rControlRect);
MapWindowPoints(NULL, hDialog, (LPPOINT) &rControlRect, 2)
Ez a kód azért működik, mert a tükrözést támogató platformokon a MapWindowPoints úgy módosul, hogy az ügyfélablak tükrözésekor felcserélje a bal és a jobb pont koordinátáit. További információt a MapWindowPoints Megjegyzések szakaszában talál.
Egy másik gyakori eljárás, amely problémákat okozhat a tükrözött ablakokban, az, ha az objektumokat az ügyfélablakban képernyőkoordinátákat használva helyezzük el az ügyfélkoordináták helyett. Például az alábbi kód a képernyőkoordináták közötti különbséget használja, hogy a klienskoordinátákban elhelyezze egy vezérlőt egy párbeszédpanelen az x pozíción.
// OK if LTR layout and mapping mode of client is MM_TEXT,
// but WRONG for a mirrored dialog
RECT rdDialog;
RECT rcControl;
HWND hControl = GetDlgItem(hDlg, IDD_CONTROL);
GetWindowRect(hDlg, &rcDialog); // gets rect in screen coordinates
GetWindowRect(hControl, &rcControl);
MoveWindow(hControl,
rcControl.left - rcDialog.left, // uses x position in client coords
rcControl.top - rcDialog.top,
nWidth,
nHeight,
FALSE);
Ez a kód megfelelő, amikor a párbeszédpanel ablaka balról jobbra (LTR) van elrendezve, és a kliens leképezési módja MM_TEXT, mert az új x pozíció a kliens koordinátarendszerében a vezérlő és a párbeszédpanel bal széleinek különbségével egyenlő a képernyő koordinátarendszerében. A tükrözött párbeszédpanelen azonban a bal és a jobb oldal fordított, ezért ehelyett a MapWindowPointsot kell használnia az alábbiak szerint:
RECT rcDialog;
RECT rcControl;
HWND hControl - GetDlgItem(hDlg, IDD_CONTROL);
GetWindowRect(hControl, &rcControl);
// MapWindowPoints works correctly in both mirrored and non-mirrored windows.
MapWindowPoints(NULL, hDlg, (LPPOINT) &rcControl, 2);
// Now rcControl is in client coordinates.
MoveWindow(hControl, rcControl.left, rcControl.top, nWidth, nHeight, FALSE)
Tükrözés párbeszédpanelek és üzenetablakok
A párbeszédpanelek és az üzenetmezők nem öröklik az elrendezést, ezért explicit módon kell beállítania az elrendezést. Üzenetpanel tükrözéséhez hívja meg a MessageBoxot vagy a MessageBoxExet a MB_RTLREADING lehetőséggel. A párbeszédpanel jobbról balra elrendezéséhez használja a DLGTEMPLATEEX párbeszédpanelsablon-struktúrában WS_EX_LAYOUTRTL bővített stílust. A tulajdonságlapok a párbeszédpanelek speciális esetei. Minden lap külön párbeszédpanelként van kezelve, ezért minden tükrözni kívánt lapon szerepelnie kell a WS_EX_LAYOUTRTL stílusnak.
Ablakhoz nem társított eszközkörnyezetek tükrözése
Az ablakhoz nem társított tartományvezérlők, például a metafájl vagy a nyomtató tartományvezérlői nem öröklik az elrendezést, ezért explicit módon kell beállítania az elrendezést. Az eszközkörnyezet elrendezésének módosításához használja a SetLayout függvényt .
A SetLayout függvényt ritkán használják az ablakokhoz. Az ablakok általában csak egy WM_PAINT üzenet feldolgozásakor kapnak társított eszközvezérlőt. Előfordulhat, hogy egy program létrehoz egy tartományvezérlőt egy ablakhoz a GetDC meghívásával. Akárhogy is, a tartományvezérlő kezdeti elrendezését a BeginPaint vagy a GetDC állítja be az ablak WS_EX_LAYOUTRTL jelzője szerint.
A SetLayout meghívása nem befolyásolja a GetWindowOrgEx, a GetWindowExtEx, a GetViewportOrgEx és a GetViewportEx által visszaadott értékeket.
Ha az elrendezés RTL, a GetMapMode MM_ANISOTROPIC ad vissza MM_TEXT helyett. A SetMapMode MM_TEXT hívása megfelelően fog működni; csak a GetMapMode visszatérési értéke érintett. Hasonlóképpen, a SetLayout(hdc, LAYOUT_RTL) meghívása a leképezési mód MM_TEXT hatására a jelentett leképezési mód MM_ANISOTROPIC-ra változik.
Ablak megsemmisítése
Az alkalmazásnak általában el kell pusztítania az általa létrehozott összes ablakot. Ezt a DestroyWindow függvény használatával teszi meg. Ha egy ablak megsemmisül, a rendszer elrejti az ablakot, ha látható, majd eltávolítja az ablakhoz társított belső adatokat. Ez érvényteleníti az ablakfogópontot, amelyet az alkalmazás már nem használhat.
Az alkalmazások nem sokkal a létrehozásuk után megsemmisítik az általa létrehozott ablakok nagy részét. Egy alkalmazás például általában megsemmisít egy párbeszédpanelablakot, amint az alkalmazás elegendő bemenettel rendelkezik a felhasználótól a feladat folytatásához. Egy alkalmazás végül megsemmisíti az alkalmazás főablakát (a megszűnés előtt).
Az ablak megsemmisítése előtt az alkalmazásnak mentenie vagy eltávolítania kell az ablakhoz társított összes adatot, és fel kell szabadítania az ablakhoz lefoglalt rendszererőforrásokat. Ha az alkalmazás nem bocsátja ki az erőforrásokat, a rendszer felszabadít minden olyan erőforrást, amelyet az alkalmazás nem szabadít fel.
Az ablak megsemmisítése nem befolyásolja azt az ablakosztályt, amelyből az ablak létrejön. Az osztály használatával továbbra is létrehozhat új ablakokat, és az osztály meglévő ablakai továbbra is működnek. Az ablak elpusztítása az ablak leszármazott ablakait is elpusztítja. A DestroyWindow függvény először WM_DESTROY üzenetet küld az ablaknak, majd a gyermekablakainak és a leszármazott ablakainak. Ily módon az elpusztult ablak összes leszármazott ablaka is megsemmisül.
Az ablakmenüvel rendelkező ablakok WM_CLOSE üzenetet kapnak, amikor a felhasználó a Bezárás gombra kattint. Az üzenet feldolgozásával az alkalmazás megerősítést kér a felhasználótól, mielőtt megsemmisítené az ablakot. Ha a felhasználó megerősíti, hogy az ablakot meg kell semmisíteni, az alkalmazás meghívhatja a DestroyWindow függvényt, hogy elpusztítsa az ablakot.
Ha a megsemmisített ablak az aktív ablak, az aktív és a fókusz állapota is átkerül egy másik ablakba. Az aktív ablakká váló ablak a következő ablak, amelyet az ALT+ESC billentyűkombináció határoz meg. Az új aktív ablak ezután meghatározza, hogy melyik ablak kapja meg a billentyűzet fókuszát.