Utbildning
Modul
Communicate using message boxes in Power Automate for desktop flows - Training
In this module, we discuss the use of message boxes in automated flows.
Den här webbläsaren stöds inte längre.
Uppgradera till Microsoft Edge och dra nytta av de senaste funktionerna och säkerhetsuppdateringarna, samt teknisk support.
I den här översikten beskrivs några programmeringsöverväganden om dialogrutor.
Översikten innehåller följande avsnitt.
En dialogruteprocedur liknar en fönsterprocedur eftersom systemet skickar meddelanden till proceduren när det har information att ge eller uppgifter att utföra. Till skillnad från en fönsterprocedur anropar en dialogruteprocedur aldrig funktionen DefWindowProc. I stället returneras TRUE- om det bearbetar ett meddelande eller FALSE- om det inte gör det.
Varje dialogruteprocedur har följande formulär:
BOOL CALLBACK DlgProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
// Place message cases here.
default:
return FALSE;
}
}
Procedureparametrarna har samma syfte som i en fönsterprocedur, där hwndDlg-parametern tar emot dialogrutan fönsterhandtaget.
De flesta dialogruteprocedurer bearbetar WM_INITDIALOG-meddelandet och de WM_COMMAND meddelanden som skickas av kontrollerna, men bearbetar få om några andra meddelanden. Om en dialogruteprocedur inte bearbetar ett meddelande måste den returnera FALSE- för att dirigera systemet att bearbeta meddelandena internt. Det enda undantaget till den här regeln är meddelandet WM_INITDIALOG. Dialogruteproceduren måste returnera TRUE- för att styra systemet att bearbeta WM_INITDIALOG meddelandet ytterligare. I vilket fall som helst får proceduren inte anropa DefWindowProc.
Systemet skickar inte ett WM_CREATE meddelande till dialogruteproceduren. I stället skickar den ett WM_INITDIALOG meddelande när dialogrutan och alla dess kontroller skapas, men innan dialogrutan visas. Proceduren bör utföra alla initieringar som krävs för att säkerställa att dialogrutan visar de aktuella inställningarna som är associerade med aktiviteten. När en dialogruta till exempel innehåller en kontroll för att visa den aktuella enheten och katalogen måste proceduren fastställa den aktuella enheten och katalogen och ange kontrollen till det värdet.
Proceduren kan initiera kontroller med hjälp av funktioner som SetDlgItemText och CheckDlgButton. Eftersom kontroller är fönster kan proceduren också ändra dem med hjälp av funktioner för fönsterhantering, till exempel EnableWindow och SetFocus. Proceduren kan hämta fönsterhandtaget till en kontroll med hjälp av funktionen GetDlgItem.
Dialogruteproceduren kan ändra innehållet, tillståndet och positionen för alla kontroller efter behov. I en dialogruta som till exempel innehåller en listruta med filnamn och en knappen Öppna kan proceduren inaktivera knappen Öppna tills användaren väljer en fil i listan. I det här exemplet anger dialogrutemallen stilen WS_DISABLED för knappen Öppna och systemet inaktiverar automatiskt knappen när den skapas av systemet. När dialogruteproceduren tar emot ett meddelande från listrutan som anger att användaren har valt en fil anropar proceduren funktionen EnableWindow för att aktivera knappen Öppna.
Om du vill visa en anpassad ikon i bildtextfältet i dialogrutan kan WM_INITDIALOG-hanteraren skicka meddelandet WM_SETICON till dialogrutan.
Om programmet skapar dialogrutan med någon av funktionerna DialogBoxParam, DialogBoxIndirectParam, CreateDialogParameller CreateDialogIndirectParaminnehåller lParam-parametern för WM_INITDIALOG meddelandet den extra parameter som skickas till funktionen. Program använder vanligtvis den här extra parametern för att skicka en pekare till ytterligare initieringsinformation till dialogruteproceduren, men dialogruteproceduren måste fastställa innebörden av parametern. Om programmet använder en annan funktion för att skapa dialogrutan anger systemet parametern lParam till NULL-.
Innan du återgår från WM_INITDIALOG-meddelandet bör proceduren avgöra om den ska ställa in indatafokus till en specifik kontroll. Om dialogruteproceduren returnerar TRUEanger systemet automatiskt indatafokus till kontrollen vars fönsterhandtag finns i parametern wParam. Om kontrollen som tar emot standardfokuset inte är lämplig kan den ställa in fokus på rätt kontroll med hjälp av funktionen SetFocus. Om proceduren anger indatafokus måste den returnera FALSE- för att förhindra att systemet ställer in standardfokus. Kontrollen som får inmatningsfokus som standard är alltid den första kontrollen som anges i mallen som är synlig, inte inaktiverad, och har stilen WS_TABSTOP. Om det inte finns någon sådan kontroll anger systemet standardindatafokus till den första kontrollen i mallen.
En kontroll kan skicka ett WM_COMMAND meddelande till dialogruteproceduren när användaren utför en åtgärd i kontrollen. Dessa meddelanden, som kallas notifieringsmeddelanden, informerar proceduren för användarindata och möjliggör lämpliga svar.
Alla fördefinierade kontroller, förutom statiska kontroller, skickar meddelanden för valda användaråtgärder. En push-knapp skickar till exempel meddelandet BN_CLICKED när användaren klickar på knappen. I samtliga fall innehåller lågordningsordet för parametern wParam kontrollidentifieraren, wParam innehåller meddelandekoden och parametern lParam innehåller kontrollfönstrets handtag.
Dialogruteproceduren bör övervaka och bearbeta meddelanden. I synnerhet måste proceduren bearbeta meddelanden med IDOK- eller IDCANCEL-identifierare. dessa meddelanden representerar en begäran från användaren om att stänga dialogrutan. Proceduren bör stänga dialogrutan med hjälp av funktionen EndDialog för modala dialogrutor och funktionen DestroyWindow för lägeslösa dialogrutor.
Systemet skickar också WM_COMMAND meddelanden till dialogruteproceduren om dialogrutan har en meny, till exempel -fönstret-menyn, och användaren klickar på ett menyalternativ. I synnerhet skickar systemet ett WM_COMMAND meddelande med parametern wParam inställd på IDCANCEL- när användaren klickar Stäng i dialogrutans fönstermeny. Meddelandet är nästan identiskt med meddelandet som skickas av knappen Avbryt och bör bearbetas på exakt samma sätt.
En kontroll skickar ett WM_PARENTNOTIFY meddelande när användaren trycker på en musknapp medan han eller hon pekar på kontrollen. Vissa program tolkar det här meddelandet som en signal för att utföra en åtgärd som rör kontrollen, till exempel att visa en textrad som beskriver syftet med kontrollen.
Systemet skickar också WM_PARENTNOTIFY meddelanden när det skapar och förstör ett fönster, men inte för kontroller som skapats från en dialogrutemall. Systemet förhindrar dessa meddelanden genom att ange WS_EX_NOPARENTNOTIFY formatmall när du skapar kontrollerna. Ett program kan inte åsidosätta det här standardbeteendet om det inte skapar egna kontroller för dialogrutan.
Kontroller och systemet kan skicka kontrollfärgsmeddelanden när de vill att dialogruteproceduren ska måla bakgrunden för en kontroll eller ett annat fönster med hjälp av en specifik pensel och färger. Detta kan vara användbart när program åsidosätter standardfärgerna som används i dialogrutor och deras kontroller. Följande är de kontrollfärgsmeddelanden som har ersatt WM_CTLCOLOR meddelandet.
En kontroll skickar ett kontrollfärgmeddelande till dialogruteproceduren precis innan den målar upp sin egen bakgrund. Meddelandet tillåter proceduren att ange vilken pensel som ska användas och ange bakgrunds- och förgrundsfärger. Proceduren specificerar en pensel genom att returnera penselhandtaget. För att ange bakgrunds- och förgrundsfärger använder proceduren funktionerna SetBkColor och SetTextColor med kontrollens visningsenhetskontext. Kontrollfärgmeddelandet skickar ett handtag till visningsenhetskontexten till proceduren i meddelandets wParam- parameter.
Systemet skickar ett WM_CTLCOLORDLG meddelande till dialogruteproceduren om proceduren inte bearbetar WM_ERASEBKGND meddelandet. Den fördefinierade dialogruteklassen har ingen bakgrundsborste för klassen, så det här meddelandet låter proceduren definiera sin egen bakgrund utan att behöva inkludera koden för att utföra arbetet.
I vilket fall som helst, när en dialogruteprocedur inte bearbetar ett kontrollfärgmeddelande, använder systemet en pensel med standardfönsterfärgen för att måla bakgrunden för alla kontroller och fönster förutom rullningslister. Ett program kan hämta standardfönsterfärgen genom att skicka värdet COLOR_WINDOW till funktionen GetSysColor. Medan bakgrunden är målad är förgrundsfärgen för visningsenhetens kontext inställd på standardtextfärgen (COLOR_WINDOWTEXT). För rullningslister använder systemet en pensel med standardfärgen för rullningslisten (COLOR_SCROLLBAR). I det här fallet är bakgrunds- och förgrundsfärgerna för visningsenhetens kontext inställda på vit respektive svart.
Fönsterproceduren för den fördefinierade dialogruteklassen utför standardbearbetning för alla meddelanden som inte bearbetas i dialogrutan. När dialogruteproceduren returnerar FALSE- för ett meddelande kontrollerar den fördefinierade fönsterproceduren meddelandena och utför följande standardåtgärder:
Meddelande | Standardåtgärd |
---|---|
DM_GETDEFID | Du kan skicka det här meddelandet till en dialogruta. Dialogrutan returnerar kontrollidentifieraren för standardknappen, om dialogrutan har en. annars returneras noll. |
DM_REPOSITION | Du kan skicka det här meddelandet till en dialogruta på den översta nivån. Dialogrutan flyttar sig så att den passar i skrivbordsområdet. |
DM_SETDEFID | Du kan skicka det här meddelandet till en dialogruta. Dialogrutan anger standardknappen till den kontroll som anges av kontrollidentifieraren i parametern wParam. |
WM_ACTIVATE | Återställer indatafokuset till den kontrollen som identifieras av det tidigare sparade handtaget om dialogrutan aktiveras. Annars sparar proceduren handtaget till styrningen som har indatafokus. |
WM_CHARTOITEM | Returnerar noll. |
WM_CLOSE | Publicerar BN_CLICKED meddelandemeddelandet i dialogrutan och anger IDCANCEL- som kontrollidentifierare. Om dialogrutan har en IDCANCEL-kontrollidentifierare och kontrollen för närvarande är inaktiverad, ljuder proceduren en varning och skickar inte meddelandet. |
WM_COMPAREITEM | Returnerar noll. |
WM_ERASEBKGND | Fyller dialogrutans klientområde med hjälp av antingen penseln som returneras från WM_CTLCOLORDLG-meddelandet eller med standardfönstrets färg. |
WM_GETFONT | Returnerar en referens till det programdefinierade teckensnittet för dialogrutor. |
WM_INITDIALOG | Returnerar noll. |
WM_LBUTTONDOWN | Skickar ett CB_SHOWDROPDOWN meddelande till komboboxen som har inmatningsfokus, vilket leder till att kontrollen döljer listrutan. Proceduren anropar DefWindowProc för att slutföra standardåtgärden. |
WM_NCDESTROY | Frigör globalt minne som allokerats för redigeringskontroller i dialogrutan (gäller för dialogrutor som anger formatmallen DS_LOCALEDIT) och frigör alla programdefinierade teckensnitt (gäller för dialogrutor som anger DS_SETFONT eller DS_SHELLFONT formatmall). Proceduren anropar funktionen DefWindowProc för att slutföra standardåtgärden. |
WM_NCLBUTTONDOWN | Skickar ett CB_SHOWDROPDOWN meddelande till kombinationsrutan med indatafokus, vilket leder till att kontrollen döljer listrutan. Proceduren anropar DefWindowProc för att slutföra standardåtgärden. |
WM_NEXTDLGCTL | Anger indatafokus till nästa eller föregående kontroll i dialogrutan, till kontrollen som identifieras av handtaget i parametern wParam eller till den första kontrollen i dialogrutan som är synlig, inte inaktiverad och har WS_TABSTOP stil. Proceduren ignorerar det här meddelandet om det aktuella fönstret med indatafokus inte är en kontroll. |
WM_SETFOCUS | Ställer in indatafokus till den kontroll som identifieras av ett tidigare sparat kontrollfönsterhandtag. Om det inte finns något sådant, ställer proceduren indatafokus på den första kontrollen i dialogrutemallen som är synlig, inte inaktiverad och har stilen WS_TABSTOP. Om det inte finns någon sådan kontroll anger proceduren indatafokus till den första kontrollen i mallen. |
WM_SHOWWINDOW | Sparar ett handtag till kontrollen som har indatafokus om dialogrutan döljs, och anropar sedan DefWindowProc för att slutföra standardåtgärden. |
WM_SYSCOMMAND | Sparar en referens till kontrollen som har indatafokus om dialogrutan minimeras och anropar sedan DefWindowProc för att slutföra standardåtgärden. |
WM_VKEYTOITEM | Returnerar noll. |
Den fördefinierade fönsterproceduren skickar alla andra meddelanden till DefWindowProc för standardbearbetning.
Systemet tillhandahåller ett särskilt tangentbordsgränssnitt för dialogrutor som utför särskild bearbetning för flera nycklar. Gränssnittet genererar meddelanden som motsvarar vissa knappar i dialogrutan eller ändrar indatafokus från en kontroll till en annan. Här följer nycklarna som används i det här gränssnittet och deras respektive åtgärder.
Nyckel | Handling |
---|---|
ALT+minnesregel | Flyttar indatafokus till den första kontrollen (med WS_TABSTOP stil) efter den statiska kontrollen som innehåller den angivna mnemonic. |
NER | Flyttar indatafokuset till nästa kontroll i gruppen. |
ENTER | Skickar ett WM_COMMAND meddelande till dialogruteproceduren. Parametern wParam är inställd på IDOK eller kontrollidentifierare för standardknappen. |
ESC | Skickar ett WM_COMMAND meddelande till dialogruteproceduren. Parametern wParam är inställd på IDCANCEL. |
VÄNSTER | Flyttar indatafokuset till den tidigare kontrollen i gruppen. |
minnesregel | Flyttar indatafokuset till den första kontrollen (med WS_TABSTOP format) efter den statiska kontrollen som innehåller den angivna mnemonic. |
HÖGER | Flyttar indatafokuset till nästa kontroll i gruppen. |
SHIFT+TAB | Flyttar indatafokuset till den föregående kontroll som har WS_TABSTOP stil. |
FLIK | Flyttar fokus till nästa kontroll som har stiltypen WS_TABSTOP. |
UPP | Flyttar indatafokuset till den tidigare kontrollen i gruppen. |
Systemet tillhandahåller automatiskt tangentbordsgränssnittet för alla modala dialogrutor. Det tillhandahåller inte ett gränssnitt för modellösa dialogrutor om inte programmet anropar funktionen IsDialogMessage för att filtrera meddelanden i sin huvudmeddelandeloop. Det innebär att programmet måste skicka meddelandet till IsDialogMessage omedelbart efter att meddelandet hämtats från meddelandekön. Funktionen bearbetar meddelandena om det är för dialogrutan och returnerar ett värde som inte är noll för att indikera att meddelandet har bearbetats och inte får skickas till funktionen TranslateMessage eller DispatchMessage.
Eftersom tangentbordsgränssnittet i dialogrutan använder riktningspilar för att flytta mellan kontroller i dialogrutan kan ett program inte använda dessa tangenter för att bläddra i innehållet i en modal dialogruta eller någon icke-modal dialogruta som IsDialogMessage anropas för. När en dialogruta har rullningslister måste programmet tillhandahålla ett alternativt tangentbordsgränssnitt för rullningslisterna. Observera att musgränssnittet för rullning är tillgängligt när systemet innehåller en mus.
Formatet WS_TABSTOP anger de kontroller som användaren kan flytta till genom att trycka på TAB-tangenten eller SKIFT+TAB-tangenterna.
När användaren trycker på TAB eller SKIFT+TAB avgör systemet först om dessa nycklar bearbetas av den kontroll som för närvarande har indatafokus. Den skickar kontrollen ett WM_GETDLGCODE meddelande, och om kontrollen returnerar DLGC_WANTTAB skickar systemet nycklarna till kontrollen. Annars använder systemet funktionen GetNextDlgTabItem för att hitta nästa kontroll som är synlig, inte inaktiverad och som har WS_TABSTOP formatmall. Sökningen börjar med att kontrollen för närvarande har indatafokus och fortsätter i den ordning kontrollerna skapades, dvs. i vilken ordning de definieras i dialogrutemallen. När systemet hittar en kontroll med de egenskaper som krävs flyttar systemet indatafokuset till den.
Om sökningen efter nästa kontroll med WS_TABSTOP stilen stöter på ett fönster med WS_EX_CONTROLPARENT stil, söker systemet rekursivt igenom fönstrets barnfönster.
Ett program kan också använda GetNextDlgTabItem för att hitta kontroller med WS_TABSTOP stil. Funktionen hämtar fönsterhandtaget för nästa eller föregående kontrollelement med WS_TABSTOP stil utan att flytta fokus.
Som standard flyttar systemet indatafokus till nästa eller föregående kontroll när användaren trycker på en riktningsnyckel. Så länge den aktuella kontrollen med indatafokus inte bearbetar dessa nycklar och nästa eller föregående kontroll inte är en statisk kontroll, fortsätter systemet att flytta indatafokus genom alla kontroller i dialogrutan när användaren fortsätter att trycka på riktningstangenterna.
Ett program kan använda WS_GROUP formatmall för att ändra det här standardbeteendet. Stilen markerar början på en grupp kontroller. Om en kontroll i gruppen har indatafokus när användaren börjar trycka på riktningstangenterna förblir fokus i gruppen. I allmänhet måste den första kontrollen i en grupp ha formatet WS_GROUP och alla andra kontroller i gruppen får inte ha det här formatet. Alla kontroller i gruppen måste vara sammanhängande, dvs. de måste ha skapats i följd utan mellanliggande kontroller.
När användaren trycker på en riktningsnyckel avgör systemet först om den aktuella kontrollen med indatafokus bearbetar riktningsnycklarna. Systemet skickar ett WM_GETDLGCODE meddelande till kontrollen och om kontrollen returnerar värdet DLGC_WANTARROWS skickar du nyckeln till kontrollen. Annars använder systemet funktionen GetNextDlgGroupItem för att fastställa nästa kontroll i gruppen.
GetNextDlgGroupItem söker kontroller i den ordning (eller omvänd ordning) som de skapades. Om användaren trycker på HÖGER- eller NED-tangenten, returnerar GetNextDlgGroupItem nästa kontroll om den kontrollen inte har stilen WS_GROUP. Annars ändrar funktionen ordningen på sökningen och returnerar den första kontrollen som har WS_GROUP formatmall. Om användaren trycker på VÄNSTER- eller UP-tangenten returnerar funktionen den tidigare kontrollen om inte den aktuella kontrollen redan har WS_GROUP formatmall. Om den aktuella kontrollen har det här formatet ändrar funktionen ordningen på sökningen, letar upp den första kontrollen med formatet WS_GROUP och returnerar kontrollen som omedelbart föregår den lokaliserade kontrollen.
Om sökningen efter nästa kontroll i gruppen påträffar ett fönster med WS_EX_CONTROLPARENT stil söker systemet rekursivt igenom fönstrets underordnade objekt.
När systemet har nästa eller föregående kontroll skickar det ett WM_GETDLGCODE meddelande till kontrollen för att fastställa kontrolltypen. Systemet flyttar sedan indatafokuset för att styra om det inte är en statisk kontroll. Om kontrollen är en automatisk alternativknapp skickar systemet ett BM_CLICK meddelande till den. Ett program kan också använda GetNextDlgGroupItem för att hitta kontroller i en grupp.
I allmänhet kombinerar den första kontrollen i gruppen WS_GROUP och WS_TABSTOP format så att användaren kan flytta från grupp till grupp med hjälp av TAB-nyckeln. Om gruppen innehåller alternativknappar bör programmet endast använda WS_TABSTOP formatmall för den första kontrollen i gruppen. Systemet flyttar automatiskt formatmallen när användaren flyttas mellan kontrollerna i gruppen. Detta säkerställer att indatafokus alltid kommer att ligga på den senast valda kontrollen när användaren flyttar till gruppen med hjälp av TAB-nyckeln.
En mnemonic är en markerad bokstav eller siffra i etiketten för en knapp eller i texten i en statisk kontroll. Systemet flyttar indatafokuset till kontrollen som är associerad med mnemonic när användaren antingen trycker på den nyckel som motsvarar den mnemonic eller trycker på den här nyckeln och ALT-tangenten i kombination. Mnemonics är ett snabbt sätt för användaren att flytta till en angiven kontroll med hjälp av tangentbordet.
En applikation skapar en genväg för ett styrreglage genom att infoga et-tecknet (&) omedelbart före den valda bokstaven eller siffran i etiketten eller texten för reglaget. I de flesta fall innehåller den null-terminerade strängen som medföljer kontrollen i dialogrutemallen ampersandtecknet. Ett program kan dock när som helst skapa en mnemonic genom att ersätta en kontrolls befintliga etikett eller text med hjälp av funktionen SetDlgItemText. Endast en mnemonic kan anges för varje kontroll. Även om det rekommenderas behöver mnemonics i en dialogruta inte vara unika.
När användaren trycker på en bokstav eller siffra avgör systemet först om den aktuella kontrollen med indatafokus bearbetar nyckeln. Systemet skickar ett WM_GETDLGCODE meddelande till kontrollen och om kontrollen returnerar värdet DLGC_WANTALLKEYS eller DLG_WANTMESSAGE skickar systemet nyckeln till kontrollen. Annars söker den efter en kontroll vars mnemonic matchar den angivna bokstaven eller siffran. Den fortsätter att söka tills den hittar en kontroll eller har undersökt alla kontroller. Under sökningen hoppar den över alla statiska kontroller som har stilen SS_NOPREFIX.
Om sökningen efter en kontroll med matchande mnemonic stöter på ett fönster med WS_EX_CONTROLPARENT stil söker systemet rekursivt igenom fönstrets underordnade objekt.
Om systemet hittar en statisk kontroll och kontrollen inte är inaktiverad, flyttar systemet fokus till den första kontrollen efter den statiska kontrollen som är synlig, inte inaktiverad, och som har stilen WS_TABSTOP. Om systemet hittar någon annan kontroll som har en matchande mnemonic flyttas indatafokuset till den kontrollen. Om kontrollen är en standardknapp skickar systemet ett BN_CLICKED meddelande till dialogruteproceduren. Om kontrollen är en annan typ av knapp, och det inte finns någon annan kontroll i dialogrutan med samma mnemonic, skickar systemet BM_CLICK meddelande till kontrollen.
Dialogrutans inställningar är aktuella val och värden för kontrollerna i dialogrutan. Dialogruteproceduren ansvarar för att initiera kontrollerna till de här inställningarna när du skapar dialogrutan. Det är också ansvarigt för att hämta de aktuella inställningarna från kontrollerna innan dialogrutan förstörs. Vilka metoder som används för att initiera och hämta inställningar beror på typen av kontroll.
Mer information finns i följande avsnitt:
Dialogrutor använder alternativknappar och kryssrutor för att låta användaren välja från en lista med alternativ. Med alternativknappar kan användaren välja mellan ömsesidigt uteslutande alternativ; med kryssrutor kan användaren välja en kombination av alternativ.
Dialogrutans procedur kan ange det inledande tillståndet för en kryssruta med hjälp av funktionen CheckDlgButton, som anger eller avmarkerar kryssrutan. För radioknappar i en grupp med ömsesidigt uteslutande alternativknappar kan dialogruteproceduren använda funktionen CheckRadioButton för att ställa in lämplig alternativknapp och automatiskt rensa alla andra alternativknappar.
Innan en dialogruta avslutas kan dialogrutans procedur kontrollera tillståndet för varje alternativknapp och kryssruta med hjälp av funktionen IsDlgButtonChecked, som återger den aktuella statusen för knappen. En dialogruta sparar vanligtvis den här informationen för att initiera knapparna nästa gång dialogrutan skapas.
Många dialogrutor har redigeringskontroller som gör att användaren kan ange text som indata. De flesta dialogruteprocedurer initierar en redigeringskontroll när dialogrutan startas. Dialogruteproceduren kan till exempel placera ett föreslaget filnamn i kontrollen som användaren sedan kan välja, ändra eller ersätta. Dialogrutans procedur kan ange texten i en redigeringskontroll med hjälp av funktionen SetDlgItemText, som kopierar text från en angiven buffert till redigeringskontrollen. När redigeringskontrollen tar emot indatafokuset väljer den automatiskt den fullständiga texten för redigering.
Eftersom redigeringskontrollerna inte automatiskt returnerar sin text till dialogrutan måste dialogrutan hämta texten innan den avslutas. Den kan hämta texten med hjälp av funktionen GetDlgItemText, som kopierar redigeringskontrolltexten till en buffert. Dialogrutans procedur sparar vanligtvis den här texten för att initiera redigeringskontrollen senare eller skicka den vidare till det överordnade fönstret för bearbetning.
Vissa dialogrutor använder redigeringskontroller som gör att användaren kan ange tal. Dialogruteproceduren kan hämta ett tal från en redigeringskontroll med hjälp av funktionen GetDlgItemInt, som hämtar texten från redigeringskontrollen och konverterar texten till ett decimalvärde. Användaren skriver talet i decimalsiffror. Den kan antingen vara signerad eller osignerad. Dialogruteproceduren kan visa ett heltal med hjälp av funktionen SetDlgItemInt. SetDlgItemInt konverterar ett signerat eller osignerat heltal till en sträng med decimalsiffror.
Vissa dialogrutor visar listor med namn som användaren kan välja ett eller flera namn från. Om du till exempel vill visa en lista med filnamn använder en dialogruta vanligtvis en listruta och DlgDirList- och DlgDirSelectEx funktioner. Funktionen DlgDirList fyller automatiskt en listruta med filnamnen i den aktuella katalogen. Funktionen DlgDirSelect hämtar det valda filnamnet från listrutan. Tillsammans ger dessa två funktioner ett bekvämt sätt för en dialogruta att visa en kataloglista så att användaren kan välja en fil utan att behöva skriva dess namn och plats.
En dialogruta kan också använda en kombinationsruta för att visa en lista med filnamn. Funktionen DlgDirListComboBox fyller automatiskt en listruta i kombinationsrutan med filnamnen i den aktuella katalogen. Funktionen DlgDirSelectComboBoxEx hämtar ett valt filnamn från listrutedelen.
Många kontroller känner igen fördefinierade meddelanden som, när de tas emot av kontroller, gör att de utför vissa åtgärder. Meddelandet BM_SETCHECK anger till exempel kryssrutan i en kryssruta och meddelandet EM_GETSEL hämtar den del av kontrollens text som för närvarande är markerad. Kontrollmeddelandena ger en dialogruteprocedur större och mer flexibel åtkomst till kontrollerna än standardfunktionerna, så de används ofta när dialogrutan kräver komplexa interaktioner med användaren.
En dialogruteprocedur kan skicka ett meddelande till en kontroll genom att ange kontrollidentifieraren och använda funktionen SendDlgItemMessage, som är identisk med funktionen SendMessage, förutom att den använder en kontrollidentifierare i stället för ett fönsterhandtag för att identifiera den kontroll som ska ta emot meddelandet. Ett angivet meddelande kan kräva att dialogruteproceduren skickar parametrar med meddelandet och att meddelandet kan ha motsvarande returvärden. Åtgärden och kraven för varje kontrollmeddelande beror på syftet med meddelandet och den kontroll som bearbetar det.
Mer information om kontrollmeddelandena finns i Windows Controls.
Ett program kan skapa anpassade dialogrutor med hjälp av en programdefinierad fönsterklass för dialogrutorna i stället för att använda den fördefinierade dialogruteklassen. Applikationer använder vanligtvis den här metoden när en dialogruta är deras huvudfönster, men det är också användbart för att skapa modala och lägeslösa dialogrutor för applikationer som har standardöverlappande fönster.
Med den programdefinierade fönsterklassen kan programmet definiera en fönsterprocedur för dialogrutan och bearbeta meddelanden innan de skickas till dialogrutan. Programmet kan också definiera en ikon, en bakgrundsborste och en meny för klassen i dialogrutan. Programmet måste registrera fönsterklassen innan du försöker skapa en dialogruta och måste ange dialogrutemallen med atomvärdet eller namnet på fönsterklassen.
Många program skapar en ny dialogruteklass genom att först hämta klassinformationen för den fördefinierade dialogruteklassen och skicka den till funktionen GetClassInfo, som fyller en WNDCLASS- struktur med informationen. Programmet ändrar enskilda medlemmar i strukturen, till exempel klassnamn, pensel och ikon, och registrerar sedan den nya klassen med hjälp av funktionen RegisterClass. Om ett program fyller i WNDCLASS--strukturen på egen hand, måste det ange cbWndExtra-medlemsvariabel till DLGWINDOWEXTRA, vilket är antalet extra byte som systemet kräver för varje dialogruta. Om ett program också använder extra byte för varje dialogruta måste de vara längre än de extra byte som krävs av systemet.
Fönsterproceduren för den anpassade dialogrutan har samma parametrar och krav som andra fönsterprocedurer. Till skillnad från andra fönsterprocedurer bör dock fönsterproceduren för den här dialogrutan anropa funktionen DefDlgProc i stället för funktionen DefWindowProc för meddelanden som den inte bearbetar. DefDlgProc utför samma standardbearbetning av meddelanden som fönsterproceduren för den fördefinierade dialogrutan, vilket innefattar att anropa dialogruteproceduren.
Ett program kan också skapa anpassade dialogrutor genom att underklassera fönsterproceduren i den fördefinierade dialogrutan. Med funktionen SetWindowLong kan ett program ange fönsterproceduren för ett angivet fönster. Programmet kan också försöka underklassa med hjälp av funktionen SetClassLong, men detta påverkar alla dialogrutor i systemet, inte bara de som tillhör programmet.
Program som skapar anpassade dialogrutor tillhandahåller ibland ett alternativt tangentbordsgränssnitt för dialogrutorna. För lägeslösa dialogrutor kan det innebära att programmet inte anropar funktionen IsDialogMessage och istället bearbetar alla tangentbordsindata i en anpassad fönsterprocedur. I sådana fall kan programmet använda meddelandet WM_NEXTDLGCTL för att minimera den kod som behövs för att flytta indatafokus från en kontroll till en annan. När det här meddelandet skickas till DefDlgProcflyttas indatafokus till en angiven kontroll och kontrollernas utseende uppdateras, till exempel genom att flytta standardknappens kantlinje eller att ställa in en automatisk alternativknapp.
Utbildning
Modul
Communicate using message boxes in Power Automate for desktop flows - Training
In this module, we discuss the use of message boxes in automated flows.