Erwägungen zur Dialogfeldprogrammierung

In dieser Übersicht werden einige Programmierüberlegungen in Bezug auf Dialogfelder erläutert.

Die Übersicht enthält die folgenden Themen.

Dialogfeldprozeduren

Eine Dialogfeldprozedur ähnelt einer Fensterprozedur, da das System Nachrichten an die Prozedur sendet, wenn es Informationen zu erteilen oder Aufgaben auszuführen hat. Im Gegensatz zu einer Fensterprozedur ruft eine Dialogfeldprozedur nie die Funktion DefWindowProc auf. Stattdessen gibt es TRUE zurück, wenn es eine Nachricht verarbeitet, oder FALSE , wenn dies nicht der Fall ist.

Jede Dialogfeldprozedur hat das folgende Formular:

BOOL CALLBACK DlgProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    switch (message) 
    { 
 
        // Place message cases here. 
 
        default: 
            return FALSE; 
    } 
}

Die Prozedurparameter dienen dem gleichen Zweck wie in einer Fensterprozedur, wobei der hwndDlg-Parameter das Fensterhandle des Dialogfelds empfängt.

Die meisten Dialogfeldprozeduren verarbeiten die WM_INITDIALOG Nachricht und die WM_COMMAND Nachrichten, die von den Steuerelementen gesendet werden, verarbeiten jedoch nur wenige, wenn auch andere Nachrichten. Wenn eine Dialogfeldprozedur keine Nachricht verarbeitet, muss sie FALSE zurückgeben, um das System anzuweisen, die Nachrichten intern zu verarbeiten. Die einzige Ausnahme von dieser Regel ist die WM_INITDIALOG Nachricht. Die Dialogfeldprozedur muss TRUE zurückgeben, um das System anzuweisen, die WM_INITDIALOG-Nachricht weiter zu verarbeiten. In jedem Fall darf die Prozedur DefWindowProc nicht aufrufen.

Die WM_INITDIALOG Nachricht

Das System sendet keine WM_CREATE Nachricht an die Dialogfeldprozedur. Stattdessen sendet es eine WM_INITDIALOG Meldung, wenn das Dialogfeld und alle zugehörigen Steuerelemente erstellt werden, aber bevor das Dialogfeld angezeigt wird. Die Prozedur sollte alle erforderlichen Initialisierungen durchführen, um sicherzustellen, dass im Dialogfeld die aktuellen Einstellungen angezeigt werden, die der Aufgabe zugeordnet sind. Wenn beispielsweise ein Dialogfeld ein Steuerelement zum Anzeigen des aktuellen Laufwerks und Verzeichnisses enthält, muss die Prozedur das aktuelle Laufwerk und verzeichnis bestimmen und das Steuerelement auf diesen Wert festlegen.

Die Prozedur kann Steuerelemente mithilfe von Funktionen wie SetDlgItemText und CheckDlgButton initialisieren. Da Steuerelemente Fenster sind, kann die Prozedur sie auch mithilfe von Fensterverwaltungsfunktionen wie EnableWindow und SetFocus bearbeiten. Die Prozedur kann das Fensterhandle für ein Steuerelement mithilfe der GetDlgItem-Funktion abrufen.

Die Dialogfeldprozedur kann den Inhalt, den Zustand und die Position eines beliebigen Steuerelements nach Bedarf ändern. Beispielsweise kann die Prozedur in einem Dialogfeld, das ein Listenfeld mit Dateinamen und eine Schaltfläche Öffnen enthält, die Schaltfläche Öffnen deaktivieren, bis der Benutzer eine Datei aus der Liste auswählt. In diesem Beispiel gibt die Dialogfeldvorlage den WS_DISABLED Stil für die Schaltfläche Öffnen an, und das System deaktiviert die Schaltfläche automatisch beim Erstellen. Wenn die Dialogfeldprozedur eine Benachrichtigung aus dem Listenfeld empfängt, die angibt, dass der Benutzer eine Datei ausgewählt hat, ruft die Prozedur die Funktion EnableWindow auf, um die Schaltfläche Öffnen zu aktivieren.

Um ein benutzerdefiniertes Symbol auf der Untertitel leiste des Dialogfelds anzuzeigen, kann Ihr WM_INITDIALOG-Handler die WM_SETICON Nachricht an das Dialogfeld senden.

Wenn die Anwendung das Dialogfeld mithilfe einer der Funktionen DialogBoxParam, DialogBoxIndirectParam, CreateDialogParam oder CreateDialogIndirectParam erstellt, enthält der lParam-Parameter für die WM_INITDIALOG Nachricht den zusätzlichen Parameter, der an die Funktion übergeben wird. Anwendungen verwenden in der Regel diesen zusätzlichen Parameter, um einen Zeiger auf zusätzliche Initialisierungsinformationen an die Dialogfeldprozedur zu übergeben, aber die Dialogfeldprozedur muss die Bedeutung des Parameters bestimmen. Wenn die Anwendung eine andere Funktion zum Erstellen des Dialogfelds verwendet, legt das System den lParam-Parameter auf NULL fest.

Bevor sie von der WM_INITDIALOG Nachricht zurückgibt, sollte die Prozedur bestimmen, ob der Eingabefokus auf ein angegebenes Steuerelement festgelegt werden soll. Wenn die Dialogfeldprozedur TRUE zurückgibt, legt das System den Eingabefokus automatisch auf das Steuerelement fest, dessen Fensterhandle sich im wParam-Parameter befindet. Wenn das Steuerelement, das den Standardfokus empfängt, nicht geeignet ist, kann es den Fokus mithilfe der SetFocus-Funktion auf das entsprechende Steuerelement festlegen. Wenn die Prozedur den Eingabefokus festlegt, muss false zurückgegeben werden, um zu verhindern, dass das System den Standardfokus festlegt. Das Steuerelement, das den Standardeingabefokus empfängt, ist immer das erste In der Vorlage angegebene Steuerelement, das sichtbar, nicht deaktiviert ist und die WS_TABSTOP Format aufweist. Wenn kein solches Steuerelement vorhanden ist, legt das System den Standardeingabefokus auf das erste Steuerelement in der Vorlage fest.

Die WM_COMMAND Nachricht

Ein Steuerelement kann eine WM_COMMAND Nachricht an die Dialogfeldprozedur senden, wenn der Benutzer eine Aktion im Steuerelement ausführt. Diese Nachrichten, sogenannte Benachrichtigungsmeldungen, informieren das Verfahren der Benutzereingabe und ermöglichen es, geeignete Antworten auszuführen.

Alle vordefinierten Steuerelemente, mit Ausnahme statischer Steuerelemente, senden Benachrichtigungen für ausgewählte Benutzeraktionen. Beispielsweise sendet eine Drucktaste die BN_CLICKED Benachrichtigungsnachricht, wenn der Benutzer auf die Schaltfläche klickt. In allen Fällen enthält das Wort mit niedriger Reihenfolge des wParam-Parameters den Steuerelementbezeichner, das Wort der hohen Ordnung von wParam den Benachrichtigungscode und der lParam-Parameter das Steuerelementfensterhandle.

Die Dialogfeldprozedur sollte Benachrichtigungsmeldungen überwachen und verarbeiten. Insbesondere muss das Verfahren Nachrichten mit den IDOK- oder IDCANCEL-Bezeichnern verarbeiten; Diese Meldungen stellen eine Anforderung des Benutzers dar, das Dialogfeld zu schließen. Die Prozedur sollte das Dialogfeld mithilfe der EndDialog-Funktion für modale Dialogfelder und der DestroyWindow-Funktion für moduslose Dialogfelder schließen.

Das System sendet auch WM_COMMAND Nachrichten an die Dialogfeldprozedur, wenn das Dialogfeld ein Menü enthält, z. B. das Fenstermenü , und der Benutzer auf ein Menüelement klickt. Insbesondere sendet das System eine WM_COMMAND Nachricht, bei der der wParam-Parameter auf IDCANCEL festgelegt ist, wenn der Benutzer im Fenstermenü des Dialogfelds auf Schließen klickt. Die Nachricht ist nahezu identisch mit der Benachrichtigungsnachricht, die von der Schaltfläche Abbrechen gesendet wird, und sollte genau auf die gleiche Weise verarbeitet werden.

Die WM_PARENTNOTIFY Nachricht

Ein Steuerelement sendet eine WM_PARENTNOTIFY Nachricht, wenn der Benutzer eine Maustaste drückt, während er auf das Steuerelement zeigt. Einige Anwendungen interpretieren diese Nachricht als Signal, um eine Aktion im Zusammenhang mit dem Steuerelement auszuführen, z. B. die Anzeige einer Textzeile, die den Zweck des Steuerelements beschreibt.

Das System sendet auch WM_PARENTNOTIFY Nachrichten, wenn es ein Fenster erstellt und zerstört, aber nicht für Steuerelemente, die aus einer Dialogfeldvorlage erstellt wurden. Das System verhindert diese Meldungen, indem beim Erstellen der Steuerelemente der WS_EX_NOPARENTNOTIFY Stil angegeben wird. Eine Anwendung kann dieses Standardverhalten nicht außer Kraft setzen, es sei denn, sie erstellt eigene Steuerelemente für das Dialogfeld.

Control-Color Nachrichten

Steuerelemente und das System können Steuerelementfarbmeldungen senden, wenn die Dialogfeldprozedur den Hintergrund eines Steuerelements oder eines anderen Fensters mithilfe eines bestimmten Pinsels und einer bestimmten Farbe zeichnen soll. Dies kann nützlich sein, wenn Anwendungen die Standardfarben überschreiben, die in Dialogfeldern und deren Steuerelementen verwendet werden. Im Folgenden sind die Meldungen mit Steuerelementfarbe aufgeführt, die die WM_CTLCOLOR Nachricht ersetzt haben.

Ein Steuerelement sendet eine Steuerelementfarbmeldung an die Dialogfeldprozedur, kurz bevor es seinen eigenen Hintergrund zeichnet. Mit der Meldung kann die Prozedur angeben, welcher Pinsel verwendet werden soll, und die Hintergrund- und Vordergrundfarben festlegen. Die Prozedur gibt einen Pinsel an, indem der Pinselziehpunkt zurückgegeben wird. Zum Festlegen der Hintergrund- und Vordergrundfarben verwendet die Prozedur die Funktionen SetBkColor und SetTextColor mit dem Anzeigegerätekontext des Steuerelements. Die Steuerelementfarbmeldung übergibt ein Handle an den Anzeigegerätekontext an die Prozedur im wParam-Parameter der Nachricht.

Das System sendet eine WM_CTLCOLORDLG Meldung an die Dialogfeldprozedur, wenn die Prozedur die WM_ERASEBKGND Meldung nicht verarbeitet. Die vordefinierte Dialogfeldklasse verfügt nicht über einen Klassenhintergrundpinsel, sodass die Prozedur mit dieser Meldung einen eigenen Hintergrund definieren kann, ohne den Code für die Ausführung der Arbeit einschließen zu müssen.

Wenn eine Dialogfeldprozedur keine Steuerelement-Farbmeldung verarbeitet, verwendet das System einen Pinsel mit der Standardfarbe des Fensters, um den Hintergrund für alle Steuerelemente und Fenster mit Ausnahme von Bildlaufleisten zu zeichnen. Eine Anwendung kann die Standardfarbe des Fensters abrufen, indem sie den wert des COLOR_WINDOW an die GetSysColor-Funktion übergibt . Während der Hintergrund gezeichnet wird, wird die Vordergrundfarbe für den Kontext des Anzeigegeräts auf die Standardtextfarbe (COLOR_WINDOWTEXT) festgelegt. Für Bildlaufleisten verwendet das System einen Pinsel mit der Standardfarbe der Bildlaufleiste (COLOR_SCROLLBAR). In diesem Fall sind die Hintergrund- und Vordergrundfarben für den Anzeigegerätekontext auf Weiß bzw. Schwarz festgelegt.

Standardnachrichtenverarbeitung im Dialogfeld

Die Fensterprozedur für die vordefinierte Dialogfeldklasse führt die Standardverarbeitung für alle Nachrichten durch, die von der Dialogfeldprozedur nicht verarbeitet werden. Wenn die Dialogfeldprozedur für jede Nachricht FALSE zurückgibt, überprüft die vordefinierte Fensterprozedur die Meldungen und führt die folgenden Standardaktionen aus:

Nachricht Standardaktion
DM_GETDEFID Sie können diese Nachricht an ein Dialogfeld senden. Das Dialogfeld gibt den Steuerelementbezeichner der Standard-Drucktaste zurück, wenn das Dialogfeld über eine verfügt. Andernfalls wird 0 (null) zurückgegeben.
DM_REPOSITION Sie können diese Nachricht an ein Dialogfeld der obersten Ebene senden. Das Dialogfeld positioniert sich neu, sodass es in den Desktopbereich passt.
DM_SETDEFID Sie können diese Nachricht an ein Dialogfeld senden. Das Dialogfeld legt die Standard-Pushschaltfläche auf das Steuerelement fest, das durch den Steuerelementbezeichner im wParam-Parameter angegeben wird.
WM_ACTIVATE Stellt den Eingabefokus für das Steuerelement wieder her, das durch das zuvor gespeicherte Handle identifiziert wurde, wenn das Dialogfeld aktiviert ist. Andernfalls speichert die Prozedur das Handle im Steuerelement mit dem Eingabefokus.
WM_CHARTOITEM Gibt 0 (null) zurück.
WM_CLOSE Sendet die BN_CLICKED-Benachrichtigung an das Dialogfeld, wobei IDCANCEL als Steuerelementbezeichner angegeben wird. Wenn das Dialogfeld über einen IDCANCEL-Steuerelementbezeichner verfügt und das Steuerelement derzeit deaktiviert ist, gibt die Prozedur eine Warnung aus und stellt die Meldung nicht bereit.
WM_COMPAREITEM Gibt 0 (null) zurück.
WM_ERASEBKGND Füllt den Clientbereich des Dialogfelds aus, indem entweder der von der WM_CTLCOLORDLG-Nachricht zurückgegebene Pinsel oder die Standardfarbe des Fensters verwendet wird.
WM_GETFONT Gibt ein Handle für die von der Anwendung definierte Dialogfeldschriftart zurück.
WM_INITDIALOG Gibt 0 (null) zurück.
WM_LBUTTONDOWN Sendet eine CB_SHOWDROPDOWN Nachricht an das Kombinationsfeld mit dem Eingabefokus, wodurch das Steuerelement anleitet, sein Dropdownlistenfeld auszublenden. Die Prozedur ruft DefWindowProc auf, um die Standardaktion abzuschließen.
WM_NCDESTROY Gibt den globalen Speicher frei, der für Bearbeitungssteuerelemente im Dialogfeld zugeordnet ist (gilt für Dialogfelder, die die DS_LOCALEDIT Formatvorlage angeben) und gibt alle von der Anwendung definierten Schriftarten frei (gilt für Dialogfelder, die die DS_SETFONT oder DS_SHELLFONT Formatvorlage angeben). Die Prozedur ruft die DefWindowProc-Funktion auf, um die Standardaktion abzuschließen.
WM_NCLBUTTONDOWN Sendet eine CB_SHOWDROPDOWN Nachricht an das Kombinationsfeld mit dem Eingabefokus, wodurch das Steuerelement anleitet, sein Dropdownlistenfeld auszublenden. Die Prozedur ruft DefWindowProc auf, um die Standardaktion abzuschließen.
WM_NEXTDLGCTL Legt den Eingabefokus auf das nächste oder vorherige Steuerelement im Dialogfeld, auf das Steuerelement fest, das durch das Handle im wParam-Parameter identifiziert wird, oder auf das erste Steuerelement im Dialogfeld, das sichtbar, nicht deaktiviert ist und die WS_TABSTOP Stil aufweist. Die Prozedur ignoriert diese Meldung, wenn das aktuelle Fenster mit dem Eingabefokus kein Steuerelement ist.
WM_SETFOCUS Legt den Eingabefokus auf das Steuerelement fest, das durch ein zuvor gespeichertes Steuerelementfensterhandle identifiziert wurde. Wenn kein solches Handle vorhanden ist, legt die Prozedur den Eingabefokus auf das erste Steuerelement in der Dialogfeldvorlage fest, das sichtbar, nicht deaktiviert ist und die WS_TABSTOP Formatvorlage aufweist. Wenn kein solches Steuerelement vorhanden ist, legt die Prozedur den Eingabefokus auf das erste Steuerelement in der Vorlage fest.
WM_SHOWWINDOW Speichert ein Handle im Steuerelement mit dem Eingabefokus, wenn das Dialogfeld ausgeblendet wird, und ruft dann DefWindowProc auf, um die Standardaktion abzuschließen.
WM_SYSCOMMAND Speichert ein Handle im Steuerelement mit dem Eingabefokus, wenn das Dialogfeld minimiert wird, und ruft dann DefWindowProc auf, um die Standardaktion abzuschließen.
WM_VKEYTOITEM Gibt 0 (null) zurück.

Die vordefinierte Fensterprozedur übergibt alle anderen Nachrichten zur Standardverarbeitung an DefWindowProc .

Tastaturschnittstelle für Dialogfelder

Das System bietet eine spezielle Tastaturschnittstelle für Dialogfelder, die spezielle Verarbeitungen für mehrere Tasten durchführt. Die Schnittstelle generiert Nachrichten, die bestimmten Schaltflächen im Dialogfeld entsprechen, oder ändert den Eingabefokus von einem Steuerelement in ein anderes. Im Folgenden werden die in dieser Schnittstelle verwendeten Schlüssel und die zugehörigen Aktionen aufgeführt.

Schlüssel Aktion
ALT+mnemonisch Verschiebt den Eingabefokus auf das erste Steuerelement (mit dem WS_TABSTOP Stil) nach dem statischen Steuerelement, das das angegebene mnemonische Steuerelement enthält.
DOWN Verschiebt den Eingabefokus auf das nächste Steuerelement in der Gruppe.
EINGABETASTE Sendet eine WM_COMMAND Nachricht an die Dialogfeldprozedur. Der wParam-Parameter ist auf IDOK oder Steuerelementbezeichner der Standard-Drucktaste festgelegt.
ESC Sendet eine WM_COMMAND Nachricht an die Dialogfeldprozedur. Der wParam-Parameter ist auf IDCANCEL festgelegt.
LEFT Verschiebt den Eingabefokus auf das vorherige Steuerelement in der Gruppe.
Mnemonische Verschiebt den Eingabefokus auf das erste Steuerelement (mit dem WS_TABSTOP Stil) nach dem statischen Steuerelement, das das angegebene mnemonische Steuerelement enthält.
RIGHT Verschiebt den Eingabefokus auf das nächste Steuerelement in der Gruppe.
UMSCHALT+TAB Verschiebt den Eingabefokus auf das vorherige Steuerelement, das den stil "WS_TABSTOP" aufweist.
TAB Verschiebt den Eingabefokus auf das nächste Steuerelement, das den stil "WS_TABSTOP" aufweist.
UP Verschiebt den Eingabefokus auf das vorherige Steuerelement in der Gruppe.

Das System stellt automatisch die Tastaturschnittstelle für alle modale Dialogfelder bereit. Die Schnittstelle für moduslose Dialogfelder wird nur bereitgestellt, wenn die Anwendung die IsDialogMessage-Funktion aufruft, um Nachrichten in der Standard Nachrichtenschleife zu filtern. Dies bedeutet, dass die Anwendung die Nachricht unmittelbar nach dem Abrufen der Nachricht aus der Nachrichtenwarteschlange an IsDialogMessage übergeben muss. Die Funktion verarbeitet die Nachrichten, wenn sie für das Dialogfeld ist, und gibt einen Wert ungleich null zurück, um anzugeben, dass die Nachricht verarbeitet wurde und nicht an die TranslateMessage - oder DispatchMessage-Funktion übergeben werden darf.

Da die Tastaturschnittstelle des Dialogfelds Richtungstasten verwendet, um zwischen Steuerelementen in einem Dialogfeld zu wechseln, kann eine Anwendung diese Tasten nicht verwenden, um den Inhalt eines modalen Dialogfelds oder eines moduslosen Dialogfelds, für das IsDialogMessage aufgerufen wird, zu scrollen. Wenn ein Dialogfeld über Bildlaufleisten verfügt, muss die Anwendung eine alternative Tastaturschnittstelle für die Bildlaufleisten bereitstellen. Beachten Sie, dass die Mausoberfläche zum Scrollen verfügbar ist, wenn das System eine Maus enthält.

Das WS_TABSTOP-Format

Die WS_TABSTOP Stil gibt die Steuerelemente an, zu denen der Benutzer durch Drücken der TAB-TASTE oder UMSCHALT+TAB-TASTE wechseln kann.

Wenn der Benutzer TAB oder UMSCHALT+TAB drückt, bestimmt das System zunächst, ob diese Tasten von dem Steuerelement verarbeitet werden, das derzeit über den Eingabefokus verfügt. Es sendet dem Steuerelement eine WM_GETDLGCODE Meldung, und wenn das Steuerelement DLGC_WANTTAB zurückgibt, übergibt das System die Schlüssel an das Steuerelement. Andernfalls verwendet das System die GetNextDlgTabItem-Funktion , um das nächste Steuerelement zu suchen, das sichtbar, nicht deaktiviert ist und die WS_TABSTOP Format aufweist. Die Suche beginnt mit dem Steuerelement, das derzeit den Eingabefokus hat, und wird in der Reihenfolge fortgesetzt, in der die Steuerelemente erstellt wurden, d. h. in der Reihenfolge, in der sie in der Dialogfeldvorlage definiert sind. Wenn das System ein Steuerelement mit den erforderlichen Merkmalen findet, verschiebt das System den Eingabefokus darauf.

Wenn bei der Suche nach dem nächsten Steuerelement mit dem WS_TABSTOP Stil ein Fenster mit der WS_EX_CONTROLPARENT-Formatvorlage gefunden wird, durchsucht das System rekursiv die untergeordneten Elemente des Fensters.

Eine Anwendung kann auch GetNextDlgTabItem verwenden, um Steuerelemente mit dem WS_TABSTOP Stil zu suchen. Die Funktion ruft das Fensterhandle des nächsten oder vorherigen Steuerelements mit der WS_TABSTOP ab, ohne den Eingabefokus zu verschieben.

Das WS_GROUP-Format

Standardmäßig verschiebt das System den Eingabefokus auf das nächste oder vorherige Steuerelement, wenn der Benutzer eine Richtungstaste drückt. Solange das aktuelle Steuerelement mit dem Eingabefokus diese Tasten nicht verarbeitet und das nächste oder vorherige Steuerelement kein statisches Steuerelement ist, bewegt das System den Eingabefokus weiterhin durch alle Steuerelemente im Dialogfeld, während der Benutzer weiterhin die Richtungstasten drückt.

Eine Anwendung kann den WS_GROUP Stil verwenden, um dieses Standardverhalten zu ändern. Die Formatvorlage markiert den Anfang einer Gruppe von Steuerelementen. Wenn ein Steuerelement in der Gruppe den Eingabefokus hat, wenn der Benutzer mit dem Drücken der Richtungstasten beginnt, bleibt der Fokus in der Gruppe. Im Allgemeinen muss das erste Steuerelement in einer Gruppe den WS_GROUP Stil aufweisen, und alle anderen Steuerelemente in der Gruppe dürfen diesen Stil nicht aufweisen. Alle Steuerelemente in der Gruppe müssen zusammenhängend sein, d. h., sie müssen nacheinander ohne dazwischen liegende Steuerelemente erstellt worden sein.

Wenn der Benutzer eine Richtungstaste drückt, bestimmt das System zunächst, ob das aktuelle Steuerelement mit dem Eingabefokus die Richtungstasten verarbeitet. Das System sendet eine WM_GETDLGCODE-Nachricht an das Steuerelement, und wenn das Steuerelement den DLGC_WANTARROWS-Wert zurückgibt, übergibt den Schlüssel an das Steuerelement. Andernfalls verwendet das System die GetNextDlgGroupItem-Funktion , um das nächste Steuerelement in der Gruppe zu bestimmen.

GetNextDlgGroupItem sucht Steuerelemente in der Reihenfolge (oder in umgekehrter Reihenfolge), in der sie erstellt wurden. Wenn der Benutzer die RECHTS- oder NACH-UNTEN-TASTE drückt, gibt GetNextDlgGroupItem das nächste Steuerelement zurück, wenn dieses Steuerelement nicht die WS_GROUP Formatvorlage aufweist. Andernfalls kehrt die Funktion die Reihenfolge der Suche um und gibt das erste Steuerelement zurück, das den stil "WS_GROUP" aufweist. Wenn der Benutzer die NACH-LINKS- oder NACH-OBEN-TASTE drückt, gibt die Funktion das vorherige Steuerelement zurück, es sei denn, das aktuelle Steuerelement verfügt bereits über die WS_GROUP Formatvorlage. Wenn das aktuelle Steuerelement diese Formatvorlage aufweist, kehrt die Funktion die Reihenfolge der Suche um, sucht das erste Steuerelement mit der WS_GROUP Stil und gibt das Steuerelement zurück, das unmittelbar vor dem gefundenen Steuerelement liegt.

Wenn bei der Suche nach dem nächsten Steuerelement in der Gruppe ein Fenster mit der WS_EX_CONTROLPARENT-Format angezeigt wird, durchsucht das System rekursiv die untergeordneten Elemente des Fensters.

Nachdem das System über das nächste oder vorherige Steuerelement verfügt, sendet es eine WM_GETDLGCODE-Nachricht an das Steuerelement, um den Steuerelementtyp zu bestimmen. Das System verschiebt dann den Eingabefokus, um zu steuern, wenn es sich nicht um ein statisches Steuerelement handelt. Wenn das Steuerelement ein automatisches Optionsfeld ist, sendet das System eine BM_CLICK Nachricht an das Steuerelement. Eine Anwendung kann auch GetNextDlgGroupItem verwenden, um Steuerelemente in einer Gruppe zu suchen.

Im Allgemeinen kombiniert das erste Steuerelement in der Gruppe die stile WS_GROUP und WS_TABSTOP , sodass der Benutzer mithilfe der TAB-TASTE von Gruppe zu Gruppe wechseln kann. Wenn die Gruppe Optionsfelder enthält, sollte die Anwendung die WS_TABSTOP Formatvorlage nur auf das erste Steuerelement in der Gruppe anwenden. Das System verschiebt den Stil automatisch, wenn der Benutzer zwischen Steuerelementen in der Gruppe wechselt. Dadurch wird sichergestellt, dass der Eingabefokus immer auf dem zuletzt ausgewählten Steuerelement liegt, wenn der Benutzer mit der TAB-TASTE in die Gruppe wechselt.

Mnemotechnik

Ein Mnemonisch ist ein ausgewählter Buchstabe oder eine ausgewählte Ziffer in der Beschriftung einer Schaltfläche oder im Text eines statischen Steuerelements. Das System verschiebt den Eingabefokus auf das Steuerelement, das der Mnemonik zugeordnet ist, wenn der Benutzer entweder die Taste drückt, die dem mnemonischen Element entspricht, oder diese Taste und die ALT-Taste in Kombination drückt. Mnemonika bietet dem Benutzer eine schnelle Möglichkeit, mit der Tastatur zu einem angegebenen Steuerelement zu wechseln.

Eine Anwendung erstellt eine Mnemonik für ein Steuerelement, indem sie das amper- und -zeichen (&) unmittelbar vor dem ausgewählten Buchstaben oder der ausgewählten Ziffer in der Bezeichnung oder dem Text für das Steuerelement einfügt. In den meisten Fällen enthält die null-endende Zeichenfolge, die mit dem -Steuerelement in der Dialogfeldvorlage bereitgestellt wird, das amper- und -Objekt. Eine Anwendung kann jedoch jederzeit eine Mnemonik erstellen, indem sie die vorhandene Bezeichnung oder den Text eines Steuerelements mithilfe der SetDlgItemText-Funktion ersetzt. Für jedes Steuerelement kann nur ein mnemonisches Element angegeben werden. Obwohl es empfohlen wird, muss die Mnemonik in einem Dialogfeld nicht eindeutig sein.

Wenn der Benutzer eine Buchstaben- oder Zifferntaste drückt, bestimmt das System zunächst, ob das aktuelle Steuerelement mit dem Eingabefokus die Taste verarbeitet. Das System sendet eine WM_GETDLGCODE-Nachricht an das Steuerelement, und wenn das Steuerelement den DLGC_WANTALLKEYS - oder DLG_WANTMESSAGE-Wert zurückgibt, übergibt das System den Schlüssel an das Steuerelement. Andernfalls wird nach einem Steuerelement gesucht, dessen Mnemonisch mit dem angegebenen Buchstaben oder der angegebenen Ziffer übereinstimmt. Die Suche wird fortgesetzt, bis ein Steuerelement gefunden oder alle Steuerelemente untersucht wurden. Während der Suche werden alle statischen Steuerelemente übersprungen, die den stil "SS_NOPREFIX" aufweisen.

Wenn bei der Suche nach einem Steuerelement mit einem übereinstimmenden mnemonischen Format ein Fenster mit dem WS_EX_CONTROLPARENT-Stil gefunden wird, durchsucht das System rekursiv die untergeordneten Elemente des Fensters.

Wenn das System ein statisches Steuerelement findet und das Steuerelement nicht deaktiviert ist, verschiebt das System den Eingabefokus auf das erste Steuerelement nach dem statischen Steuerelement, das sichtbar, nicht deaktiviert ist und über das WS_TABSTOP Stil verfügt. Wenn das System ein anderes Steuerelement mit einem übereinstimmenden mnemonischen Steuerelement findet, verschiebt es den Eingabefokus auf dieses Steuerelement. Wenn das Steuerelement eine Standard-Drucktaste ist, sendet das System eine BN_CLICKED Benachrichtigung an die Dialogfeldprozedur. Wenn das Steuerelement eine andere Schaltflächenart ist und kein anderes Steuerelement im Dialogfeld dasselbe mnemonisch ist, sendet das System die BM_CLICK Meldung an das Steuerelement.

Dialogfeldeinstellungen

Die Dialogfeldeinstellungen sind die aktuellen Auswahlen und Werte für die Steuerelemente im Dialogfeld. Die Dialogfeldprozedur ist für die Initialisierung der Steuerelemente mit diesen Einstellungen beim Erstellen des Dialogfelds zuständig. Es ist auch dafür verantwortlich, die aktuellen Einstellungen aus den Steuerelementen abzurufen, bevor das Dialogfeld zerstört wird. Die Methoden zum Initialisieren und Abrufen von Einstellungen hängen vom Typ des Steuerelements ab.

Weitere Informationen finden Sie in den folgenden Themen:

Optionsfelder und Kontrollkästchen

Dialogfelder verwenden Optionsfelder und Kontrollkästchen, damit der Benutzer aus einer Liste von Optionen auswählen kann. Optionsfelder ermöglichen es dem Benutzer, aus optionen zu wählen, die sich gegenseitig ausschließen; Kontrollkästchen ermöglichen dem Benutzer die Auswahl einer Kombination von Optionen.

Die Dialogfeldprozedur kann den Anfangszustand eines Kontrollkästchens mithilfe der CheckDlgButton-Funktion festlegen, die das Kontrollkästchen festlegt oder deaktiviert. Bei Optionsfeldern in einer Gruppe von sich gegenseitig ausschließenden Optionsfeldern kann die Dialogfeldprozedur die Funktion CheckRadioButton verwenden, um das entsprechende Optionsfeld festzulegen und alle anderen Optionsfelder automatisch zu löschen.

Bevor ein Dialogfeld beendet wird, kann die Dialogfeldprozedur den Status jedes Optionsfelds und Kontrollkästchens mithilfe der IsDlgButtonChecked-Funktion überprüfen, die den aktuellen Zustand der Schaltfläche zurückgibt. In einem Dialogfeld werden diese Informationen normalerweise gespeichert, um die Schaltflächen beim nächsten Erstellen des Dialogfelds zu initialisieren.

Steuerelemente bearbeiten im Dialogfeld

Viele Dialogfelder verfügen über Bearbeitungssteuerelemente, mit denen der Benutzer Text als Eingabe bereitstellen kann. Die meisten Dialogfeldprozeduren initialisieren ein Bearbeitungssteuerelement, wenn das Dialogfeld zum ersten Mal gestartet wird. Beispielsweise kann die Dialogfeldprozedur einen vorgeschlagenen Dateinamen in das Steuerelement einfügen, den der Benutzer dann auswählen, ändern oder ersetzen kann. Die Dialogfeldprozedur kann den Text in einem Bearbeitungssteuerelement mithilfe der SetDlgItemText-Funktion festlegen, die Text aus einem angegebenen Puffer in das Bearbeitungssteuerelement kopiert. Wenn das Bearbeitungssteuerelement den Eingabefokus erhält, wählt es automatisch den vollständigen Text zur Bearbeitung aus.

Da Bearbeitungssteuerelemente ihren Text nicht automatisch an das Dialogfeld zurückgeben, muss die Dialogfeldprozedur den Text abrufen, bevor er beendet wird. Der Text kann mithilfe der GetDlgItemText-Funktion abgerufen werden, die den Bearbeitungssteuerelementtext in einen Puffer kopiert. Die Dialogfeldprozedur speichert diesen Text in der Regel, um das Bearbeitungssteuerelement später zu initialisieren, oder übergibt ihn zur Verarbeitung an das übergeordnete Fenster.

Einige Dialogfelder verwenden Bearbeitungssteuerelemente, mit denen der Benutzer Zahlen eingeben kann. Die Dialogfeldprozedur kann eine Zahl aus einem Bearbeitungssteuerelement mithilfe der GetDlgItemInt-Funktion abrufen, die den Text aus dem Bearbeitungssteuerelement abruft und den Text in einen Dezimalwert konvertiert. Der Benutzer gibt die Zahl in Dezimalstellen ein. Es kann entweder signiert oder nicht signiert sein. Die Dialogfeldprozedur kann mithilfe der SetDlgItemInt-Funktion eine ganze Zahl anzeigen. SetDlgItemInt konvertiert eine ganze Zahl ohne Vorzeichen mit Vorzeichen in eine Zeichenfolge von Dezimalstellen.

Listenfelder, Kombinationsfelder und Verzeichnisauflistungen

In einigen Dialogfeldern werden Listen mit Namen angezeigt, aus denen der Benutzer einen oder mehrere Namen auswählen kann. Um eine Liste von Dateinamen anzuzeigen, z. B. verwendet ein Dialogfeld in der Regel ein Listenfeld und die Funktionen DlgDirList und DlgDirSelectEx . Die DlgDirList-Funktion füllt automatisch ein Listenfeld mit den Dateinamen im aktuellen Verzeichnis aus. Die DlgDirSelect-Funktion ruft den ausgewählten Dateinamen aus dem Listenfeld ab. Zusammen bieten diese beiden Funktionen eine bequeme Möglichkeit für ein Dialogfeld, einen Verzeichniseintrag anzuzeigen, sodass der Benutzer eine Datei auswählen kann, ohne ihren Namen und Speicherort eingeben zu müssen.

Ein Dialogfeld kann auch ein Kombinationsfeld verwenden, um eine Liste von Dateinamen anzuzeigen. Die DlgDirListComboBox-Funktion füllt automatisch einen Listenfeldteil des Kombinationsfelds mit den Dateinamen im aktuellen Verzeichnis aus. Die DlgDirSelectComboBoxEx-Funktion ruft einen ausgewählten Dateinamen aus dem Listenfeldteil ab.

Dialogfeld-Steuerelementmeldungen

Viele Steuerelemente erkennen vordefinierte Nachrichten, die, wenn sie von Steuerelementen empfangen werden, dazu führen, dass sie eine Aktion ausführen. Beispielsweise wird mit der BM_SETCHECK Meldung das Kontrollkästchen aktiviert, und die EM_GETSEL Nachricht ruft den Teil des aktuell ausgewählten Steuerelementtexts ab. Die Steuerelementmeldungen ermöglichen einer Dialogprozedur einen größeren und flexibleren Zugriff auf die Steuerelemente als die Standardfunktionen, sodass sie häufig verwendet werden, wenn das Dialogfeld komplexe Interaktionen mit dem Benutzer erfordert.

Eine Dialogfeldprozedur kann eine Nachricht an ein Steuerelement senden, indem sie den Steuerelementbezeichner und die SendDlgItemMessage-Funktion verwendet, die mit der SendMessage-Funktion identisch ist, mit der Ausnahme, dass sie einen Steuerelementbezeichner anstelle eines Fensterhandles verwendet, um das Steuerelement zu identifizieren, das die Nachricht empfangen soll. Eine angegebene Nachricht erfordert möglicherweise, dass die Dialogprozedur Parameter mit der Nachricht sendet, und die Nachricht kann entsprechende Rückgabewerte aufweisen. Der Vorgang und die Anforderungen jeder Kontrollnachricht hängen vom Zweck der Nachricht und dem Steuerelement ab, das sie verarbeitet.

Weitere Informationen zu den Steuerelementmeldungen finden Sie unter Windows-Steuerelemente.

Benutzerdefinierte Dialogfelder

Eine Anwendung kann benutzerdefinierte Dialogfelder erstellen, indem sie eine anwendungsdefinierte Fensterklasse für die Dialogfelder anstelle der vordefinierten Dialogfeldklasse verwendet. Anwendungen verwenden diese Methode in der Regel, wenn ein Dialogfeld ihr Standard Fenster ist, aber es ist auch nützlich, um modale und moduslose Dialogfelder für Anwendungen zu erstellen, die standardmäßig überlappende Fenster verfügen.

Die anwendungsdefinierte Fensterklasse ermöglicht es der Anwendung, eine Fensterprozedur für das Dialogfeld zu definieren und Nachrichten zu verarbeiten, bevor sie an die Dialogfeldprozedur gesendet werden. Außerdem kann die Anwendung ein Klassensymbol, einen Klassenhintergrundpinsel und ein Klassenmenü für das Dialogfeld definieren. Die Anwendung muss die Fensterklasse registrieren, bevor sie versucht, ein Dialogfeld zu erstellen, und die Dialogfeldvorlage mit dem Atomwert oder Namen der Fensterklasse bereitstellen.

Viele Anwendungen erstellen eine neue Dialogfeldklasse, indem sie zuerst die Klasseninformationen für die vordefinierte Dialogfeldklasse abrufen und an die GetClassInfo-Funktion übergeben, die eine WNDCLASS-Struktur mit den Informationen auffüllt. Die Anwendung ändert einzelne Member der Struktur, z. B. den Klassennamen, den Pinsel und das Symbol, und registriert dann die neue Klasse mithilfe der RegisterClass-Funktion . Wenn eine Anwendung die WNDCLASS-Struktur selbst auffüllt, muss sie den cbWndExtra-Member auf DLGWINDOWEXTRA festlegen. Dies ist die Anzahl zusätzlicher Bytes, die das System für jedes Dialogfeld benötigt. Wenn eine Anwendung auch zusätzliche Bytes für jedes Dialogfeld verwendet, müssen diese über die vom System erforderlichen zusätzlichen Bytes hinausgehen.

Die Fensterprozedur für das benutzerdefinierte Dialogfeld hat dieselben Parameter und Anforderungen wie jede andere Fensterprozedur. Im Gegensatz zu anderen Fensterprozeduren sollte die Fensterprozedur für dieses Dialogfeld jedoch die Funktion DefDlgProc anstelle der Funktion DefWindowProc für alle Nachrichten aufrufen, die nicht verarbeitet werden. DefDlgProc führt die gleiche Standardnachrichtenverarbeitung wie die Fensterprozedur für das vordefinierte Dialogfeld aus, einschließlich des Aufrufs der Dialogfeldprozedur.

Eine Anwendung kann auch benutzerdefinierte Dialogfelder erstellen, indem sie die Fensterprozedur des vordefinierten Dialogfelds unterklassiert. Mit der SetWindowLong-Funktion kann eine Anwendung die Fensterprozedur für ein angegebenes Fenster angeben. Die Anwendung versucht möglicherweise auch, eine Unterklasse mithilfe der SetClassLong-Funktion zu verwenden, aber dies wirkt sich auf alle Dialogfelder im System aus, nicht nur die, die zur Anwendung gehören.

Anwendungen, die benutzerdefinierte Dialogfelder erstellen, stellen manchmal eine alternative Tastaturschnittstelle für die Dialogfelder bereit. Bei moduslosen Dialogfeldern kann dies bedeuten, dass die Anwendung die IsDialogMessage-Funktion nicht aufruft und stattdessen alle Tastatureingaben in der benutzerdefinierten Fensterprozedur verarbeitet. In solchen Fällen kann die Anwendung die WM_NEXTDLGCTL Meldung verwenden, um den Code zu minimieren, der zum Verschieben des Eingabefokus von einem Steuerelement auf ein anderes erforderlich ist. Wenn diese Meldung an DefDlgProc übergeben wird, verschiebt den Eingabefokus auf ein angegebenes Steuerelement und aktualisiert die Darstellung der Steuerelemente, z. B. das Verschieben des Standardrahmens für Drucktasten oder das Festlegen eines automatischen Optionsfelds.