Megosztás a következőn keresztül:


Tudnivalók a Windowsról

Ez a témakör ismerteti azokat a programozási elemeket, amelyeket az alkalmazások windowsok létrehozásához és használatához használnak; az ablakok közötti kapcsolatok kezelése; ablakokat méretezheti, áthelyezheti és megjelenítheti.

Az áttekintés az alábbi témaköröket tartalmazza.

Asztali ablak

A rendszer indításakor automatikusan létrehozza az asztali ablakot. Az asztali ablak egy rendszer által definiált ablak, amely festi a képernyő hátterét, és az összes alkalmazás által megjelenített összes ablak alapjaként szolgál.

Az asztali ablak bitképet használ a képernyő hátterének festéséhez. A bittérkép által létrehozott mintát asztali háttérképnek nevezzük. Alapértelmezés szerint az asztali ablak a beállításjegyzékben megadott .bmp fájl bitképét használja asztali háttérképként.

A GetDesktopWindow függvény egy fogópontot ad vissza az asztali ablakba.

Egy rendszerkonfigurációs alkalmazás, például egy Vezérlőpult-elem, a SystemParametersInfo függvénnyel módosítja az asztali háttérképet a wAction paraméter SPI_SETDESKWALLPAPER beállításával, valamint a bitképfájl nevét megadó lpvParam paraméterrel. SystemParametersInfo ezután betölti a bitképet a megadott fájlból, a bitkép használatával festi le a képernyő hátterét, és beírja az új fájlnevet a beállításjegyzékbe.

Alkalmazás Windows

Minden grafikus Windows-alapú alkalmazás létrehoz legalább egy ablakot, az úgynevezett főablakot, amely a felhasználó és az alkalmazás közötti elsődleges felületként szolgál. A legtöbb alkalmazás közvetlenül vagy közvetve más ablakokat is létrehoz a főablakhoz kapcsolódó feladatok elvégzéséhez. Minden ablak szerepet játszik a kimenet megjelenítésében és a felhasználótól érkező bemenet fogadásában.

Amikor elindít egy alkalmazást, a rendszer egy tálcagombot is társít az alkalmazáshoz. A tálcagomb tartalmazza a program ikont és a címet. Ha az alkalmazás aktív, a tálca gombja benyomott állapotban jelenik meg.

Az alkalmazásablak olyan elemeket tartalmaz, mint a címsor, a menüsáv, az ablak menüje (korábbi nevén rendszermenü), a kis méretű gomb, a teljes méret gomb, a visszaállítás gomb, a bezárás gomb, a méretezési szegély, az ügyfélterület, a vízszintes görgetősáv és a függőleges görgetősáv. Az alkalmazás főablaka általában az összes összetevőt tartalmazza. Az alábbi ábrán ezek az összetevők egy tipikus főablakban láthatók.

tipikus ablak

Ügyfélterület

Az ügyfélterület egy ablak része, ahol az alkalmazás kimenetet jelenít meg, például szöveget vagy ábrákat. Egy asztali közzétételi alkalmazás például egy dokumentum aktuális lapját jeleníti meg az ügyfélterületen. Az alkalmazásnak meg kell adnia egy ablakeljárásnak nevezett függvényt az ablak bemenetének feldolgozásához és az ügyfélterület kimenetének megjelenítéséhez. További információ az ablakkezelési eljárásokról a alatt található.

Nem ügyfélterület

A címsort, a menüsávot, az ablakmenüt, a kis méretű és teljes méretű gombokat, a méretszegélyeket és a görgetősávokat együttesen az ablak nem kliens területként. A rendszer kezeli a nemclient terület legtöbb aspektusát; az alkalmazás kezeli az ügyfélterület megjelenését és viselkedését.

A címsor egy alkalmazás által definiált ikont és szövegsort jelenít meg; a szöveg általában az alkalmazás nevét adja meg, vagy az ablak célját jelzi. Az alkalmazás megadja az ikont és a szöveget az ablak létrehozásakor. A címsor lehetővé teszi azt is, hogy a felhasználó egérrel vagy más mutatóeszközzel helyezze át az ablakot.

A legtöbb alkalmazás tartalmaz egy menüsávot, amely felsorolja az alkalmazás által támogatott parancsokat. A menüsáv elemei a parancsok fő kategóriáit jelölik. A menüsáv egyik elemére kattintva általában megnyílik egy előugró menü, amelynek elemei egy adott kategórián belüli feladatoknak felelnek meg. Egy parancsra kattintva a felhasználó egy feladat végrehajtására irányítja az alkalmazást.

A ablakmenü a rendszer hozza létre és kezeli. A menüelemek szabványos készletét tartalmazza, amelyeket a felhasználó kiválasztva beállíthatja az ablak méretét vagy pozícióját, bezárhatja az alkalmazást, vagy feladatokat hajthat végre. További információkért lásd: Menük.

A jobb felső sarokban lévő gombok hatással vannak az ablak méretére és helyzetére. Amikor a teljes méret gombrakattint, a rendszer a képernyő méretére növeli az ablakot, és elhelyezi az ablakot, így az az egész asztalt lefedi, kivéve a tálcát. Ugyanakkor a rendszer lecseréli a nagyítási gombot a visszaállítás gombra. Amikor a visszaállítás gombrakattint, a rendszer visszaállítja az ablakot a korábbi méretére és pozíciójára. Amikor a kicsinyítés gombrakattint, a rendszer a tálcagomb méretére csökkenti az ablakot, az ablakot a tálcagomb fölé helyezi, és normál állapotban jeleníti meg a tálcagombot. Ha vissza szeretné állítani az alkalmazást a korábbi méretére és pozíciójára, kattintson a tálca gombjára. Amikor a bezárás gombrakattint, az alkalmazás kilép.

A méretezési szegély az ablak szegélye körüli terület, amely lehetővé teszi, hogy a felhasználó egérrel vagy más mutatóeszközzel méretezhesse az ablakot.

A vízszintes görgetősáv és a függőleges görgetősáv az egér- vagy billentyűzetbemenetet olyan értékekké alakítja át, amelyeket az alkalmazás az ügyfélterület tartalmának vízszintes vagy függőleges eltolásához használ. Egy hosszú dokumentumot megjelenítő szövegszerkesztő alkalmazás például általában függőleges görgetősávot biztosít, amellyel a felhasználó felfelé és lefelé lapozhat a dokumentumon.

Vezérlők és párbeszédpanelek

Az alkalmazások a főablakon kívül több típusú ablakot is létrehozhatnak, beleértve a vezérlőket és a párbeszédpaneleket is.

A vezérlő egy ablak, amellyel az alkalmazás egy adott információt kér le a felhasználótól, például a megnyitni kívánt fájl nevét vagy a szövegkijelölés kívánt pontméretét. Az alkalmazások vezérlőket is használnak az alkalmazások egy adott funkciójának szabályozásához szükséges információk beszerzéséhez. Egy szövegszerkesztő alkalmazás például általában egy vezérlőt biztosít, amely lehetővé teszi, hogy a felhasználó be- és kikapcsolja a szóburkolást. További információ: Windows-vezérlők.

A vezérlők mindig egy másik ablakkal – általában egy párbeszédpanellel – együtt használhatók. A párbeszédpanel egy vagy több vezérlőt tartalmazó ablak. Az alkalmazások párbeszédpanel használatával kérik a felhasználót, hogy kérje meg a parancs végrehajtásához szükséges bemenetet. Egy fájl megnyitására szolgáló parancsot tartalmazó alkalmazás például megjelenít egy párbeszédpanelt, amely olyan vezérlőket tartalmaz, amelyekben a felhasználó megadja az elérési utat és a fájlnevet. A párbeszédpanelek általában nem ugyanazt az ablakösszetevőt használják, mint a főablakot. A legtöbbnek van címsora, ablakmenüje, szegélye (nem méretezhető) és ügyfélterülete, de általában nem rendelkezik menüsávkal, kis méretű és teljes méretű gombokkal vagy görgetősávokkal. További információ: párbeszédpanelek.

Az üzenetmező egy speciális párbeszédpanel, amely megjegyzést, figyelmeztetést vagy figyelmeztetést jelenít meg a felhasználó számára. Egy üzenetmező például tájékoztathatja a felhasználót egy olyan problémáról, amelyet az alkalmazás a feladat végrehajtása során észlelt. További információ: Üzenetdobozok.

Ablakattribútumok

Az alkalmazásoknak az alábbi információkat kell megadniuk egy ablak létrehozásakor. (A Ablakkezelőkivételével, amelyet a létrehozási függvény az új ablak egyedi azonosításához ad vissza.)

Ezeket az ablakattribútumokat a következő szakaszok ismertetik.

Osztály neve

Minden ablak egy ablakosztályhoz tartozik. Az alkalmazásnak regisztrálnia kell egy ablakosztályt az adott osztály bármelyik ablakának létrehozása előtt. Az ablakosztály határozza meg az ablak megjelenésének és viselkedésének legtöbb aspektusát. Az ablakosztály fő összetevője a ablak eljárás, amely az ablakba küldött összes bemenetet és kérést fogadja és dolgozza fel. A rendszer üzenetek formájában biztosítja a bemenetet és a kéréseket. További információ: Ablakosztályok, Ablakeljárásokés Üzenetek és üzenetsorok.

Ablak neve

A ablaknév egy szöveg, amely azonosítja a felhasználó számára az ablakot. A főablak, párbeszédpanel vagy üzenetmező általában a címsorában jeleníti meg az ablak nevét, ha van ilyen. A vezérlők a vezérlő osztályától függően megjeleníthetik az ablak nevét. A gombok, szerkesztési vezérlők és statikus vezérlők például a vezérlőelem által elfoglalt téglalapon belül jelenítik meg az ablakneveiket. A vezérlők, például a listamezők és a kombinált listák azonban nem jelenítik meg az ablaknevüket.

Ha az ablak létrehozása után módosítani szeretné az ablak nevét, használja a SetWindowText függvényt. Ez a függvény a GetWindowTextLength és GetWindowText függvényt használja az aktuális ablaknév-sztring lekéréséhez az ablakból.

Ablakstílus

Minden ablak egy vagy több ablakstílussal rendelkezik. Az ablakstílusok nevesített állandók, amelyek az ablak megjelenésének és viselkedésének olyan aspektusát határozzák meg, amelyet az ablak osztálya nem határoz meg. Egy alkalmazás általában ablakstílusokat állít be az ablakok létrehozásakor. Az ablak létrehozása után a SetWindowLong függvénnyel is beállíthatja a stílusokat.

A rendszer és bizonyos mértékig az osztály ablakának eljárása értelmezi az ablakstílusokat.

Egyes ablakstílusok az összes ablakra vonatkoznak, de a legtöbb az adott ablakosztályok ablakaira vonatkozik. Az általános ablakstílusokat a WS_ előtaggal kezdődő állandók jelölik; Az OR operátorral kombinálva különböző típusú ablakokat alkothatnak, beleértve a főablakokat, a párbeszédpaneleket és a gyermekablakokat. Az osztályspecifikus ablakstílusok határozzák meg az előre definiált vezérlőosztályok ablakainak megjelenését és viselkedését. A SCROLLBAR osztály például egy görgetősáv-vezérlőt határoz meg, de a SBS_HORZ és a SBS_VERT stílus határozza meg, hogy létrejön-e vízszintes vagy függőleges görgetősáv vezérlőelem.

Az ablakok által használható stílusok listáját az alábbi témakörökben találja:

Bővített ablakstílus

Minden ablaknak lehet egy vagy több kiterjesztett ablakstílusa. A bővített ablakstílus egy elnevezett állandó, amely az ablak megjelenésének és viselkedésének olyan aspektusát határozza meg, amelyet az ablakosztály vagy a többi ablakstílus nem határoz meg. Az alkalmazások általában kiterjesztett ablakstílusokat ad meg az ablakok létrehozásakor. Az ablak létrehozása után a SetWindowLong függvénnyel is beállíthatja a stílusokat.

További információ: CreateWindowEx.

Pozíció

Az ablak helyzete a bal felső sarok koordinátáiként van definiálva. Ezek a koordináták, más néven ablakkoordináták mindig a képernyő bal felső sarkához, gyermekablak esetén pedig a szülőablak ügyfélterületének bal felső sarkához vannak viszonyítva. A koordinátákat (10,10) megjelenítő felső szintű ablak például a képernyő bal felső sarkától jobbra, 10 képponttal lejjebb helyezkedik el. A koordinátákkal (10,10) rendelkező gyermekablak a szülőablak ügyfélterületének bal felső sarkától jobbra, 10 képponttal lejjebb helyezkedik el.

A WindowFromPoint függvény lekér egy fogantyút a képernyő egy adott pontját elfoglaló ablakhoz. Hasonlóképpen, a ChildWindowFromPoint és ChildWindowFromPointEx függvények lekérnek egy fogópontot a gyermekablakba, amely a szülőablak ügyfélterületének egy adott pontját foglalja el. Bár ChildWindowFromPointEx figyelmen kívül hagyhatja a láthatatlan, letiltott és átlátszó gyermekablakokat, ChildWindowFromPoint nem.

Méret

Az ablak mérete (szélessége és magassága) képpontban van megadva. Egy ablak szélessége vagy magassága nulla lehet. Ha egy alkalmazás nullára állítja az ablak szélességét és magasságát, a rendszer az alapértelmezett minimális ablakméretre állítja a méretet. Az alapértelmezett minimális ablakméret felderítéséhez az alkalmazás a GetSystemMetrics függvényt használja a SM_CXMIN és SM_CYMIN jelzőkkel.

Előfordulhat, hogy egy alkalmazásnak létre kell hoznia egy adott méretű ügyfélterülettel rendelkező ablakot. Az AdjustWindowRect és AdjustWindowRectEx függvény az ügyfélterület kívánt mérete alapján kiszámítja az ablak szükséges méretét. Az alkalmazás átadhatja az eredményül kapott méretértékeket a CreateWindowEx függvénynek.

Egy alkalmazás méretezheti az ablakot, hogy rendkívül nagy legyen; azonban nem szabad úgy méreteznie az ablakot, hogy nagyobb legyen, mint a képernyő. Az ablak méretének beállítása előtt az alkalmazásnak ellenőriznie kell a képernyő szélességét és magasságát GetSystemMetrics a SM_CXSCREEN és SM_CYSCREEN jelzőkkel.

A szülő vagy tulajdonos ablakkezelője

Egy ablaknak lehet szülőablaka. A szülővel rendelkező ablak neve gyermekablak. A szülőablak biztosítja a gyermekablakok elhelyezéséhez használt koordinátarendszert. Az, hogy van egy szülőablak, hatással van az ablak megjelenésére; például egy gyermekablak úgy van kialakítva, hogy egyetlen része sem jelenhet meg a szülőablak határain kívül.

Egy olyan ablak, amelynek nincs szülője, vagy amelynek szülője az asztali ablak, felső szintű ablaknaknevezik. Az alkalmazások az EnumWindows függvénnyel szerezhetnek be egy fogópontot a képernyő minden felső szintű ablakához. EnumWindows átadja a leírót minden felső szintű ablaknak, egy alkalmazás által definiált visszahívási függvénynek, EnumWindowsProc.

Egy felső szintű ablak lehet egy másik ablak tulajdonosa, vagy annak tulajdonában lehet. Egy tulajdonában lévő ablak, mindig a tulajdonos ablaka előtt jelenik meg, elrejtve van, ha a tulajdonos ablaka minimálisra van csökkentve, és a tulajdonos ablakának megsemmisülésekor megsemmisül. További információ: Saját Windows.

A gyermekablakok gyermekablak- azonosítóval rendelkezhetnek, amely a gyermekablakhoz társított egyedi, alkalmazás által definiált érték. A gyermekablak-azonosítók különösen hasznosak a több gyermekablakot létrehozó alkalmazásokban. Gyermekablak létrehozásakor az alkalmazás megadja a gyermekablak azonosítóját. Az ablak létrehozása után az alkalmazás módosíthatja az ablak azonosítóját a SetWindowLong függvénnyel, vagy lekérheti az azonosítót a GetWindowLong függvénnyel.

A gyermekablak kivételével minden ablak rendelkezhet menüvel. Az alkalmazások menüt is tartalmazhatnak, ha egy menüleírót adnak meg az ablak osztályának regisztrálásakor vagy az ablak létrehozásakor.

Alkalmazáspéldány-azonosító

Minden alkalmazáshoz tartozik egy példányleíró. A rendszer az alkalmazás indításakor biztosítja a példánykezelőt egy alkalmazásnak. Mivel több példányt is futtathat ugyanabból az alkalmazásból, a rendszer belsőleg kezeli a példányokat az alkalmazás egyik példányának a másiktól való megkülönböztetéséhez. Az alkalmazásnak számos különböző ablakban meg kell adnia a példánykezelő objektumot, beleértve azokat az ablakokat is, amelyek ablakokat hoznak létre.

Létrehozási adatok

Minden ablakhoz hozzárendelhetők alkalmazás által definiált létrehozási adatok. Az ablak első létrehozásakor a rendszer egy mutatót ad át a létrehozott ablak eljárásának az adatokra. Az ablakos eljárás az adatokat az alkalmazás által definiált változók inicializálására használja.

Ablakfogópont

Az ablak létrehozása után a létrehozási függvény egy ablakkezelőt ad vissza,, amely egyedileg azonosítja az ablakot. Az ablakfogantyúk HWND adattípussal rendelkezik; Az alkalmazásnak ezt a típust kell használnia egy ablakfogópontot tartalmazó változó deklarálásakor. Az alkalmazás ezt a leírót használja más függvényekben, hogy a műveleteket az ablakhoz irányítsa.

Az alkalmazások a FindWindow függvénnyel deríthetik fel, hogy létezik-e a rendszerben a megadott osztálynévvel vagy ablaknévvel rendelkező ablak. Ha létezik ilyen ablak, FindWindow egy fogópontot ad vissza az ablaknak. Ha egy adott alkalmazás gyermekablakára szeretné korlátozni a keresést, használja a FindWindowEx függvényt.

Az IsWindow függvény határozza meg, hogy egy ablakkezelő azonosít-e érvényes, meglévő ablakot. Vannak speciális állandók, amelyek bizonyos függvényekben lecserélhetnek egy ablakfogópontot. Egy alkalmazás például használhat HWND_BROADCAST a SendMessage és SendMessageTimeout függvényben, vagy HWND_DESKTOP a MapWindowPoints függvényben.

Ablak létrehozása

Alkalmazásablakok létrehozásához használja a CreateWindow vagy CreateWindowEx függvényt. Meg kell adnia az ablakattribútumok meghatározásához szükséges információkat. CreateWindowEx rendelkezik dwExStyleparaméterrel, amelyet a CreateWindow nem rendelkezik; ellenkező esetben a függvények azonosak. Valójában a CreateWindow egyszerűen meghívja a CreateWindowEx-t, amikor a dwExStyle paraméter nullára van állítva. Ezért az áttekintés fennmaradó része csak a CreateWindowExhivatkozik.

Ez a szakasz a következő témaköröket tartalmazza:

Jegyzet

A speciális célú ablakok, például a párbeszédpanelek és az üzenetmezők létrehozására további funkciók is rendelkezésre állnak. További információ: DialogBox, CreateDialogés MessageBox.

 

Főablak létrehozása

Minden Windows-alapú alkalmazásnak WinMain kell lennie belépési pontként. WinMain számos feladatot hajt végre, beleértve a főablak ablakosztályának regisztrálását és a főablak létrehozását. WinMain regisztrálja a főablak-osztályt a RegisterClass függvény meghívásával, és a CreateWindowEx függvény meghívásával hozza létre a főablakot.

A WinMain függvény az alkalmazást egyetlen példányra is korlátozhatja. Hozzon létre egy elnevezett mutexet a CreateMutex függvénnyel. Ha a GetLastError az ERROR_ALREADY_EXISTSértéket adja vissza, az alkalmazásának már létezik egy másik példánya (amely létrehozta a mutexet), és ki kell lépnie a WinMainfüggvényből.

A rendszer a létrehozás után nem jeleníti meg automatikusan a főablakot; ehelyett az alkalmazásnak a ShowWindow függvényt kell használnia a főablak megjelenítéséhez. A főablak létrehozása után az alkalmazás WinMain függvény meghívja ShowWindow, és két paramétert ad át neki: egy fogópontot a főablaknak, és egy jelölőt, amely meghatározza, hogy a főablakot minimalizálni vagy maximalizálni kell-e az első megjelenítéskor. A jelölő általában a SW_ előtaggal kezdődő állandók bármelyikére beállítható. Ha azonban ShowWindow az alkalmazás főablakának megjelenítésére van meghívva, a jelölőt SW_SHOWDEFAULTértékre kell állítani. Ez a jelző azt jelzi a rendszernek, hogy az alkalmazást elindító program utasításainak megfelelően jelenítse meg az ablakot.

Ha RegisterClassUnicode-verziójával regisztráltak egy ablakosztályt, az ablak csak Unicode-üzeneteket fogad. Annak megállapításához, hogy egy ablak a Unicode karakterkészletet használja-e, hívja meg IsWindowUnicode.

Window-Creation üzenetek

Bármely ablak létrehozásakor a rendszer üzeneteket küld az ablak eljárásának. A rendszer elküldi a WM_NCCREATE üzenetet az ablak nemclient területének létrehozása után, és az ügyfélterület létrehozása után a WM_CREATE üzenetet. Az ablakeljárás mindkét üzenetet megkapja, mielőtt a rendszer megjelenítené az ablakot. Mindkét üzenet tartalmaz egy mutatót egy CREATESTRUCT struktúrára, amely tartalmazza a CreateWindowEx függvényben megadott összes információt. Az ablakos eljárás általában inicializálási feladatokat hajt végre az üzenetek fogadásakor.

Gyermekablak létrehozásakor a rendszer a WM_NCCREATE és WM_CREATE üzenetek elküldése után elküldi a WM_PARENTNOTIFY üzenetet a szülőablaknak. Az ablak létrehozásakor más üzeneteket is küld. Ezeknek az üzeneteknek a száma és sorrendje az ablak osztályától és stílusától, valamint az ablak létrehozásához használt függvénytől függ. Ezeket az üzeneteket a súgófájl egyéb témakörei ismertetik.

Többszálú alkalmazások

A Windows-alapú alkalmazások több végrehajtási szálat is tartalmazhatnak, és mindegyik szál létrehozhat ablakokat. Az ablakot létrehozó szálnak tartalmaznia kell az ablakeljárás kódját.

Az alkalmazások az EnumThreadWindows függvénnyel számba tudják adni az adott szál által létrehozott ablakokat. Ez a függvény sorban átadja a handle-t minden egyes szál ablakának egy alkalmazás által definiált visszahívási függvénynek, EnumThreadWndProc.

A GetWindowThreadProcessId függvény az adott ablakot létrehozó szál azonosítóját adja vissza.

Egy másik szál által létrehozott ablak megjelenítési állapotának beállításához használja a ShowWindowAsync függvényt.