Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
In dit onderwerp worden de programmeerelementen beschreven die toepassingen gebruiken om vensters te maken en te gebruiken; relaties tussen vensters beheren; en grootte, verplaatsen en vensters weergeven.
Het overzicht bevat de volgende onderwerpen.
- bureaubladvenster
- Applicatievensters
- besturingselementen en dialoogvensters
- vensterkenmerken
- venster maken
Bureaubladvenster
Wanneer u het systeem start, wordt automatisch het bureaubladvenster gemaakt. Het bureaubladvenster is een door het systeem gedefinieerd venster dat de achtergrond van het scherm schildert en fungeert als de basis voor alle vensters die door alle toepassingen worden weergegeven.
In het bureaubladvenster wordt een bitmap gebruikt om de achtergrond van het scherm te schilderen. Het patroon dat door de bitmap wordt gemaakt, wordt de bureaubladachtergrondgenoemd. Standaard gebruikt het bureaubladvenster de bitmap uit een .bmp-bestand dat is opgegeven in het register als bureaubladachtergrond.
De functie GetDesktopWindow retourneert een handle naar het bureaubladvenster.
Een systeemconfiguratietoepassing, zoals een Configuratiescherm-item, wijzigt de bureaubladachtergrond met behulp van de functie SystemParametersInfo met de parameter wAction ingesteld op SPI_SETDESKWALLPAPER en de parameter lpvParam die een bitmapbestandsnaam opgeeft. SystemParametersInfo laadt vervolgens de bitmap uit het opgegeven bestand, gebruikt de bitmap om de achtergrond van het scherm te schilderen en voert de nieuwe bestandsnaam in het register in.
Toepassingsvensters
Elke grafische Windows-toepassing maakt ten minste één venster, het hoofdvenstergenoemd, dat fungeert als de primaire interface tussen de gebruiker en de toepassing. De meeste toepassingen maken ook rechtstreeks of indirect andere vensters om taken uit te voeren die betrekking hebben op het hoofdvenster. Elk venster speelt een rol bij het weergeven van uitvoer en het ontvangen van invoer van de gebruiker.
Wanneer u een toepassing start, koppelt het systeem ook een taakbalkknop aan de toepassing. De taakbalkknop bevat het programmapictogram en de titel. Wanneer de toepassing actief is, wordt de taakbalkknop weergegeven in de ingedrukte status.
Een toepassingsvenster bevat elementen zoals een titelbalk, een menubalk, het venstermenu (voorheen systeemmenu genoemd), de geminimaliseerde knop, de knop Maximaliseren, de knop Herstellen, de knop Sluiten, een rand met de grootte, een clientgebied, een horizontale schuifbalk en een verticale schuifbalk. Het hoofdvenster van een toepassing bevat doorgaans al deze onderdelen. In de volgende afbeelding ziet u deze onderdelen in een typisch hoofdvenster.
Clientgebied
Het clientgebied is het onderdeel van een venster waarin de toepassing uitvoer weergeeft, zoals tekst of afbeeldingen. In een bureaubladpublicatietoepassing wordt bijvoorbeeld de huidige pagina van een document in het clientgebied weergegeven. De toepassing moet een functie, een zogenaamde vensterprocedure, opgeven om invoer voor het venster te verwerken en uitvoer weer te geven in het clientgebied. Zie Vensterproceduresvoor meer informatie.
Niet-clientgebied
De titelbalk, menubalk, venstermenu, knoppen minimaliseren en maximaliseren, randgrootte en schuifbalken worden gezamenlijk aangeduid als het niet-clientgebied van het venster. Het systeem beheert de meeste aspecten van het niet-clientgebied; de toepassing beheert het uiterlijk en gedrag van het clientgebied.
De titelbalk een toepassingsgedefinieerde pictogram en tekstregel weergeeft; meestal geeft de tekst de naam van de toepassing op of geeft het doel van het venster aan. Een toepassing geeft het pictogram en de tekst op bij het maken van het venster. Met de titelbalk kan de gebruiker het venster ook verplaatsen met behulp van een muis of een ander aanwijsapparaat.
De meeste toepassingen bevatten een menubalk met de opdrachten die door de toepassing worden ondersteund. Items in de menubalk vertegenwoordigen de hoofdcategorieën van opdrachten. Als u op een item op de menubalk klikt, wordt meestal een snelmenu geopend waarvan de items overeenkomen met de taken binnen een bepaalde categorie. Door op een opdracht te klikken, stuurt de gebruiker de toepassing om een taak uit te voeren.
Het venstermenu wordt gemaakt en beheerd door het systeem. Het bevat een standaardset menu-items die, wanneer deze door de gebruiker zijn gekozen, de grootte of positie van een venster instellen, de toepassing sluiten of taken uitvoeren. Voor meer informatie, zie Menus.
De knoppen in de rechterbovenhoek zijn van invloed op de grootte en positie van het venster. Wanneer u op de knop maximaliserenklikt, vergroot het systeem het venster tot de grootte van het scherm en plaatst het venster, zodat het hele bureaublad wordt bedekt, minus de taakbalk. Tegelijkertijd vervangt het systeem de knop Maximaliseren door de herstelknop. Wanneer u op de knop herstellen klikt, herstelt het systeem het venster naar de vorige grootte en positie. Wanneer u op de knopminimaliseren klikt, vermindert het systeem het venster tot de grootte van de taakbalkknop, plaatst het venster op de taakbalkknop en wordt de taakbalkknop in de normale toestand weergegeven. Als u de toepassing wilt herstellen naar de vorige grootte en positie, klikt u op de taakbalkknop. Wanneer u op de knop sluiten klikt, wordt de toepassing afgesloten.
De randgrootte is een gebied rond de omtrek van het venster waarmee de gebruiker de grootte van het venster kan aanpassen met behulp van een muis of een ander aanwijsapparaat.
De horizontale schuifbalk en verticale schuifbalk muis- of toetsenbordinvoer converteren naar waarden die een toepassing gebruikt om de inhoud van het clientgebied horizontaal of verticaal te verplaatsen. Een tekstverwerkingstoepassing waarin een lang document wordt weergegeven, biedt bijvoorbeeld meestal een verticale schuifbalk waarmee de gebruiker omhoog en omlaag door het document kan bladeren.
Besturingselementen en dialoogvensters
Een toepassing kan naast het hoofdvenster verschillende typen vensters maken, waaronder besturingselementen en dialoogvensters.
Een besturingselement is een venster dat een toepassing gebruikt om een specifiek stukje informatie van de gebruiker te verkrijgen, zoals de naam van een bestand dat moet worden geopend of de gewenste puntgrootte van een tekstselectie. Toepassingen gebruiken ook besturingselementen om informatie te verkrijgen die nodig is om een bepaalde functie van een toepassing te beheren. Een tekstverwerkingstoepassing biedt bijvoorbeeld meestal een besturingselement waarmee de gebruiker tekstterugloop kan in- en uitschakelen. Zie Windows-besturingselementenvoor meer informatie.
Besturingselementen worden altijd gebruikt in combinatie met een ander venster, meestal een dialoogvenster. Een dialoogvenster is een venster met een of meer besturingselementen. Een toepassing gebruikt een dialoogvenster om de gebruiker te vragen om invoer die nodig is om een opdracht te voltooien. Een toepassing die een opdracht bevat om een bestand te openen, bevat bijvoorbeeld een dialoogvenster met besturingselementen waarin de gebruiker een pad en bestandsnaam opgeeft. Dialoogvensters gebruiken doorgaans niet dezelfde set vensteronderdelen als een hoofdvenster. De meeste hebben een titelbalk, een venstermenu, een rand (niet-resizeable) en een clientruimte, maar ze hebben typisch geen menubalk, minimaliseer- en maximaliseerknoppen of schuifbalken. Zie dialoogvenstersvoor meer informatie.
Een berichtvak is een speciaal dialoogvenster waarin een notitie, waarschuwing of voorzichtigheid voor de gebruiker wordt weergegeven. Een berichtvak kan bijvoorbeeld de gebruiker informeren over een probleem dat de toepassing heeft aangetroffen tijdens het uitvoeren van een taak. Zie Berichtvakkenvoor meer informatie.
Vensterkenmerken
Een toepassing moet de volgende informatie opgeven bij het maken van een venster. (Met uitzondering van de venstergreep, die de aanmaakfunctie retourneert om het nieuwe venster uniek te identificeren.)
- Klassenaam
- vensternaam
- vensterstijl
- uitgebreide vensterstijl
- positie
- grootte
- bovenliggende of eigenaarvenstergreep
- menuknop of Child-Window identificatie
- toepassingsexemplaren verwerken
- Creatiegegevens
- vensterhandgreep
Deze vensterkenmerken worden beschreven in de volgende secties.
Klassenaam
Elk venster hoort bij een vensterklasse. Een toepassing moet een vensterklasse registreren voordat er vensters van die klasse worden gemaakt. De vensterklasse definieert de meeste aspecten van het uiterlijk en gedrag van een venster. Het belangrijkste onderdeel van een vensterklasse is de vensterprocedure, een functie die alle invoer en aanvragen die naar het venster worden verzonden, ontvangt en verwerkt. Het systeem levert de invoer en de aanvragen in de vorm van berichten . Zie vensterklassen, vensterproceduresen berichten- en berichtenwachtrijenvoor meer informatie.
Vensternaam
Een vensternaam is een tekenreeks die een venster voor de gebruiker identificeert. In een hoofdvenster, dialoogvenster of berichtvenster wordt doorgaans de naam van het venster weergegeven op de titelbalk, indien aanwezig. Een besturingselement kan de naam van het venster weergeven, afhankelijk van de klasse van het besturingselement. Knoppen, bewerkingsbesturingselementen en statische besturingselementen geven bijvoorbeeld hun vensternamen weer binnen de rechthoek die door het besturingselement wordt bezet. Besturingselementen zoals keuzelijsten en keuzelijsten met invoerveld geven hun vensternamen echter niet weer.
Als u de naam van het venster wilt wijzigen nadat u een venster hebt gemaakt, gebruikt u de functie SetWindowText. Deze functie maakt gebruik van de functies GetWindowTextLength en GetWindowText om de huidige tekenreeks voor vensternamen op te halen uit het venster.
Vensterstijl
Elk venster heeft een of meer vensterstijlen. Een vensterstijl is een benoemde constante die een aspect definieert van het uiterlijk en gedrag van het venster dat niet is opgegeven door de klasse van het venster. Een toepassing stelt meestal vensterstijlen in bij het maken van vensters. U kunt de stijlen ook instellen nadat u een venster hebt gemaakt met behulp van de functie SetWindowLong.
Het systeem en in zekere mate de vensterprocedure voor de klasse interpreteren de vensterstijlen.
Sommige vensterstijlen zijn van toepassing op alle vensters, maar de meeste zijn van toepassing op vensters van specifieke vensterklassen. De algemene vensterstijlen worden vertegenwoordigd door constanten die beginnen met het WS_ voorvoegsel; ze kunnen worden gecombineerd met de OPERATOR OF om verschillende typen vensters te vormen, waaronder hoofdvensters, dialoogvensters en onderliggende vensters. De klassespecifieke vensterstijlen definiëren het uiterlijk en gedrag van vensters die behoren tot de vooraf gedefinieerde besturingsklassen. De SCROLLBAR-klasse specificeert bijvoorbeeld een schuifbalkbesturingselement, maar de stijlen SBS_HORZ en SBS_VERT bepalen of er een horizontaal of verticaal schuifbalkbesturingselement wordt gemaakt.
Zie de volgende onderwerpen voor lijsten met stijlen die door Vensters kunnen worden gebruikt:
- vensterstijlen
- knopstijlen
- Combo Box-stijlen
- Besturingselementstijlen bewerken
- Keuzelijststijlen
- Rich Edit Control Stijlen
- schuifbalk bedieningsstijlen
- statische besturingsstijlen
Uitgebreide vensterstijl
Elk venster kan desgewenst een of meer uitgebreide vensterstijlen hebben. Een uitgebreide vensterstijl is een benoemde constante die een aspect van het uiterlijk en gedrag van het venster definieert dat niet is opgegeven door de vensterklasse of de andere vensterstijlen. Een toepassing stelt meestal uitgebreide vensterstijlen in bij het maken van vensters. U kunt de stijlen ook instellen nadat u een venster hebt gemaakt met behulp van de functie SetWindowLong.
Zie CreateWindowExvoor meer informatie.
Positie
De positie van een venster wordt gedefinieerd als de coördinaten van de linkerbovenhoek. Deze coördinaten, ook wel venstercoördinaten genoemd, zijn altijd relatief ten opzichte van de linkerbovenhoek van het scherm of, voor een onderliggend venster, de linkerbovenhoek van het clientgebied van het oudervenster. Een venster op het hoogste niveau met de coördinaten (10,10) wordt bijvoorbeeld 10 pixels rechts van de linkerbovenhoek van het scherm geplaatst en 10 pixels eronder. Een ervenster met de coördinaten (10,10) is 10 pixels naar rechts vanaf de linkerbovenhoek van het clientgebied van het bovenliggende venster geplaatst en 10 pixels naar beneden daarvan.
De functie WindowFromPoint haalt een ingang op voor het venster dat een bepaald punt op het scherm bezette. Op dezelfde manier verkrijgen de functies ChildWindowFromPoint en ChildWindowFromPointEx een handle naar het onderliggende venster dat zich op een bepaald punt in het clientgebied van het bovenliggende venster bevindt. Hoewel ChildWindowFromPointEx- onzichtbare, uitgeschakelde en transparante onderliggende vensters kan negeren, kan ChildWindowFromPoint niet.
Grootte
De grootte van een venster (breedte en hoogte) wordt weergegeven in pixels. Een venster kan nul breedte of hoogte hebben. Als een toepassing de breedte en hoogte van een venster instelt op nul, stelt het systeem de grootte in op de standaard minimale venstergrootte. Voor het detecteren van de standaard minimale venstergrootte gebruikt een toepassing de functie GetSystemMetrics met de SM_CXMIN en SM_CYMIN vlaggen.
Een toepassing moet mogelijk een venster maken met een clientgebied van een bepaalde grootte. De functies AdjustWindowRect en AdjustWindowRectEx berekenen de vereiste grootte van een venster op basis van de gewenste grootte van het clientgebied. De toepassing kan de resulterende groottewaarden doorgeven aan de functie CreateWindowEx.
Een toepassing kan een venster zo groot maken dat het zeer groot is; Het mag echter geen grootte van een venster zodanig aanpassen dat het groter is dan het scherm. Voordat u de grootte van een venster instelt, moet de toepassing de breedte en hoogte van het scherm controleren met behulp van GetSystemMetrics- met de vlaggen SM_CXSCREEN en SM_CYSCREEN.
Ouder- of eigenaravenster-handle
Een venster kan een bovenliggend venster hebben. Een venster met een oudervenster wordt een kindvenstergenoemd. Het oudervenster biedt het coördinaatsysteem dat wordt gebruikt voor het positioneren van een kindvenster. Step 2: Een oudervenster beïnvloedt aspecten van het uiterlijk van een venster; bijvoorbeeld, een kindvenster wordt zodanig afgebakend dat geen deel van het kindvenster buiten de grenzen van het oudervenster kan verschijnen.
Een venster met geen bovenliggende of waarvan het bovenliggende venster het bureaubladvenster is, wordt een venster op het hoogste niveaugenoemd. Een toepassing kan de functie EnumWindows gebruiken om een ingang te verkrijgen voor elk venster op het hoogste niveau op het scherm. EnumWindows geeft het handvat door aan elk venster op het hoogste niveau, op zijn beurt aan een door de toepassing gedefinieerde callback-functie, EnumWindowsProc.
Een venster op het hoogste niveau kan eigenaar zijn van of eigendom zijn van een ander venster. Een venster van eigendom altijd voor het venster van de eigenaar wordt weergegeven, wordt verborgen wanneer het venster van de eigenaar wordt geminimaliseerd en wordt vernietigd wanneer het eigenaarvenster wordt vernietigd. Zie Windows-eigendom voor meer informatie.
Menugreep of Child-Window-identificator
Een onderliggend venster kan een identificator voor een onderliggend venster hebben, een unieke, toepassingsgedefinieerde waarde die is gekoppeld aan het onderliggende venster. ID's voor kindvensters zijn vooral handig in applicaties die meerdere kindvensters maken. Bij het maken van een kindvenster specificeert een toepassing het identificatienummer van het kindvenster. Nadat het venster is gemaakt, kan de toepassing de id van het venster wijzigen met behulp van de functie SetWindowLong, of kan de id worden opgehaald met behulp van de functie GetWindowLong.
Elk venster, behalve een onderliggend venster, kan een menu hebben. Een toepassing kan een menu bevatten door een menugreep op te geven bij het registreren van de klasse van het venster of bij het maken van het venster.
Handle van toepassingsexemplaren
Aan elke toepassing is een instantiehandle gekoppeld. Het systeem biedt de instantiehandler aan een toepassing wanneer de toepassing wordt gestart. Omdat het meerdere kopieën van dezelfde toepassing kan uitvoeren, gebruikt het systeem intern instantiehandvatten om één instantiatie van een toepassing van een andere te onderscheiden. De toepassing moet de instantiehandle opgeven in veel verschillende vensters, waaronder degene die andere vensters maken.
Aanmaakgegevens
Aan elk venster kunnen toepassingsgedefinieerde aanmaakgegevens zijn gekoppeld. Wanneer het venster voor het eerst wordt gemaakt, geeft het systeem een aanwijzer naar de gegevens door aan de procedure van het venster dat wordt gecreëerd. In de vensterprocedure worden de gegevens gebruikt om door de toepassing gedefinieerde variabelen te initialiseren.
Venstergreep
Nadat u een venster hebt gemaakt, retourneert de aanmaakfunctie een venstergreep die het venster uniek identificeert. Een venstergreep heeft het HWND gegevenstype; een toepassing moet dit type gebruiken bij het declareren van een variabele die een venstergreep bevat. Een toepassing gebruikt deze handle in andere functies om zijn acties op het venster te richten.
Een toepassing kan de functie FindWindow gebruiken om te ontdekken of er een venster met de opgegeven klassenaam of vensternaam in het systeem bestaat. Als er een dergelijk venster bestaat, retourneert FindWindow een ingang naar het venster. Als u de zoekopdracht wilt beperken tot de onderliggende vensters van een bepaalde toepassing, gebruikt u de functie FindWindowEx.
De functie IsWindow bepaalt of een venstergreep een geldig, bestaand venster identificeert. Er zijn speciale constanten die een venstergreep in bepaalde functies kunnen vervangen. Een toepassing kan bijvoorbeeld HWND_BROADCAST gebruiken in de functies SendMessage en SendMessageTimeout of HWND_DESKTOP in de functie MapWindowPoints.
Venster maken
Als u toepassingsvensters wilt maken, gebruikt u de functie CreateWindow of CreateWindowEx. U moet de vereiste informatie opgeven om de vensterkenmerken te definiëren. CreateWindowEx heeft een parameter, dwExStyle, die CreateWindow- niet heeft; anders zijn de functies identiek. In feite roept CreateWindowCreateWindowEx- aan met de parameter dwExStyle ingesteld op nul. Daarom verwijst de rest van dit overzicht alleen naar CreateWindowEx-.
Deze sectie bevat de volgende onderwerpen:
Notitie
Er zijn extra functies voor het maken van vensters voor speciaal gebruik, zoals dialoogvensters en berichtvakken. Zie Dialoogvenster, CreateDialogen MessageBoxvoor meer informatie.
Hoofdvenster maken
Elke Windows-toepassing moet WinMain- hebben als toegangspuntfunctie. WinMain voert een aantal taken uit, waaronder het registreren van de vensterklasse voor het hoofdvenster en het maken van het hoofdvenster. WinMain registreert de hoofdvensterklasse door de functie RegisterClass aan te roepen en het hoofdvenster te maken door de functie CreateWindowEx aan te roepen.
Uw WinMain-functie kan uw toepassing ook beperken tot één exemplaar. Maak een benoemde mutex met behulp van de functie CreateMutex. Als GetLastErrorERROR_ALREADY_EXISTSretourneert, dan bestaat er al een ander exemplaar van uw toepassing (wat betekent dat de mutex al is gemaakt) en moet u WinMainafsluiten.
Het systeem geeft het hoofdvenster niet automatisch weer nadat het is gemaakt; In plaats daarvan moet een toepassing de functie ShowWindow gebruiken om het hoofdvenster weer te geven. Na het maken van het hoofdvenster roept de WinMain-functie de ShowWindowaan en geeft daarbij twee parameters door: een verwijzing naar het hoofdvenster en een vlag die aangeeft of het hoofdvenster moet worden geminimaliseerd of gemaximaliseerd wanneer het voor het eerst wordt weergegeven. Normaal gesproken kan de vlag worden ingesteld op een van de constanten die beginnen met het voorvoegsel SW_. Wanneer ShowWindow- echter wordt aangeroepen om het hoofdvenster van de toepassing weer te geven, moet de vlag worden ingesteld op SW_SHOWDEFAULT. Met deze vlag geeft het systeem aan dat het venster moet worden weergegeven zoals geïnstrueerd door het programma dat de toepassing heeft gestart.
Als een vensterklasse is geregistreerd met de Unicode-versie van RegisterClass, ontvangt het venster alleen Unicode-berichten. Als u wilt bepalen of een venster gebruikmaakt van de Unicode-tekenset of niet, roept u IsWindowUnicodeaan.
Window-Creation berichten
Wanneer u een venster maakt, verzendt het systeem berichten naar de vensterprocedure voor het venster. Het systeem verzendt het WM_NCCREATE bericht na het maken van het niet-clientgebied van het venster en het WM_CREATE bericht na het maken van het clientgebied. De vensterprocedure ontvangt beide berichten voordat het systeem het venster weergeeft. Beide berichten bevatten een aanwijzer naar een CREATESTRUCT structuur die alle informatie bevat die is opgegeven in de functie CreateWindowEx. Normaal gesproken voert de vensterprocedure initialisatietaken uit bij het ontvangen van deze berichten.
Wanneer u een onderliggend venster maakt, verzendt het systeem het WM_PARENTNOTIFY bericht naar het bovenliggende venster nadat de WM_NCCREATE en WM_CREATE berichten zijn verzonden. Er worden ook andere berichten verzonden tijdens het maken van een venster. Het aantal en de volgorde van deze berichten zijn afhankelijk van de vensterklasse en -stijl en de functie die wordt gebruikt om het venster te maken. Deze berichten worden beschreven in andere onderwerpen in dit Help-bestand.
Multithread-toepassingen
Een Windows-toepassing kan meerdere threads van uitvoering hebben en elke thread kan vensters maken. De thread die een venster maakt, moet de code voor de vensterprocedure bevatten.
Een toepassing kan de functie EnumThreadWindows gebruiken om de vensters op te sommen die door een bepaalde thread zijn gemaakt. Met deze functie wordt de hendel achtereenvolgens doorgegeven aan elke thread window, aan een applicatie-gedefinieerde callback-functie EnumThreadWndProc.
De functie GetWindowThreadProcessId retourneert de id van de thread die een bepaald venster heeft gemaakt.
Als u de weergavestatus van een venster wilt instellen dat door een andere thread is gemaakt, gebruikt u de functie ShowWindowAsync.