Delen via


Dialoogvensters over

Er zijn veel functies, berichten en vooraf gedefinieerde besturingselementen waarmee u dialoogvensters kunt maken en beheren, zodat u de gebruikersinterface voor een toepassing gemakkelijker kunt ontwikkelen. In dit overzicht worden de functies en berichten van het dialoogvenster beschreven en wordt uitgelegd hoe u deze kunt gebruiken om dialoogvensters te maken en te gebruiken.

Dit overzicht bevat de volgende onderwerpen:

Zie Algemene dialoogvensterbibliotheekvoor meer informatie over de algemene dialoogvensters.

Wanneer een dialoogvenster gebruiken

De meeste toepassingen gebruiken dialoogvensters om aanvullende informatie te vragen voor menu-items waarvoor gebruikersinvoer is vereist. Het gebruik van een dialoogvenster is de enige aanbevolen manier voor een toepassing om de invoer op te halen. Een typisch -menu-item Openen vereist bijvoorbeeld de naam van een bestand dat moet worden geopend. Daarom moet een applicatie een dialoogvenster gebruiken om de gebruiker om deze naam te vragen. In dergelijke gevallen maakt de toepassing het dialoogvenster wanneer de gebruiker op het menu-item klikt en het dialoogvenster onmiddellijk nadat de gebruiker de informatie heeft verstrekt, vernietigd.

Veel toepassingen gebruiken ook dialoogvensters om informatie of opties weer te geven terwijl de gebruiker in een ander venster werkt. Tekstverwerkingstoepassingen gebruiken bijvoorbeeld vaak een dialoogvenster met een tekstzoekoptie. Terwijl de toepassing naar de tekst zoekt, blijft het dialoogvenster op het scherm staan. De gebruiker kan vervolgens terugkeren naar het dialoogvenster en opnieuw naar hetzelfde woord zoeken; of de gebruiker kan de vermelding in het dialoogvenster wijzigen en naar een nieuw woord zoeken. Toepassingen die op deze manier dialoogvensters gebruiken, maken er meestal een wanneer de gebruiker op het menu-item klikt en deze blijft weergeven zolang de toepassing wordt uitgevoerd of totdat de gebruiker het dialoogvenster expliciet sluit.

Ter ondersteuning van de verschillende manieren waarop toepassingen dialoogvensters gebruiken, zijn er twee typen dialoogvensters: modaal en modusloos. Een modaal dialoogvenster vereist dat de gebruiker informatie opgeeft of het dialoogvenster annuleert voordat de toepassing kan doorgaan. Toepassingen gebruiken modale dialoogvensters in combinatie met menu-items waarvoor aanvullende informatie is vereist voordat ze verder kunnen gaan. Met een modeless dialoogvenster kan de gebruiker informatie opgeven en terugkeren naar de vorige taak zonder het dialoogvenster te sluiten. Modale dialoogvensters zijn eenvoudiger te beheren dan modusloze dialoogvensters omdat ze worden gemaakt, hun taak uitvoeren en worden vernietigd door één functie aan te roepen.

Als u een modaal of modusloos dialoogvenster wilt maken, moet een toepassing een dialoogvenstersjabloon opgeven om de stijl en inhoud van het dialoogvenster te beschrijven; de toepassing moet ook een dialoogvensterprocedure opgeven om taken uit te voeren. De dialoogvenstersjabloon is een binaire beschrijving van het dialoogvenster en de besturingselementen die het bevat. De ontwikkelaar kan deze sjabloon maken als een resource die moet worden geladen vanuit het uitvoerbare bestand van de toepassing of in het geheugen wordt gemaakt terwijl de toepassing wordt uitgevoerd. De dialoogvensterprocedure is een door de toepassing gedefinieerde callback-functie die door het systeem wordt aangeroepen wanneer deze invoer bevat voor het dialoogvenster of taken voor het dialoogvenster dat moet worden uitgevoerd. Hoewel een dialoogvensterprocedure vergelijkbaar is met een vensterprocedure, heeft deze niet dezelfde verantwoordelijkheden.

Een toepassing maakt doorgaans een dialoogvenster met behulp van het dialoogvenster of functie CreateDialog. DialogBox maakt een modaal dialoogvenster; CreateDialog maakt een modeless dialoogvenster. Deze twee functies laden een dialoogvenstersjabloon uit het uitvoerbare bestand van de toepassing en maken een pop-upvenster dat overeenkomt met de specificaties van de sjabloon. Er zijn andere functies die een dialoogvenster maken met behulp van sjablonen in het geheugen; ze geven aanvullende informatie door aan de dialoogvensterprocedure wanneer het dialoogvenster wordt gemaakt.

Dialoogvensters behoren meestal tot een vooraf gedefinieerde, exclusieve vensterklasse. Het systeem gebruikt deze vensterklasse en de bijbehorende vensterprocedure voor zowel modale als modusloze dialoogvensters. Wanneer de functie wordt aangeroepen, wordt het venster voor het dialoogvenster gemaakt, evenals de vensters voor de besturingselementen in het dialoogvenster en worden geselecteerde berichten naar de dialoogvensterprocedure verzonden. Hoewel het dialoogvenster zichtbaar is, worden met de vooraf gedefinieerde vensterprocedure alle berichten beheerd, sommige berichten verwerkt en anderen doorgegeven aan de dialoogvensterprocedure, zodat de procedure taken kan uitvoeren. Toepassingen hebben geen directe toegang tot de vooraf gedefinieerde vensterklasse of -vensterprocedure, maar ze kunnen de dialoogvenstersjabloon en dialoogvensterprocedure gebruiken om de stijl en het gedrag van een dialoogvenster te wijzigen.

Venster Eigenaar van dialoogvenster

De meeste dialoogvensters hebben een eigenaarsvenster (of simpelweg een eigenaar). Wanneer het dialoogvenster wordt gemaakt, stelt de toepassing de eigenaar in door de venstergreep van de eigenaar op te geven. Het systeem gebruikt de eigenaar om de positie van het dialoogvenster in de Z-volgorde te bepalen, zodat het dialoogvenster altijd boven de eigenaar wordt geplaatst. Het systeem kan ook berichten verzenden naar de vensterprocedure van de eigenaar, waarbij het op de hoogte wordt gesteld van gebeurtenissen in het dialoogvenster.

Het systeem verbergt of vernietigt het dialoogvenster automatisch wanneer de eigenaar verborgen of vernietigd is. Dit betekent dat de dialoogvensterprocedure geen speciale verwerking vereist om wijzigingen in de status van het venster van de eigenaar te detecteren.

Omdat het typische dialoogvenster wordt gebruikt in combinatie met een menu-item, is het venster van de eigenaar meestal het venster met het menu. Hoewel het mogelijk is om een dialoogvenster te maken dat geen eigenaar heeft, wordt het afgeraden. Als een modaal dialoogvenster bijvoorbeeld geen eigenaar heeft, schakelt het systeem geen andere vensters van de toepassing uit en kan de gebruiker werk blijven uitvoeren in de andere vensters, waardoor het doel van het modale dialoogvenster wordt verslagen.

Wanneer een modeless dialoogvenster geen eigenaar heeft, wordt het dialoogvenster niet verborgen of vernietigd wanneer andere vensters in de applicatie worden verborgen of vernietigd. Hoewel dit het doel van het modelloze dialoogvenster niet tenietdoet, moet de toepassing speciale verwerking uitvoeren om ervoor te zorgen dat het dialoogvenster op de juiste momenten wordt verborgen en vernietigd.

Berichtvensters

Een berichtvak is een speciaal dialoogvenster dat een toepassing kan gebruiken om berichten weer te geven en om eenvoudige invoer te vragen. Een berichtvak bevat meestal een tekstbericht en een of meer knoppen. Een toepassing maakt het berichtvak met behulp van de functie MessageBox of MessageBoxEx, waarbij de tekst en het aantal knoppen worden opgegeven dat moet worden weergegeven. Houd er rekening mee dat er momenteel geen verschil is tussen hoe MessageBox en MessageBoxEx werken.

Hoewel het berichtvak een dialoogvenster is, heeft het systeem volledige controle over het maken en beheren van het berichtvak. Dit betekent dat de toepassing geen dialoogvenstersjabloon en dialoogvensterprocedure bevat. Het systeem maakt een eigen sjabloon op basis van de tekst en knoppen die zijn opgegeven voor het berichtvak en levert een eigen dialoogvensterprocedure.

Een berichtvak is een modaal dialoogvenster en het systeem maakt het met behulp van dezelfde interne functies die Dialoogvenster gebruikt. Als de toepassing een eigenaarvenster opgeeft bij het aanroepen van MessageBox of MessageBoxEx, schakelt het systeem de eigenaar uit. Een toepassing kan het systeem ook omsturen om alle vensters op het hoogste niveau uit te schakelen die behoren tot de huidige thread door de MB_TASKMODAL waarde op te geven bij het maken van het dialoogvenster.

Het systeem kan berichten verzenden naar de eigenaar, zoals WM_CANCELMODE en WM_ENABLE, net zoals bij het maken van een modaal dialoogvenster. Het venster Eigenaar moet alle acties uitvoeren die door deze berichten worden aangevraagd.

Een modaal dialoogvenster moet een pop-upvenster zijn met een venstermenu, een titelbalk en een dikke rand; Dat wil gezegd, de dialoogvenstersjabloon moet de stijlen WS_POPUP, WS_SYSMENU, WS_CAPTIONen DS_MODALFRAME opgeven. Hoewel een toepassing de WS_VISIBLE stijl kan aanwijzen, wordt in het systeem altijd een modaal dialoogvenster weergegeven, ongeacht of de dialoogvenstersjabloon de WS_VISIBLE stijl aangeeft. Een toepassing mag geen modaal dialoogvenster met de stijl WS_CHILD maken. Een modaal dialoogvenster met deze stijl schakelt zichzelf uit, waardoor eventuele volgende invoer de toepassing niet kan bereiken.

Een toepassing maakt een modaal dialoogvenster met behulp van de functie Dialoogvenster of DialogBoxIndirect. dialoogvenster vereist de naam of id van een resource met een dialoogvenstersjabloon; DialogBoxIndirect- vereist een ingang voor een geheugenobject met een dialoogvenstersjabloon. De functies DialogBoxParam en DialogBoxIndirectParam maken ook modale dialoogvensters; ze zijn identiek aan de eerder genoemde functies, maar geven een opgegeven parameter door aan de dialoogvensterprocedure wanneer het dialoogvenster wordt gemaakt.

Wanneer u het modale dialoogvenster maakt, maakt het systeem het actieve venster. Het dialoogvenster blijft actief totdat de dialoogvensterprocedure de EndDialog-functie aanroept of het systeem een venster activeert in een andere toepassing. De gebruiker of de toepassing kan het eigenaarsvenster niet actief maken totdat het modale dialoogvenster wordt vernietigd.

Wanneer het eigenaarvenster nog niet is uitgeschakeld, worden het venster en eventuele onderliggende vensters die eraan horen automatisch uitgeschakeld wanneer het modaal dialoogvenster wordt gemaakt. Het venster eigenaar blijft uitgeschakeld totdat het dialoogvenster wordt vernietigd. Hoewel een dialoogvensterprocedure het eigenaarvenster op elk gewenst moment kan inschakelen, doet dit het doel van het modale dialoogvenster teniet. Daarom wordt het niet aanbevolen om de eigenaar in te schakelen. Wanneer de dialoogvensterprocedure wordt vernietigd, schakelt het systeem het venster van de eigenaar opnieuw in, maar alleen als het modale dialoogvenster ervoor heeft gezorgd dat de eigenaar werd uitgeschakeld.

Terwijl het systeem het modale dialoogvenster maakt, wordt het WM_CANCELMODE bericht verzonden naar het venster (indien aanwezig) dat momenteel muisinvoer vastlegt. Een toepassing die dit bericht ontvangt, moet de muisopname vrijgeven, zodat de gebruiker de muis in het modale dialoogvenster kan verplaatsen. Omdat het systeem het eigenaarsvenster uitschakelt, gaan alle muisinvoer verloren als de eigenaar de muis niet loslaat bij het ontvangen van dit bericht.

Als u berichten voor het modale dialoogvenster wilt verwerken, start het systeem een eigen berichtenlus, waarbij het tijdelijk beheer van de berichtenwachtrij voor de hele toepassing wordt uitgevoerd. Wanneer het systeem een bericht ophaalt dat niet expliciet voor het dialoogvenster staat, wordt het bericht naar het juiste venster verzonden. Als er een WM_QUIT bericht wordt opgehaald, wordt het bericht terug geplaatst in de berichtenwachtrij van de toepassing, zodat de hoofdberichtlus van de toepassing uiteindelijk het bericht kan ophalen.

Het systeem verzendt het WM_ENTERIDLE bericht naar het eigenaarsvenster wanneer de wachtrij voor toepassingsberichten leeg is. De toepassing kan dit bericht gebruiken om een achtergrondtaak uit te voeren terwijl het dialoogvenster op het scherm blijft staan. Wanneer een toepassing op deze manier gebruikmaakt van het bericht, moet de toepassing vaak controle opleveren (bijvoorbeeld met behulp van de functie PeekMessage), zodat het modale dialoogvenster gebruikersinvoer kan ontvangen. Om te voorkomen dat het modale dialoogvenster de WM_ENTERIDLE berichten verzendt, kan de toepassing de DS_NOIDLEMSG stijl opgeven bij het maken van het dialoogvenster.

Een toepassing vernietigt een modaal dialoogvenster met behulp van de functie EndDialog. In de meeste gevallen roept de dialoogvensterprocedure EndDialog- aan wanneer de gebruiker op sluiten klikt in het venstermenu van het dialoogvenster of op de knop OK of knop Annuleren in het dialoogvenster klikt. Het dialoogvenster kan een waarde retourneren via het dialoogvenster functie (of andere aanmaakfuncties) door een waarde op te geven bij het aanroepen van de EndDialog-functie. Het systeem retourneert deze waarde nadat het dialoogvenster is vernietigd. De meeste toepassingen gebruiken deze retourwaarde om te bepalen of het dialoogvenster de taak heeft voltooid of is geannuleerd door de gebruiker. Het systeem geeft de besturing niet terug vanuit de functie die het dialoogvenster aanmaakt totdat de procedure van het dialoogvenster de EndDialog functie heeft aangeroepen.

Dialoogvensters zonder modus

Een modusloos dialoogvenster moet een pop-upvenster zijn met een venstermenu, een titelbalk en een dunne rand; dat wil zeggen, de dialoogvenstersjabloon moet de stijlen WS_POPUP, WS_CAPTION, WS_BORDERen WS_SYSMENU opgeven. Het dialoogvenster wordt niet automatisch weergegeven in het systeem, tenzij de sjabloon de stijl WS_VISIBLE opgeeft.

Een toepassing maakt een modeless dialoogvenster met behulp van de functie CreateDialog of CreateDialogIndirect. CreateDialog- vereist de naam of id van een resource met een dialoogvenstersjabloon; CreateDialogIndirect- vereist een ingang voor een geheugenobject met een dialoogvenstersjabloon. Twee andere functies, CreateDialogParam en CreateDialogIndirectParam, creëren ook modeless dialoogvensters; ze geven een gespecificeerde parameter door aan de dialoogvensterprocedure wanneer het dialoogvenster wordt gemaakt.

CreateDialog en andere aanmaakfuncties retourneren een venstergreep naar het dialoogvenster. De toepassing en de dialoogvensterprocedure kunnen deze ingang gebruiken om het dialoogvenster te beheren. Als WS_VISIBLE bijvoorbeeld niet is opgegeven in de dialoogvenstersjabloon, kan de toepassing het dialoogvenster weergeven door de venstergreep door te geven aan de functie ShowWindow.

Een modeless dialoogvenster schakelt het venster van de eigenaar niet uit en verzendt er ook geen berichten naartoe. Wanneer u het dialoogvenster maakt, maakt het systeem het actieve venster, maar de gebruiker of de toepassing kan het actieve venster op elk gewenst moment wijzigen. Als het dialoogvenster inactief wordt, blijft het boven het venster eigenaar in de Z-volgorde, zelfs als het venster eigenaar actief is.

De toepassing is verantwoordelijk voor het ophalen en verzenden van invoerberichten naar het dialoogvenster. De meeste toepassingen gebruiken hiervoor de hoofdberichtlus. Als u de gebruiker wilt toestaan om besturingselementen te verplaatsen en te selecteren met behulp van het toetsenbord, moet de toepassing echter de isDialogMessage functie aanroepen. Zie Dialoogvenster toetsenbordinterfacevoor meer informatie over deze functie.

Een modusloos dialoogvenster kan geen waarde aan de toepassing retourneren zoals een modaal dialoogvenster dat kan, maar de dialoogvensterprocedure kan informatie naar het eigenaarsvenster sturen met behulp van de functie SendMessage.

Een toepassing moet alle modusloze dialoogvensters vernietigen voordat deze worden beëindigd. Het kan een modusloos dialoogvenster vernietigen met behulp van de DestroyWindow functie. In de meeste gevallen roept de dialoogvensterprocedure DestroyWindow- aan als reactie op gebruikersinvoer, zoals klikken op de knop Annuleren. Als de gebruiker het dialoogvenster op deze manier nooit sluit, moet de toepassing DestroyWindow-aanroepen.

DestroyWindow maakt het vensterhandvat ongeldig voor het dialoogvenster, zodat eventuele volgende aanroepen naar functies die het handvat gebruiken, foutwaarden retourneren. Om fouten te voorkomen, moet in de dialoogvensterprocedure de eigenaar worden geïnformeerd dat het dialoogvenster is vernietigd. Veel toepassingen onderhouden een globale variabele met de ingang naar het dialoogvenster. Wanneer de dialoogvensterprocedure het dialoogvenster vernietigt, wordt ook de globale variabele ingesteld op NULL-, waarmee wordt aangegeven dat het dialoogvenster niet meer geldig is.

De dialoogvensterprocedure mag de functie EndDialog niet aanroepen om een modeless dialoogvenster te vernietigen.

Dialoogvenstersjablonen

Een dialoogvenstersjabloon is binaire gegevens die het dialoogvenster beschrijven, de hoogte, breedte, stijl en de besturingselementen definiëren die het bevat. Om een dialoogvenster aan te maken, laadt het systeem een dialoogvenstersjabloon vanuit de resources in het uitvoerbare bestand van de toepassing of gebruikt het de sjabloon die door de toepassing wordt doorgegeven in het globale geheugen. In beide gevallen moet de toepassing een sjabloon opgeven bij het maken van een dialoogvenster.

Een ontwikkelaar maakt sjabloonresources met behulp van een resourcecompilator of een dialoogvenstereditor. Een resourcecompilator converteert een tekstbeschrijving naar een binaire resource en een dialoogvenstereditor slaat een interactief samengesteld dialoogvenster op als een binaire resource.

Notitie

Een uitleg over het maken van sjabloonbronnen en het toevoegen ervan aan het uitvoerbare bestand van de toepassing valt buiten het bereik van dit overzicht. Zie de documentatie van uw ontwikkelhulpprogramma's voor toepassingen voor meer informatie over het maken van sjabloonresources en het toevoegen ervan aan een uitvoerbaar bestand.

 

Als u een dialoogvenster wilt maken zonder sjabloonbronnen te gebruiken, moet u een sjabloon in het geheugen maken en deze doorgeven aan de functie CreateDialogIndirectParam of DialogBoxIndirectParam of aan de macro CreateDialogIndirect of DialogBoxIn direct.

Een dialoogvenstersjabloon in het geheugen bestaat uit een koptekst waarin het dialoogvenster wordt beschreven, gevolgd door een of meer extra gegevensblokken die elk van de besturingselementen in het dialoogvenster beschrijven. De sjabloon kan de standaardindeling of de uitgebreide indeling gebruiken. In een standaardsjabloon is de header een DLGTEMPLATE structuur gevolgd door extra matrices met een variabele lengte; en de gegevens voor elk besturingselement bestaan uit een DLGITEMTEMPLATE structuur gevolgd door extra matrices met een variabele lengte. In een uitgebreide dialoogvenstersjabloon gebruikt de koptekst de DLGTEMPLATEEX-indeling en de besturingsdefinities gebruiken de DLGITEMTEMPLATEEX-indeling.

U kunt een geheugensjabloon maken door een globaal geheugenobject toe te wijzen en dit te vullen met de standaard- of uitgebreide header- en besturingsdefinities. Een geheugensjabloon is identiek in formulier en inhoud aan een sjabloonresource. Veel toepassingen die geheugensjablonen gebruiken, gebruiken eerst de functie LoadResource om een sjabloonresource in het geheugen te laden en wijzig vervolgens de geladen resource om een nieuwe geheugensjabloon te maken. Zie voor meer informatie over het maken van een dialoogvenstersjabloon in het geheugen Sjablonen in geheugen.

In de volgende secties worden de stijlen, afmetingen en andere waarden beschreven die worden gebruikt in een dialoogvenstersjabloon.

Sjabloonstijlen in dialoogvenster

Elke dialoogvenstersjabloon geeft een combinatie van stijlwaarden op die het uiterlijk en de functies van het dialoogvenster definiëren. De stijlwaarden kunnen vensterstijlen zijn, zoals WS_POPUP en WS_SYSMENU, en dialoogvensterstijlen, zoals DS_MODALFRAME. Het aantal stijlen en het type stijlen voor een sjabloon is afhankelijk van het type en doel van het dialoogvenster. Zie dialoogvensterstijlenvoor een lijst met waarden.

Het systeem geeft alle vensterstijlen die in de sjabloon zijn opgegeven door aan de functie CreateWindowEx bij het maken van het dialoogvenster. Het systeem kan een of meer uitgebreide stijlen doorgeven, afhankelijk van de opgegeven dialoogvensterstijlen. Wanneer de sjabloon bijvoorbeeld DS_MODALFRAMEopgeeft, gebruikt het systeem WS_EX_DLGMODALFRAME bij het maken van het dialoogvenster.

De meeste dialoogvensters zijn pop-upvensters met een venstermenu en een titelbalk. Daarom geeft de standaardsjabloon de stijlen WS_POPUP, WS_SYSMENUen WS_CAPTION op. De sjabloon geeft ook een randstijl op: WS_BORDER voor niet-modale dialoogvensters en DS_MODALFRAME voor modale dialoogvensters. Een sjabloon kan een ander venstertype dan pop-uptype (zoals WS_OVERLAPPED) opgeven als er een aangepast venster wordt gemaakt in plaats van een dialoogvenster.

Het systeem geeft altijd een modaal dialoogvenster weer, ongeacht of de stijl WS_VISIBLE is opgegeven. Wanneer de sjabloon voor een modeless dialoogvenster de stijl WS_VISIBLE opgeeft, wordt het dialoogvenster automatisch weergegeven wanneer het wordt gemaakt. Anders is de toepassing verantwoordelijk voor het weergeven van het dialoogvenster met behulp van de functie ShowWindow.

Metingen van dialoogvenster

Elke dialoogvenstersjabloon bevat metingen waarmee de positie, breedte en hoogte van het dialoogvenster worden opgegeven en de besturingselementen die het bevat. Deze metingen zijn apparaatonafhankelijk, zodat een toepassing één sjabloon kan gebruiken om hetzelfde dialoogvenster te maken voor alle typen weergaveapparaten. Dit zorgt ervoor dat een dialoogvenster dezelfde verhoudingen en uiterlijk heeft op alle schermen, ondanks verschillende resoluties en hoogte-breedteverhoudingen tussen schermen.

De afmetingen in een dialoogvenstersjabloon worden opgegeven in dialoogvenstersjablooneenheden. Als u afmetingen wilt converteren van dialoogvenstersjablooneenheden naar schermeenheden (pixels), gebruikt u de functie MapDialogRect, waarbij rekening wordt gehouden met het lettertype dat door het dialoogvenster wordt gebruikt en een rechthoek correct converteert van dialoogvenstersjablooneenheden naar pixels. Voor dialoogvensters die het systeemlettertype gebruiken, kunt u de functie GetDialogBaseUnits gebruiken om de conversieberekeningen zelf uit te voeren, hoewel het gebruik van MapDialogRect eenvoudiger is.

De sjabloon moet de eerste coördinaten van de linkerbovenhoek van het dialoogvenster opgeven. Meestal zijn de coördinaten relatief ten opzichte van de linkerbovenhoek van het clientgebied van het eigenaarvenster. Wanneer de sjabloon de DS_ABSALIGN stijl opgeeft of het dialoogvenster geen eigenaar heeft, is de positie relatief ten opzichte van de linkerbovenhoek van het scherm. Het systeem stelt deze initiële positie in bij het maken van het dialoogvenster, maar hiermee kan een toepassing de positie aanpassen voordat het dialoogvenster wordt weergegeven. Een toepassing kan bijvoorbeeld de afmetingen van het eigenaarsvenster ophalen, een nieuwe positie berekenen die het dialoogvenster centreert in het eigenaarsvenster en vervolgens de positie instellen met behulp van de functie SetWindowPos.

De sjabloon moet een dialoogvensterbreedte en -hoogte opgeven die niet groter is dan de breedte en hoogte van het scherm en zorgt ervoor dat alle besturingselementen zich in het clientgebied van het dialoogvenster bevinden. Hoewel het systeem toestaat dat een dialoogvenster elke grootte heeft, kan het maken van een dialoogvenster dat te klein of te groot is, verhinderen dat de gebruiker invoer kan leveren, waardoor het doel van het dialoogvenster wordt verslagen. Veel apps gebruiken meer dan één dialoogvenster wanneer er veel bedieningselementen zijn. In dergelijke gevallen bevat het eerste dialoogvenster meestal een of meer knoppen die de gebruiker kan kiezen om het volgende dialoogvenster weer te geven.

Dialoogvensterbedieningselementen

De sjabloon geeft de positie, breedte, hoogte, stijl, id en vensterklasse op voor elk besturingselement in het dialoogvenster. Het systeem maakt elk bedieningselement door deze gegevens door te geven aan de functie CreateWindowEx. Besturingselementen worden gemaakt in de volgorde waarin ze zijn opgegeven in de sjabloon. De sjabloon moet het juiste aantal, type en volgorde van besturingselementen opgeven om ervoor te zorgen dat de gebruiker de invoer kan invoeren die nodig is voor het voltooien van de taak die aan het dialoogvenster is gekoppeld.

Voor elk besturingselement geeft de sjabloon stijlwaarden op die het uiterlijk en de werking van het besturingselement definiëren. Elk bedieningselement is een onderliggend venster en moet daarom de stijl WS_CHILD hebben. Om ervoor te zorgen dat het besturingselement zichtbaar is wanneer het dialoogvenster wordt weergegeven, moet elk besturingselement ook de WS_VISIBLE stijl hebben. Andere veelgebruikte vensterstijlen zijn WS_BORDER voor besturingselementen met optionele randen, WS_DISABLED voor besturingselementen die moeten worden uitgeschakeld wanneer het dialoogvenster in eerste instantie wordt gemaakt, en WS_TABSTOP en WS_GROUP voor besturingselementen die kunnen worden geopend met het toetsenbord. De stijlen WS_TABSTOP en WS_GROUP worden gebruikt in combinatie met de dialoogvenstertoetsenbordinterface die verderop in dit onderwerp wordt beschreven.

De sjabloon kan ook besturingsstijlen opgeven die specifiek zijn voor de vensterklasse van het besturingselement. Een sjabloon waarmee een knop besturingselement wordt opgegeven, moet bijvoorbeeld een knopbesturingsstijl geven, zoals BS_PUSHBUTTON of BS_CHECKBOX. Het systeem geeft de besturingsstijlen door aan de besturingsvensterprocedure via het WM_CREATE bericht, zodat de procedure het uiterlijk en de werking van het besturingselement kan aanpassen.

Het systeem converteert de positiecoördinaten en de breedte- en hoogtemetingen van dialoogvensterbasiseenheden naar pixels voordat deze worden doorgegeven aan CreateWindowEx-. Wanneer het systeem een besturingselement maakt, wordt het dialoogvenster opgegeven als het bovenliggende venster. Dit betekent dat het systeem altijd de positiecoördinaten van het besturingselement interpreteert als clientcoördinaten, ten opzichte van de linkerbovenhoek van het clientgebied van het dialoogvenster.

De sjabloon geeft de vensterklasse voor elk besturingselement op. Een standaarddialoogvenster bevat besturingselementen die behoren tot de vooraf gedefinieerde besturingselementvensterklassen, zoals de knop en besturingselementvensterklassen bewerken. In dit geval geeft de sjabloon vensterklassen op door de bijbehorende vooraf gedefinieerde atoomwaarden voor de klassen op te geven. Wanneer een dialoogvenster een besturingselement bevat dat hoort bij een aangepaste besturingselementvensterklasse, geeft de sjabloon de naam van die geregistreerde vensterklasse of de atoomwaarde die momenteel aan de naam is gekoppeld.

Elk besturingselement in een dialoogvenster moet een unieke id hebben om het te onderscheiden van andere besturingselementen. Besturingselementen verzenden informatie naar de dialoogvensterprocedure via WM_COMMAND berichten, zodat de besturings-id's essentieel zijn voor de procedure om te bepalen welk besturingselement een opgegeven bericht heeft verzonden. De enige uitzondering op deze regel zijn besturings-id's voor statische besturingselementen. Statische bedieningselementen vereisen geen unieke identificaties omdat ze geen WM_COMMAND berichten verzenden.

Als u wilt toestaan dat de gebruiker het dialoogvenster sluit, moet de sjabloon ten minste één drukknop opgeven en deze de besturings-id geven IDCANCEL. Om de gebruiker in staat te stellen te kiezen tussen het voltooien of annuleren van de taak die aan het dialoogvenster is gekoppeld, moet de sjabloon twee drukknoppen opgeven met het label OK en Annuleren, met besturings-id's van respectievelijk IDOK- en IDCANCEL-.

Een sjabloon specificeert ook optionele tekst en creatiegegevens voor een bedieningselement. De tekst bevat doorgaans labels voor knopbesturingselementen of geeft de initiële inhoud van een statisch tekstbesturingselement op. De aanmaakgegevens zijn een of meer bytes aan gegevens die het systeem doorgeeft aan de procedure voor het besturingselementvenster bij het maken van het besturingselement. Creatiegegevens zijn nuttig voor besturingselementen waarvoor meer informatie over de oorspronkelijke inhoud of stijl nodig is dan door andere gegevens is opgegeven. Een toepassing kan bijvoorbeeld creatiedata gebruiken om de initiële instelling en het bereik voor een schuifbalkbesturingselement in te stellen.

Dialoogvenstermenu

Het systeem geeft een dialoogvenster een venstermenu wanneer de sjabloon de WS_SYSMENU stijl opgeeft. Om ongepaste invoer te voorkomen, worden alle items in het menu automatisch uitgeschakeld, behalve Verplaatsen en sluiten. De gebruiker kan op klikken om het dialoogvenster te verplaatsen. Wanneer de gebruiker op sluiten klikt, verzendt het systeem een WM_COMMAND bericht naar de dialoogvensterprocedure met de parameter wParam ingesteld op IDCANCEL-. Dit is identiek aan het bericht dat is verzonden door de knop Annuleren wanneer de gebruiker erop klikt. De aanbevolen actie voor dit bericht is om het dialoogvenster te sluiten en de aangevraagde taak te annuleren.

Hoewel andere menu's in dialoogvensters niet worden aanbevolen, kan een dialoogvenstersjabloon een menu opgeven door de id of de naam van een menuresource op te geven. In dit geval wordt de resource geladen en wordt het menu voor het dialoogvenster gemaakt. Toepassingen gebruiken doorgaans menu-id's of namen in sjablonen wanneer u de sjablonen gebruikt om aangepaste vensters te maken in plaats van dialoogvensters.

Dialoogvensterlettertypen

Het systeem gebruikt de gemiddelde tekenbreedte van het dialoogvensterlettertype om de positie en afmetingen van het dialoogvenster te berekenen. Standaard tekent het systeem alle tekst in een dialoogvenster met behulp van het SYSTEM_FONT lettertype.

Als u een lettertype wilt opgeven voor een ander dialoogvenster dan de standaardinstelling, moet u het dialoogvenster maken met behulp van een dialoogvenstersjabloon. Gebruik in een sjabloonresource de FONT-instructie. Stel in een dialoogvenstersjabloon de stijl DS_SETFONT of DS_SHELLFONT in en geef een puntgrootte en een naam voor het lettertype op. Zelfs als een dialoogvenstersjabloon op deze manier een lettertype opgeeft, gebruikt het systeem altijd het systeemlettertype voor de titel van het dialoogvenster en dialoogvenstermenu's.

Wanneer het dialoogvenster de stijl DS_SETFONT of DS_SHELLFONT heeft, stuurt het systeem een WM_SETFONT bericht naar de dialoogvensterprocedure en naar elke control tijdens het aanmaken daarvan. De dialoogvensterprocedure is verantwoordelijk voor het opslaan van de lettertypegreep die wordt meegegeven met het WM_SETFONT bericht en het selecteren van de greep in de weergaveapparaatcontext wanneer deze tekst naar het venster schrijft. Vooraf gedefinieerde besturingselementen doen dit standaard.

Het systeemlettertype kan variëren tussen verschillende versies van Windows. Als u wilt dat uw toepassing het systeemlettertype gebruikt, ongeacht het systeem waarop het wordt uitgevoerd, gebruikt u DS_SHELLFONT met het lettertype MS Shell Dlg en gebruikt u de DIALOGEX-resource in plaats van de DIALOG-resource. Het systeem wijst dit lettertype toe, zodat het lettertype Tahoma in het dialoogvenster wordt gebruikt. Houd er rekening mee dat DS_SHELLFONT geen effect heeft als het lettertype niet MS Shell Dlg is.

Sjablonen in het geheugen

Een dialoogvenstersjabloon in het geheugen bestaat uit een koptekst waarin het dialoogvenster wordt beschreven, gevolgd door een of meer extra gegevensblokken die elk van de besturingselementen in het dialoogvenster beschrijven. De sjabloon kan de standaardindeling of de uitgebreide indeling gebruiken. In een standaardsjabloon is de header een DLGTEMPLATE structuur, gevolgd door extra matrices met een variabele lengte. De gegevens voor elk besturingselement bestaan uit een DLGITEMTEMPLATE structuur, gevolgd door extra matrices met een variabele lengte. In een uitgebreide dialoogvenstersjabloon gebruikt de koptekst de DLGTEMPLATEEX-indeling en de besturingsdefinities gebruiken de DLGITEMTEMPLATEEX-indeling.

Als u onderscheid wilt maken tussen een standaardsjabloon en een uitgebreide sjabloon, controleert u de eerste 16 bits van een dialoogvenstersjabloon. In een uitgebreide sjabloon is de eerste WORD 0xFFFF; elke andere waarde duidt op een standaardsjabloon.

Als u een dialoogvenstersjabloon in het geheugen maakt, moet u ervoor zorgen dat elk van de DLGITEMTEMPLATE- of DLGITEMTEMPLATEEX besturingsdefinities is uitgelijnd op DWORD- grenzen. Daarnaast moeten alle aanmaakgegevens die volgen op een besturingsdefinitie worden uitgelijnd op een DWORD- grens. Alle andere matrices met variabele lengte in een dialoogvenstersjabloon moeten worden uitgelijnd op WORD- grenzen.

Sjabloonkoptekst

In zowel de standaard- als uitgebreide sjablonen voor dialoogvensters bevat de koptekst de volgende algemene informatie:

  • De locatie en afmetingen van het dialoogvenster
  • De venster- en dialoogstijlen voor het dialoogvenster
  • Het aantal besturingselementen in het dialoogvenster. Deze waarde bepaalt het aantal DLGITEMTEMPLATE- of DLGITEMPLATEEX besturingsdefinities in de sjabloon.
  • Een optionele menuresource voor het dialoogvenster. De sjabloon kan aangeven dat het dialoogvenster geen menu heeft of dat het een rangtelwaarde of null-beëindigde Unicode-tekenreeks kan opgeven die een menuresource in een uitvoerbaar bestand identificeert.
  • De vensterklasse van het dialoogvenster. Dit kan de vooraf gedefinieerde dialoogvensterklasse zijn, een rangtelwaarde of null-beëindigde Unicode-tekenreeks die een geregistreerde vensterklasse identificeert.
  • Een null-beëindigde Unicode-tekenreeks die de titel voor het dialoogvenstervenster aangeeft. Als de tekenreeks leeg is, is de titelbalk van het dialoogvenster leeg. Als het dialoogvenster niet de stijl WS_CAPTION heeft, stelt het systeem de titel in op de opgegeven tekenreeks, maar wordt deze niet weergegeven.
  • Als het dialoogvenster de stijl DS_SETFONT heeft, geeft de koptekst de puntgrootte en de naam van het lettertype op dat moet worden gebruikt voor de tekst in het clientgebied en besturingselementen van het dialoogvenster.

In een uitgebreide sjabloon geeft de DLGTEMPLATEEX koptekst ook de volgende aanvullende informatie op:

  • De Help-context-id van het dialoogvenstervenster wanneer het systeem een WM_HELP bericht verzendt.
  • Als het dialoogvenster de stijl DS_SETFONT of DS_SHELLFONT heeft, geeft de koptekst het tekengewicht aan en geeft aan of het lettertype cursief is.

Definities van besturingselementen

Na de sjabloonheader volgt één of meer definities van besturingselementen die de besturingselementen van het dialoogvenster beschrijven. In zowel de standaard- als de uitgebreide sjablonen heeft de dialoogvensterkop een lid dat het aantal besturingsdefinities in de sjabloon aangeeft. In een standaardsjabloon bestaat elke besturingselementdefinitie uit een DLGITEMTEMPLATE structuur, gevolgd door extra matrices met variabele lengte. In een uitgebreide sjabloon gebruiken de besturingsdefinities de indeling DLGITEMTEMPLATEEX.

In zowel de standaard- als de uitgebreide sjablonen bevat de definitie van het besturingselement de volgende informatie:

  • De locatie en afmetingen van het besturingselement.
  • Het venster en de stijlen voor het besturingselement.
  • De besturingselement-id.
  • De vensterklasse van het besturingselement. Dit kan de rangtelwaarde zijn van een vooraf gedefinieerde systeemklasse of een null-beëindigde Unicode-tekenreeks die de naam van een geregistreerde vensterklasse aangeeft.
  • Een null-beëindigde Unicode-tekenreeks die de initiële tekst van het besturingselement aangeeft, of een rangtelwaarde die een resource, zoals een pictogram, identificeert in een uitvoerbaar bestand.
  • Een optioneel blok van variabele lengte met creatiegegevens. Wanneer het systeem het besturingselement creëert, geeft het een aanwijzer door naar deze gegevens in de parameter lParam van het WM_CREATE bericht dat het naar het besturingselement verzendt.

In een uitgebreide sjabloon geeft de definitie van het besturingselement ook een helpcontext-id voor het besturingselement op wanneer het systeem een WM_HELP-bericht verzendt.