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 overzicht worden enkele programmeeroverwegingen met betrekking tot dialoogvensters besproken.
Het overzicht bevat de volgende onderwerpen.
- Dialoogvensterprocedures
- Dialoogvenster toetsenbordinterface
- dialoogvenster Instellingen
- aangepaste dialoogvensters
Procedures voor dialoogvenster
Een dialoogvensterprocedure is vergelijkbaar met een vensterprocedure waarin het systeem berichten naar de procedure verzendt wanneer het informatie bevat die moet worden verstrekt of taken die moeten worden uitgevoerd. In tegenstelling tot een vensterprocedure roept een dialoogvensterprocedure nooit de DefWindowProc--functie aan. In plaats daarvan retourneert het TRUE als er een bericht wordt verwerkt of FALSE als dat niet het geval is.
Elke dialoogvensterprocedure heeft het volgende formulier:
BOOL CALLBACK DlgProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
// Place message cases here.
default:
return FALSE;
}
}
De procedureparameters dienen hetzelfde doel als in een vensterprocedure, waarbij de hwndDlg parameter het vensterhandvat van het dialoogvenster ontvangt.
De meeste dialoogvensterprocedures verwerken het WM_INITDIALOG bericht en de WM_COMMAND berichten die door de besturingselementen worden verzonden, maar verwerken weinig als er andere berichten zijn. Als een dialoogvensterprocedure geen bericht verwerkt, moet het FALSE retourneren om het systeem aan te wijzen om de berichten intern te verwerken. De enige uitzondering op deze regel is het WM_INITDIALOG bericht. De dialoogvensterprocedure moet TRUE retourneren om het systeem te instrueren het WM_INITDIALOG-bericht verder te verwerken. In ieder geval mag de procedure DefWindowProcniet aanroepen.
- Het WM_INITDIALOG bericht
- Het WM_COMMAND bericht
- Het WM_PARENTNOTIFY bericht
- Control-Color berichten
- Dialoogvenster standaard berichtverwerking
Het WM_INITDIALOG bericht
Het systeem verzendt geen WM_CREATE bericht naar de procedure van het dialoogvenster. In plaats daarvan wordt een WM_INITDIALOG bericht verzonden wanneer het dialoogvenster en alle bijbehorende besturingselementen worden gemaakt, maar voordat het dialoogvenster wordt weergegeven. De procedure moet elke vereiste initialisatie uitvoeren om ervoor te zorgen dat in het dialoogvenster de huidige instellingen worden weergegeven die aan de taak zijn gekoppeld. Wanneer een dialoogvenster bijvoorbeeld een besturingselement bevat om het huidige station en de huidige map weer te geven, moet de procedure het huidige station en de map bepalen en het besturingselement op die waarde instellen.
De procedure kan besturingselementen initialiseren met behulp van functies zoals SetDlgItemText en CheckDlgButton. Omdat besturingselementen vensters zijn, kan de procedure deze ook bewerken met behulp van vensterbeheerfuncties zoals EnableWindow- en SetFocus. Met de procedure kan de venstergreep naar een besturingselement worden opgehaald met behulp van de GetDlgItem--functie.
Met de dialoogvensterprocedure kunt u de inhoud, status en positie van elk besturingselement zo nodig wijzigen. In een dialoogvenster met een lijstvak met bestandsnamen en een Open-knop kan de procedure bijvoorbeeld de Open-knop uitschakelen totdat de gebruiker een bestand uit de lijst selecteert. In dit voorbeeld geeft de dialoogvenstersjabloon de WS_DISABLED stijl op voor de knop Openen en het systeem schakelt de knop automatisch uit bij het maken ervan. Wanneer de dialoogvensterprocedure een melding ontvangt van de keuzelijst die aangeeft dat de gebruiker een bestand heeft geselecteerd, roept de procedure de functie EnableWindow aan om de knop Openen in te schakelen.
Als u een aangepast pictogram wilt weergeven op de bijschriftbalk van het dialoogvenster, kan de WM_INITDIALOG handler het WM_SETICON bericht naar het dialoogvenster verzenden.
Als de toepassing het dialoogvenster maakt met behulp van een van de functies DialogBoxParam, DialogBoxIndirectParam, CreateDialogParamof CreateDialogIndirectParam, bevat de parameter lParam voor het WM_INITDIALOG bericht de extra parameter die aan de functie wordt doorgegeven. Toepassingen gebruiken deze extra parameter doorgaans om een aanwijzer door te geven aan aanvullende initialisatie-informatie aan de dialoogvensterprocedure, maar de procedure in het dialoogvenster moet de betekenis van de parameter bepalen. Als de toepassing een andere functie gebruikt om het dialoogvenster te maken, stelt het systeem de parameter lParam in op NULL-.
Voordat teruggekeerd wordt vanuit het WM_INITDIALOG bericht, moet de procedure bepalen of de invoerfocus op een opgegeven controle moet worden ingesteld. Als de dialoogvensterprocedure TRUEretourneert, wordt de invoerfocus automatisch ingesteld op het besturingselement waarvan de venstergreep zich in de parameter wParam bevindt. Als het besturingselement dat de standaardfocus ontvangt niet geschikt is, kan het de focus instellen op het juiste besturingselement met behulp van de functie SetFocus. Als de procedure de invoerfocus instelt, moet deze ONWAAR retourneren om te voorkomen dat het systeem de standaardfocus instelt. Het besturingselement dat de standaardinvoerfocus ontvangt, is altijd het eerste besturingselement dat is opgegeven in de sjabloon die zichtbaar is, niet is uitgeschakeld en de stijl WS_TABSTOP heeft. Als er geen dergelijk besturingselement bestaat, stelt het systeem de standaardinvoerfocus in op het eerste besturingselement in de sjabloon.
Het WM_COMMAND bericht
Een controle kan een WM_COMMAND bericht verzenden naar de dialoogprocedure wanneer de gebruiker een actie uitvoert binnen de controle. Deze berichten, zogenaamde meldingsberichten, informeren de procedure van gebruikersinvoer en stellen het in staat om passende antwoorden uit te voeren.
Alle vooraf gedefinieerde besturingselementen, met uitzondering van statische besturingselementen, verzenden meldingsberichten voor geselecteerde gebruikersacties. Met een drukknop wordt bijvoorbeeld het BN_CLICKED meldingsbericht verzonden wanneer de gebruiker op de knop klikt. In alle gevallen bevat het woord in lage volgorde van de parameter wParam de besturings-id, het woord in hoge volgorde van wParam de meldingscode en de parameter lParam bevat de besturingsvenstergreep.
De dialoogvensterprocedure moet meldingen bewaken en verwerken. In het bijzonder moet de procedure berichten met de IDOK- of IDCANCEL-id's verwerken; deze berichten vertegenwoordigen een verzoek van de gebruiker om het dialoogvenster te sluiten. De procedure moet het dialoogvenster sluiten met behulp van de functie EndDialog voor modale dialoogvensters en de functie DestroyWindow voor modeless dialoogvensters.
Het systeem verzendt ook WM_COMMAND berichten naar de dialoogvensterprocedure als het dialoogvenster een menu heeft, zoals het venster menu, en de gebruiker klikt op een menu-item. Het systeem verzendt met name een WM_COMMAND-bericht met de parameter wParam ingesteld op IDCANCEL wanneer de gebruiker in het venstermenu van het dialoogvenster op Sluiten klikt. Het bericht is bijna identiek aan het meldingsbericht dat is verzonden door de knop Annuleren en moet op exact dezelfde manier worden verwerkt.
Het WM_PARENTNOTIFY-bericht
Een besturingselement verzendt een WM_PARENTNOTIFY bericht wanneer de gebruiker op een muisknop drukt terwijl hij naar het besturingselement wijst. Sommige toepassingen interpreteren dit bericht als een signaal voor het uitvoeren van een actie met betrekking tot het besturingselement, zoals het weergeven van een tekstregel die het doel van het besturingselement beschrijft.
Het systeem verzendt ook WM_PARENTNOTIFY berichten wanneer een venster wordt aangemaakt en vernietigd, maar stuurt deze berichten niet voor besturingselementen die zijn gemaakt vanuit een dialoogvenstersjabloon. Het systeem voorkomt deze berichten door de WS_EX_NOPARENTNOTIFY stijl op te geven bij het maken van de bedieningselementen. Een applicatie kan dit standaardgedrag niet wijzigen, tenzij het zijn eigen bedieningselementen voor het dialoogvenster maakt.
Control-Color berichten
Besturingselementen en het systeem kunnen berichten met besturingskleuren verzenden wanneer ze de dialoogvensterprocedure willen gebruiken om de achtergrond van een besturingselement of ander venster te schilderen met behulp van een specifieke kwast en kleuren. Dit kan handig zijn wanneer toepassingen de standaardkleuren overschrijven die worden gebruikt in dialoogvensters en de bijbehorende besturingselementen. Hier volgen de besturingskleurberichten, die het WM_CTLCOLOR bericht hebben vervangen.
- WM_CTLCOLORBTN
- WM_CTLCOLORDLG
- WM_CTLCOLOREDIT
- WM_CTLCOLORLISTBOX
- WM_CTLCOLORSCROLLBAR
- WM_CTLCOLORSTATIC
Een besturingselement verzendt een bericht over de besturingselementkleur naar de dialoogvensterprocedure net voordat het zijn eigen achtergrond gebruikt. Het bericht stelt de procedure in staat om op te geven welke borstel moet worden gebruikt en om de achtergrond- en voorgrondkleuren in te stellen. De procedure specificeert een penseel door het penseelhandvat te retourneren. Als u de achtergrond- en voorgrondkleuren wilt instellen, gebruikt de procedure de SetBkColor- en SetTextColor-functies met de context van het weergaveapparaat van het besturingselement. Het control-kleur bericht geeft een handle door naar de procedure in de context van het weergaveapparaat, zoals gespecificeerd in de wParam parameter van het bericht.
Het systeem verzendt een WM_CTLCOLORDLG bericht naar de dialoogvensterprocedure als de procedure het WM_ERASEBKGND bericht niet verwerkt. De vooraf gedefinieerde dialoogvensterklasse heeft geen klasachtergrondborstel, dus met dit bericht kan de procedure een eigen achtergrond definiëren zonder dat de code moet worden opgenomen om het werk uit te voeren.
Wanneer een dialoogvensterprocedure in ieder geval geen besturingselementkleurbericht verwerkt, gebruikt het systeem een penseel met de standaardvensterkleur om de achtergrond voor alle besturingselementen en vensters te schilderen, met uitzondering van schuifbalken. Een toepassing kan de standaardvensterkleur ophalen door de COLOR_WINDOW waarde door te geven aan de functie GetSysColor. Terwijl de achtergrond is geschilderd, wordt de voorgrondkleur voor de context van het beeldschermapparaat ingesteld op de standaardtekstkleur (COLOR_WINDOWTEXT). Voor schuifbalken gebruikt het systeem een borstel met de standaardkleur van de schuifbalk (COLOR_SCROLLBAR). In dit geval worden de achtergrond- en voorgrondkleuren voor de context van het beeldschermapparaat respectievelijk ingesteld op wit en zwart.
Dialoogvenster Standaardberichtverwerking
De vensterprocedure voor de vooraf gedefinieerde dialoogvensterklasse voert standaardverwerking uit voor alle berichten die niet door de dialoogvensterprocedure worden verwerkt. Wanneer de dialoogvensterprocedure ONWAAR voor een bericht retourneert, controleert de vooraf gedefinieerde vensterprocedure de berichten en voert de volgende standaardacties uit:
| Bericht | Standaardactie |
|---|---|
| DM_GETDEFID | U kunt dit bericht verzenden naar een dialoogvenster. Het dialoogvenster retourneert de besturings-id van de standaardknop, als het dialoogvenster er een heeft; anders retourneert het nul. |
| DM_REPOSITION | U kunt dit bericht verzenden naar een dialoogvenster op het hoogste niveau. Het dialoogvenster verplaatst zichzelf zodat het binnen het bureaubladgebied past. |
| DM_SETDEFID | U kunt dit bericht verzenden naar een dialoogvenster. In het dialoogvenster wordt de standaard drukknop ingesteld op de controle die is opgegeven door de controle-identificator in de parameter wParam. |
| WM_ACTIVATE | Hiermee herstelt u de invoerfocus naar het besturingselement dat is geïdentificeerd door de eerder opgeslagen handle wanneer het dialoogvenster wordt geactiveerd. Anders slaat de procedure de handle naar het besturingselement met de invoerfocus op. |
| WM_CHARTOITEM | Retourneert nul. |
| WM_CLOSE | Hiermee wordt de BN_CLICKED meldingsbericht naar het dialoogvenster verzonden, waarbij IDCANCEL wordt opgegeven als de controle-id. Als het dialoogvenster een IDCANCEL-besturings-id heeft en het besturingselement momenteel is uitgeschakeld, klinkt de procedure een waarschuwing en wordt het bericht niet verstuurd. |
| WM_COMPAREITEM | Retourneert nul. |
| WM_ERASEBKGND | Vult het dialoogvenster clientgebied met behulp van het penseel dat wordt geretourneerd uit het WM_CTLCOLORDLG bericht of met de standaardvensterkleur. |
| WM_GETFONT | Retourneert een handvat naar het door de toepassing gedefinieerde lettertype van het dialoogvenster. |
| WM_INITDIALOG | Retourneert nul. |
| WM_LBUTTONDOWN | Hiermee wordt een CB_SHOWDROPDOWN bericht verzonden naar de keuzelijst met invoervak met de invoerfocus, waarmee het besturingselement wordt geïnstrueerd om de vervolgkeuzelijst te verbergen. De procedure roept DefWindowProc- aan om de standaardactie te voltooien. |
| WM_NCDESTROY | Geeft het algemene geheugen vrij dat is toegewezen voor bewerkingsbesturingselementen in het dialoogvenster (is van toepassing op dialoogvensters die de DS_LOCALEDIT stijl opgeven) en maakt alle toepassingsgedefinieerde lettertypen vrij (van toepassing op dialoogvensters die de DS_SETFONT of DS_SHELLFONT stijl opgeven). Met de procedure wordt de functie DefWindowProc aangeroepen om de standaardactie te voltooien. |
| WM_NCLBUTTONDOWN | Er wordt een CB_SHOWDROPDOWN bericht verzonden naar de keuzelijst met de invoerfocus, waarmee het besturingselement wordt geïnstrueerd om zijn vervolgkeuzelijst te verbergen. De procedure roept DefWindowProc- aan om de standaardactie te voltooien. |
| WM_NEXTDLGCTL | Hiermee stelt u de invoerfocus in op het volgende of vorige besturingselement in het dialoogvenster, op het besturingselement dat wordt aangeduid door de handle in de parameter wParam, of op het eerste besturingselement in het dialoogvenster dat zichtbaar is, niet is uitgeschakeld en de WS_TABSTOP-stijl heeft. De procedure negeert dit bericht als het huidige venster met de invoerfocus geen controle-element is. |
| WM_SETFOCUS | Hiermee stelt u de invoerfocus in op het besturingselement dat is geïdentificeerd door een eerder opgeslagen besturingsvenstergreep. Als er geen dergelijke handle bestaat, stelt de procedure de invoerfocus in op het eerste besturingselement in de dialoogvenstersjabloon dat zichtbaar is, niet is uitgeschakeld en de stijl WS_TABSTOP heeft. Als er geen dergelijk besturingselement bestaat, stelt de procedure de invoerfocus in op het eerste besturingselement in de sjabloon. |
| WM_SHOWWINDOW | Slaat een referentie op naar het besturingselement dat de invoerfocus heeft als het dialoogvenster wordt verborgen, en roept vervolgens DefWindowProc aan om de standaardactie te voltooien. |
| WM_SYSCOMMAND | Slaat een ingang op in het besturingselement met de invoerfocus als het dialoogvenster wordt geminimaliseerd en roept vervolgens DefWindowProc- aan om de standaardactie te voltooien. |
| WM_VKEYTOITEM | Retourneert nul. |
De vooraf gedefinieerde vensterprocedure geeft alle andere berichten door aan DefWindowProc- voor standaardverwerking.
Toetsenbordinterface van dialoogvenster
Het systeem biedt een speciale toetsenbordinterface voor dialoogvensters die speciale verwerking voor verschillende toetsen uitvoeren. Interface genereert meldingen die overeenkomen met bepaalde knoppen in het dialoogvenster of wijzigt de invoerfocus van het ene element naar het andere. Hieronder volgen de sleutels die in deze interface en hun respectieve acties worden gebruikt.
| Sleutel | Actie |
|---|---|
| Alt+mnemoniek | Hiermee verplaatst u de invoerfocus naar het eerste besturingselement (met de stijl WS_TABSTOP) na het statische besturingselement met de opgegeven nemonic. |
| BENEDEN | Hiermee verplaatst u de invoerfocus naar het volgende besturingselement in de groep. |
| BINNENKOMEN | Hiermee wordt een WM_COMMAND bericht verzonden naar de procedure van het dialoogvenster. De parameter wParam wordt ingesteld op IDOK of de besturingsidentificatie van de standaard drukknop. |
| ESC | Hiermee wordt een WM_COMMAND bericht verzonden naar de procedure van het dialoogvenster. De parameter wParam is ingesteld op IDCANCEL. |
| LINKS | Hiermee verplaatst u de invoerfocus naar het vorige besturingselement in de groep. |
| mnemonisch | Hiermee verplaatst u de invoerfocus naar het eerste besturingselement (met de stijl WS_TABSTOP) na het statische besturingselement met de opgegeven mnemonic. |
| RECHTS | Hiermee verplaatst u de invoerfocus naar het volgende besturingselement in de groep. |
| SHIFT+TAB | Hiermee verplaatst u de invoerfocus naar het vorige besturingselement met de stijl WS_TABSTOP. |
| TAB | Verplaatst de invoerfocus naar het volgende besturingselement met de stijl WS_TABSTOP. |
| OMHOOG | Verplaatst de invoerfocus naar het vorige besturingselement in de groep. |
Het systeem biedt automatisch de toetsenbordinterface voor alle modale dialoogvensters. Het biedt geen interface voor modeless dialoogvensters, tenzij de toepassing de IsDialogMessage functie aanroept om berichten in de hoofdberichtlus te filteren. Dit betekent dat de toepassing het bericht moet doorgeven aan IsDialogMessage direct na het ophalen van het bericht uit de berichtenwachtrij. De functie verwerkt de berichten als dit voor het dialoogvenster is en retourneert een niet-nulwaarde om aan te geven dat het bericht is verwerkt en mag niet worden doorgegeven aan de functie TranslateMessage- of DispatchMessage-.
Omdat de toetsenbordinterface van het dialoogvenster richtingtoetsen gebruikt om tussen besturingselementen in een dialoogvenster te schakelen, kan een toepassing deze toetsen niet gebruiken om de inhoud van een modaal dialoogvenster of een modeless dialoogvenster te scrollen waarvoor IsDialogMessage wordt aangeroepen. Wanneer een dialoogvenster schuifbalken bevat, moet de toepassing een alternatieve toetsenbordinterface voor de schuifbalken opgeven. Houd er rekening mee dat de muisinterface voor schuiven beschikbaar is wanneer het systeem een muis bevat.
De WS_TABSTOP-stijl
De stijl WS_TABSTOP geeft de besturingselementen op waarnaar de gebruiker kan navigeren door op de Tab-toets of Shift+Tab-toetsen te drukken.
Wanneer de gebruiker op Tab of Shift+Tab drukt, bepaalt het systeem eerst of deze toetsen worden verwerkt door het besturingselement dat momenteel de invoerfocus heeft. Het stuurt het besturingselement een WM_GETDLGCODE bericht en als het besturingselement DLGC_WANTTAB retourneert, worden de sleutels door het systeem doorgegeven aan het besturingselement. Anders gebruikt het systeem de functie GetNextDlgTabItem om het volgende besturingselement te vinden dat zichtbaar is, niet is uitgeschakeld en die de stijl WS_TABSTOP heeft. De zoekopdracht begint met het besturingselement dat momenteel de invoerfocus heeft en gaat verder in de volgorde waarin de besturingselementen zijn gemaakt, dat wil gezegd de volgorde waarin ze zijn gedefinieerd in de dialoogvenstersjabloon. Wanneer het systeem een besturingselement met de vereiste kenmerken zoekt, verplaatst het systeem de invoerfocus naar het besturingselement.
Als het zoeken naar het volgende besturingselement met de WS_TABSTOP stijl een venster met de stijl WS_EX_CONTROLPARENT tegenkomt, doorzoekt het systeem recursief de kindvensters van het venster.
Een toepassing kan ook GetNextDlgTabItem- gebruiken om besturingselementen met de stijl WS_TABSTOP te vinden. De functie haalt de windowhandle van het volgende of vorige bedieningselement met de stijl WS_TABSTOP op, zonder de invoerfocus te verplaatsen.
De WS_GROUP-stijl
Standaard verplaatst het systeem de invoerfocus naar het volgende of vorige besturingselement wanneer de gebruiker op een richtingtoets drukt. Zolang het huidige besturingselement met de invoerfocus deze toetsen niet verwerkt en het volgende of vorige besturingselement geen statisch besturingselement is, blijft het systeem de invoerfocus verplaatsen door alle besturingselementen in het dialoogvenster, omdat de gebruiker op de richtingtoetsen blijft drukken.
Een toepassing kan de stijl WS_GROUP gebruiken om dit standaardgedrag te wijzigen. De stijl markeert het begin van een groep besturingselementen. Als een besturingselement in de groep de invoerfocus heeft wanneer de gebruiker op richtingtoetsen begint te drukken, blijft de focus in de groep. Over het algemeen moet het eerste besturingselement in een groep de stijl WS_GROUP hebben en alle andere besturingselementen in de groep mogen deze stijl niet hebben. Alle besturingselementen in de groep moeten aaneengesloten zijn, dat wil gezegd dat ze opeenvolgend zonder tussenliggende besturingselementen zijn gemaakt.
Wanneer de gebruiker op een richtingtoets drukt, bepaalt het systeem eerst of het huidige besturingselement met de invoerfocus de richtingstoetsen verwerkt. Het systeem verzendt een WM_GETDLGCODE bericht naar het besturingselement en als het besturingselement de DLGC_WANTARROWS waarde retourneert, geeft u de sleutel door aan het besturingselement. Anders gebruikt het systeem de functie GetNextDlgGroupItem om het volgende besturingselement in de groep te bepalen.
GetNextDlgGroupItem zoekt bedieningselementen in de volgorde (of omgekeerde volgorde) waarin ze zijn gemaakt. Als de gebruiker op de toets RIGHT of DOWN drukt, retourneert GetNextDlgGroupItem het volgende besturingselement als dat besturingselement niet de stijl WS_GROUP heeft. Anders keert de functie de volgorde van de zoekactie om en levert het eerste besturingselement op dat de stijl WS_GROUP heeft. Als de gebruiker op de toets LINKS of UP drukt, retourneert de functie het vorige besturingselement, tenzij het huidige besturingselement al de stijl WS_GROUP heeft. Als het huidige besturingselement deze stijl heeft, keert de functie de volgorde van de zoekopdracht om, zoekt het eerste besturingselement met de stijl WS_GROUP en retourneert het besturingselement dat direct voorafgaat aan het gevonden besturingselement.
Als bij het zoeken naar het volgende besturingselement in de groep een venster met de stijl WS_EX_CONTROLPARENT wordt gevonden, doorzoekt het systeem recursief de kinderen van het venster.
Nadat het systeem het volgende of vorige besturingselement heeft, wordt er een WM_GETDLGCODE bericht naar het besturingselement verzonden om het type besturingselement te bepalen. Het systeem verplaatst vervolgens de invoerfocus naar de controle als het geen statisch controle-element is. Als het besturingselement een automatisch keuzerondje is, stuurt het systeem er een BM_CLICK bericht naartoe. Een toepassing kan ook GetNextDlgGroupItem- gebruiken om besturingselementen in een groep te zoeken.
Over het algemeen combineert het eerste besturingselement in de groep de stijlen WS_GROUP en WS_TABSTOP, zodat de gebruiker van groep naar groep kan gaan met behulp van de TAB-toets. Als de groep radioknoppen bevat, moet de toepassing de stijl WS_TABSTOP alleen toepassen op het eerste controle-element in de groep. Het systeem verplaatst automatisch de stijl wanneer de gebruiker tussen bedieningselementen in de groep navigeert. Dit zorgt ervoor dat de invoerfocus altijd op het laatst geselecteerde besturingselement staat wanneer de gebruiker naar de groep gaat met de TAB-toets.
Mnemoniek
Een mnemonic is een geselecteerde letter of cijfer in het label van een knop of in de tekst van een statisch besturingselement. Het systeem verplaatst de invoerfocus naar het besturingselement dat is gekoppeld aan de nemonic wanneer de gebruiker op de toets drukt die overeenkomt met de nemonic of drukt op deze toets en de Alt-toets in combinatie. Mnemonics bieden een snelle manier voor de gebruiker om met het toetsenbord naar een opgegeven besturingselement te navigeren.
Een toepassing maakt een mnemonic voor een besturingselement door het ampersand (&) direct vóór de geselecteerde letter of cijfer in het label of de tekst voor het besturingselement in te voegen. In de meeste gevallen bevat de nul-geëindigde tekenreeks die bij het besturingselement in de dialoogvenstersjabloon hoort een ampersand. Een toepassing kan echter op elk gewenst moment een mnemonic maken door het bestaande label of de bestaande tekst van een besturingselement te vervangen met behulp van de functie SetDlgItemText. Er kan slechts één mnemonic worden opgegeven voor elk besturingselement. Hoewel het wordt aanbevolen, hoeven mnemonics in een dialoogvenster niet uniek te zijn.
Wanneer de gebruiker op een letter- of cijfertoets drukt, bepaalt het systeem eerst of het huidige besturingselement met de invoerfocus de sleutel verwerkt. Het systeem verzendt een WM_GETDLGCODE bericht naar het besturingselement en als het besturingselement de waarde DLGC_WANTALLKEYS of DLG_WANTMESSAGE retourneert, geeft het systeem de sleutel door aan het besturingselement. Anders wordt gezocht naar een besturingselement waarvan mnemonic overeenkomt met de opgegeven letter of cijfer. Het blijft zoeken totdat er een besturingselement wordt gevonden of alle besturingselementen zijn onderzocht. Tijdens de zoekopdracht worden statische besturingselementen met de stijl SS_NOPREFIX overgeslagen.
Als het zoeken naar een besturingselement met een overeenkomende nemonic een venster met de WS_EX_CONTROLPARENT stijl tegenkomt, zoekt het systeem recursief de kinderen van het venster.
Als het systeem een statisch besturingselement zoekt en het besturingselement niet is uitgeschakeld, verplaatst het systeem de invoerfocus naar het eerste besturingselement na het statische besturingselement dat zichtbaar is, niet is uitgeschakeld en die de stijl WS_TABSTOP heeft. Als het systeem een ander besturingselement lokaliseert dat een overeenkomende mnemonic heeft, wordt de invoerfocus naar dat besturingselement verplaatst. Als de controle een standaarddrukknop is, verzendt het systeem een BN_CLICKED meldingsbericht naar het dialoogvensterproces. Als het besturingselement een andere stijl van een knop is en er geen ander besturingselement in het dialoogvenster is met dezelfde mnemonic, verzendt het systeem het BM_CLICK bericht naar het besturingselement.
Instellingen voor dialoogvenster
De instellingen van het dialoogvenster zijn de huidige selecties en waarden voor de besturingselementen in het dialoogvenster. De dialoogvensterprocedure is verantwoordelijk voor het initialiseren van de besturingselementen voor deze instellingen bij het maken van het dialoogvenster. Het is ook verantwoordelijk voor het ophalen van de huidige instellingen van de besturingselementen voordat het dialoogvenster wordt vernietigd. De methoden die worden gebruikt om instellingen te initialiseren en op te halen, zijn afhankelijk van het type besturingselement.
Zie de volgende onderwerpen voor meer informatie:
- radioknoppen en selectievakjes
- dialoogvenster Besturingselementen bewerken
- keuzelijsten, keuzelijsten met invoervak en adreslijstvermeldingen
- dialoogvenster Berichten beheren
Keuzerondjes en selectievakjes
In dialoogvensters worden keuzerondjes en selectievakjes gebruikt om de gebruiker een keuze te laten maken uit een lijst met opties. Radioknoppen laten de gebruiker kiezen uit wederzijds exclusieve opties; met selectievakjes kan de gebruiker een combinatie van opties selecteren.
Met de dialoogvensterprocedure kunt u de initiële status van een selectievakje instellen met behulp van de functie CheckDlgButton, waarmee het selectievakje wordt ingesteld of uitgeschakeld. Voor radioknoppen in een groep onderling exclusieve radioknoppen kan de procedure van het dialoogvenster de functie CheckRadioButton gebruiken om de juiste radioknop in te stellen en elke andere radioknop automatisch uit te schakelen.
Voordat een dialoogvenster wordt beëindigd, kan de procedure van het dialoogvenster de status van elke radioknop en elk selectievakje controleren met de functie IsDlgButtonChecked, die de huidige status van de knop retourneert. In een dialoogvenster worden deze gegevens doorgaans opgeslagen om de knoppen te initialiseren wanneer het dialoogvenster de volgende keer wordt gemaakt.
Besturingselementen bewerken in dialoogvenster
Veel dialoogvensters hebben besturingselementen voor bewerken waarmee de gebruiker tekst kan opgeven als invoer. In de meeste dialoogvensterprocedures wordt een bewerkingsbesturingselement geïnitialiseerd wanneer het dialoogvenster voor het eerst wordt geopend. De dialoogvensterprocedure kan bijvoorbeeld een voorgestelde bestandsnaam plaatsen in het besturingselement dat de gebruiker vervolgens kan selecteren, wijzigen of vervangen. Met de dialoogvensterprocedure kunt u de tekst in een bewerkingsveld instellen met behulp van de functie SetDlgItemText, waarmee tekst uit een opgegeven buffer naar het bewerkingsveld wordt gekopieerd. Wanneer het bewerkingsbesturingselement de invoerfocus ontvangt, wordt automatisch de volledige tekst geselecteerd om te bewerken.
Omdat besturingselementen voor bewerken hun tekst niet automatisch naar het dialoogvenster retourneren, moet de procedure voor het dialoogvenster de tekst ophalen voordat deze wordt beëindigd. De tekst kan worden opgehaald met behulp van de functie GetDlgItemText, waarmee de besturingselementtekst naar een buffer wordt gekopieerd. In de dialoogvensterprocedure wordt deze tekst meestal opgeslagen om het besturingselement later te initialiseren of door te geven aan het bovenliggende venster voor verwerking.
In sommige dialoogvensters worden besturingselementen voor bewerken gebruikt waarmee de gebruiker getallen kan invoeren. De procedure in het dialoogvenster kan een getal ophalen uit een besturingselement bewerken met behulp van de functie GetDlgItemInt, waarmee de tekst uit het besturingselement bewerken wordt opgehaald en de tekst wordt geconverteerd naar een decimale waarde. De gebruiker typt het getal in decimale cijfers. Het kan ondertekend of niet-ondertekend zijn. In de dialoogvensterprocedure kan een geheel getal worden weergegeven met behulp van de functie SetDlgItemInt. SetDlgItemInt converteert een ondertekend of niet-ondertekend geheel getal naar een tekenreeks met decimale cijfers.
Keuzelijsten, keuzelijsten met invoervak en adreslijstvermeldingen
In sommige dialoogvensters worden lijsten met namen weergegeven waaruit de gebruiker een of meer namen kan selecteren. Als u bijvoorbeeld een lijst met bestandsnamen wilt weergeven, gebruikt een dialoogvenster doorgaans een keuzelijst en de functies DlgDirList en DlgDirSelectEx. De functie DlgDirList vult automatisch een keuzelijst met de bestandsnamen in de huidige map. De functie DlgDirSelect haalt de geselecteerde bestandsnaam op uit de keuzelijst. Samen bieden deze twee functies een handige manier voor een dialoogvenster om een lijst met mappen weer te geven, zodat de gebruiker een bestand kan selecteren zonder de naam en locatie ervan te hoeven typen.
Een dialoogvenster kan ook een keuzelijst met invoervak gebruiken om een lijst met bestandsnamen weer te geven. De functie DlgDirListComboBox vult automatisch het lijstvakgedeelte van de keuzelijst met de bestandsnamen in de huidige bestandmap. De functie DlgDirSelectComboBoxEx haalt een geselecteerde bestandsnaam op uit het keuzelijstgedeelte.
Dialoogvenster Besturingselementberichten
Veel besturingselementen herkennen vooraf gedefinieerde berichten die, wanneer ze worden ontvangen door besturingselementen, bepaalde acties uitvoeren. Bijvoorbeeld: het BM_SETCHECK bericht zet het vinkje in een selectievakje en het EM_GETSEL bericht haalt het deel van de tekst van het besturingselement op dat op dat moment is geselecteerd. De besturingsberichten geven een dialoogprocedure meer en flexibeler toegang tot de besturingselementen dan de standaardfuncties, waardoor ze vaak worden gebruikt wanneer het dialoogvenster complexe interacties met de gebruiker vereist.
Een dialoogvensterprocedure kan een bericht verzenden naar een besturingselement door de besturingselement-id op te geven en de functie SendDlgItemMessage te gebruiken, die identiek is aan de functie SendMessage, behalve dat er een besturingselement-id wordt gebruikt in plaats van een venstergreep om het besturingselement te identificeren dat het bericht moet ontvangen. Een opgegeven bericht kan vereisen dat de dialoogvensterprocedure parameters verzendt met het bericht en dat het bericht mogelijk overeenkomende retourwaarden heeft. De werking en vereisten van elk besturingselementbericht zijn afhankelijk van het doel van het bericht en het besturingselement dat het verwerkt.
Zie Windows-besturingselementenvoor meer informatie over de besturingsberichten.
Aangepaste dialoogvensters
Een toepassing kan aangepaste dialoogvensters maken met behulp van een door de toepassing gedefinieerde vensterklasse voor de dialoogvensters in plaats van de vooraf gedefinieerde dialoogvensterklasse te gebruiken. Toepassingen gebruiken deze methode meestal wanneer een dialoogvenster hun hoofdvenster is, maar het is ook nuttig voor het creëren van modale en modusloze dialoogvensters voor toepassingen met standaard overlappende vensters.
Met de toepassingsgedefinieerde vensterklasse kan de toepassing een vensterprocedure voor het dialoogvenster definiëren en berichten verwerken voordat deze naar de dialoogvensterprocedure worden verzonden. Hiermee kan de toepassing ook een klaspictogram, een klasachtergrondborstel en een klasmenu voor het dialoogvenster definiëren. De toepassing moet de vensterklasse registreren voordat een dialoogvenster wordt gemaakt en moet de dialoogvenstersjabloon opgeven met de atoomwaarde of naam van de vensterklasse.
Veel toepassingen maken een nieuwe dialoogvensterklasse door eerst de klassegegevens voor de vooraf gedefinieerde dialoogvensterklasse op te halen en door te geven aan de functie GetClassInfo, waarmee een WNDCLASS- structuur wordt gevuld met de informatie. De toepassing wijzigt afzonderlijke leden van de structuur, zoals de klassenaam, borstel en pictogram, en registreert vervolgens de nieuwe klasse met behulp van de functie RegisterClass. Als een toepassing de structuur van de WNDCLASS zelf vult, moet deze het lid cbWndExtra instellen op de DLGWINDOWEXTRA, wat het aantal extra bytes is dat het systeem nodig heeft voor elk dialoogvenster. Als een toepassing ook extra bytes gebruikt voor elk dialoogvenster, moeten deze buiten de extra bytes van het systeem komen.
De vensterprocedure voor het aangepaste dialoogvenster heeft dezelfde parameters en vereisten als elke andere vensterprocedure. In tegenstelling tot andere vensterprocedures moet de vensterprocedure voor dit dialoogvenster echter de functie DefDlgProc- aanroepen in plaats van de functie DefWindowProc voor berichten die niet worden verwerkt. DefDlgProc- dezelfde standaardberichtverwerking uitvoert als de vensterprocedure voor het vooraf gedefinieerde dialoogvenster, waaronder het aanroepen van de dialoogvensterprocedure.
Een toepassing kan ook aangepaste dialoogvensters maken door de vensterprocedure van het vooraf gedefinieerde dialoogvenster te subklasseren. Met de functie SetWindowLong kan een toepassing de vensterprocedure voor een opgegeven venster opgeven. De toepassing kan ook proberen subklassen te gebruiken met behulp van de functie SetClassLong, maar dit is van invloed op alle dialoogvensters in het systeem, niet alleen de dialoogvensters die behoren tot de toepassing.
Toepassingen die aangepaste dialoogvensters maken, bieden soms een alternatieve toetsenbordinterface voor de dialoogvensters. Voor modeless dialoogvensters kan dit betekenen dat de toepassing de functie IsDialogMessage niet aanroept en in plaats daarvan alle toetsenbordinvoer verwerkt in de aangepaste vensterprocedure. In dergelijke gevallen kan de toepassing het WM_NEXTDLGCTL bericht gebruiken om de code te minimaliseren die nodig is om de invoerfocus van het ene besturingselement naar het andere te verplaatsen. Dit bericht, wanneer het wordt doorgegeven aan DefDlgProc, verplaatst de invoerfocus naar een opgegeven element en werkt het uiterlijk van de elementen bij, zoals het verplaatsen van de standaardgrens van de drukknop of het instellen van een standaardradio-knop.