Dialogfelder "Info"
Es gibt viele Funktionen, Nachrichten und vordefinierte Steuerelemente, die beim Erstellen und Verwalten von Dialogfeldern helfen, wodurch die Entwicklung der Benutzeroberfläche für eine Anwendung erleichtert wird. In dieser Übersicht werden die Funktionen und Nachrichten des Dialogfelds beschrieben und erläutert, wie Sie sie zum Erstellen und Verwenden von Dialogfeldern verwenden.
Diese Übersicht enthält die folgenden Themen:
- Verwendung eines Dialogfelds
- Dialogfeld "Besitzer"-Fenster
- Meldungsfelder
- Modale Dialogfelder
- Dialogfelder ohne Modus
- Dialogfeldvorlagen
Weitere Informationen zu den allgemeinen Dialogfeldern finden Sie unter Common Dialog Box Library.
Verwendung eines Dialogfelds
Die meisten Anwendungen verwenden Dialogfelder, um zusätzliche Informationen für Menüelemente einzugeben, die benutzereingaben erfordern. Die Verwendung eines Dialogfelds ist die einzige empfohlene Möglichkeit für eine Anwendung zum Abrufen der Eingabe. Beispielsweise erfordert ein typisches Menüelement Öffnen den Namen einer Datei zum Öffnen, sodass eine Anwendung ein Dialogfeld verwenden sollte, um den Benutzer zur Eingabe des Namens aufzufordern. In solchen Fällen erstellt die Anwendung das Dialogfeld, wenn der Benutzer auf das Menüelement klickt und das Dialogfeld sofort zerstört, nachdem der Benutzer die Informationen bereitgestellt hat.
Viele Anwendungen verwenden auch Dialogfelder, um Informationen oder Optionen anzuzeigen, während der Benutzer in einem anderen Fenster arbeitet. Beispielsweise verwenden Textverarbeitungsanwendungen häufig ein Dialogfeld mit einer Textsucheoption. Während die Anwendung nach dem Text sucht, bleibt das Dialogfeld auf dem Bildschirm. Der Benutzer kann dann zum Dialogfeld zurückkehren und erneut nach demselben Wort suchen. oder der Benutzer kann den Eintrag im Dialogfeld ändern und nach einem neuen Wort suchen. Anwendungen, die Dialogfelder auf diese Weise verwenden, erstellen in der Regel eins, wenn der Benutzer auf das Menüelement klickt und es solange anzeigt, wie die Anwendung ausgeführt wird oder bis der Benutzer das Dialogfeld explizit schließt.
Um die verschiedenen Verwendungsmöglichkeiten von Dialogfeldern durch Anwendungen zu unterstützen, gibt es zwei Arten von Dialogfeldern: modal und moduslos. Ein modales Dialogfeld erfordert, dass der Benutzer Informationen angibt oder das Dialogfeld abbricht, bevor die Anwendung fortgesetzt werden kann. Anwendungen verwenden modale Dialogfelder in Verbindung mit Menüelementen, die zusätzliche Informationen erfordern, bevor sie fortfahren können. Ein modusloses Dialogfeld ermöglicht es dem Benutzer, Informationen anzugeben und zur vorherigen Aufgabe zurückzukehren, ohne das Dialogfeld zu schließen. Modale Dialogfelder sind einfacher zu verwalten als moduslose Dialogfelder, da sie erstellt werden, ihre Aufgabe ausführen und durch Aufrufen einer einzelnen Funktion zerstört werden.
Um ein modales oder ein modusloses Dialogfeld zu erstellen, muss eine Anwendung eine Dialogfeldvorlage bereitstellen, um den Stil und den Inhalt des Dialogfelds zu beschreiben. Die Anwendung muss auch eine Dialogfeldprozedur bereitstellen, um Aufgaben auszuführen. Die Dialogfeldvorlage ist eine binäre Beschreibung des Dialogfelds und der darin enthaltenen Steuerelemente. Der Entwickler kann diese Vorlage als Ressource erstellen, die aus der ausführbaren Datei der Anwendung geladen oder im Arbeitsspeicher erstellt werden soll, während die Anwendung ausgeführt wird. Die Dialogfeldprozedur ist eine anwendungsdefinierte Rückruffunktion, die das System aufruft, wenn es über Eingaben für das Dialogfeld oder Aufgaben für das Dialogfeld verfügt, die ausgeführt werden sollen. Obwohl eine Dialogfeldprozedur einer Fensterprozedur ähnelt, hat sie nicht die gleichen Zuständigkeiten.
Eine Anwendung erstellt in der Regel mithilfe der Funktion DialogBox oder CreateDialog ein Dialogfeld. DialogBox erstellt ein modales Dialogfeld. CreateDialog erstellt ein dialogfeld ohne Modus. Diese beiden Funktionen laden eine Dialogfeldvorlage aus der ausführbaren Datei der Anwendung und erstellen ein Popupfenster, das den Spezifikationen der Vorlage entspricht. Es gibt andere Funktionen, die mithilfe von Vorlagen im Arbeitsspeicher ein Dialogfeld erstellen. sie übergeben zusätzliche Informationen an die Dialogfeldprozedur, während das Dialogfeld erstellt wird.
Dialogfelder gehören in der Regel zu einer vordefinierten, exklusiven Fensterklasse. Das System verwendet diese Fensterklasse und die entsprechende Fensterprozedur sowohl für modale als auch für moduslose Dialogfelder. Wenn die Funktion aufgerufen wird, erstellt sie das Fenster für das Dialogfeld sowie die Fenster für die Steuerelemente im Dialogfeld und sendet dann ausgewählte Nachrichten an die Dialogfeldprozedur. Während das Dialogfeld sichtbar ist, verwaltet die vordefinierte Fensterprozedur alle Nachrichten, verarbeitet einige Nachrichten und übergibt andere an die Dialogfeldprozedur, damit die Prozedur Aufgaben ausführen kann. Anwendungen haben keinen direkten Zugriff auf die vordefinierte Fensterklasse oder Fensterprozedur, aber sie können die Dialogfeldvorlage und die Dialogfeldprozedur verwenden, um den Stil und das Verhalten eines Dialogfelds zu ändern.
Dialogfeld "Besitzer"-Fenster
Die meisten Dialogfelder verfügen über ein Besitzerfenster (oder einfach einen Besitzer). Beim Erstellen des Dialogfelds legt die Anwendung den Besitzer fest, indem das Fensterhandle des Besitzers angegeben wird. Das System verwendet den Besitzer, um die Position des Dialogfelds in der Z-Reihenfolge zu bestimmen, sodass das Dialogfeld immer über seinem Besitzer positioniert ist. Außerdem kann das System Nachrichten an die Fensterprozedur des Besitzers senden und ihn über Ereignisse im Dialogfeld benachrichtigen.
Das System blendet das Dialogfeld automatisch aus oder zerstört es, wenn der Besitzer ausgeblendet oder zerstört wird. Dies bedeutet, dass die Dialogfeldprozedur keine spezielle Verarbeitung erfordert, um Änderungen am Zustand des Besitzerfensters zu erkennen.
Da das typische Dialogfeld in Verbindung mit einem Menüelement verwendet wird, ist das Besitzerfenster in der Regel das Fenster, das das Menü enthält. Obwohl es möglich ist, ein Dialogfeld ohne Besitzer zu erstellen, wird es nicht empfohlen. Wenn z. B. ein modales Dialogfeld keinen Besitzer hat, deaktiviert das System keines der anderen Fenster der Anwendung und ermöglicht es dem Benutzer, weiterhin Arbeit in den anderen Fenstern auszuführen, wodurch der Zweck des modalen Dialogfelds verfehlt wird.
Wenn ein modusloses Dialogfeld keinen Besitzer hat, blendet oder zerstört das System das Dialogfeld weder, wenn andere Fenster in der Anwendung ausgeblendet oder zerstört werden. Obwohl dies den Zweck des moduslosen Dialogfelds nicht zunichte macht, erfordert es, dass die Anwendung eine spezielle Verarbeitung durchführt, um sicherzustellen, dass das Dialogfeld zu geeigneten Zeiten ausgeblendet und zerstört wird.
Meldungsfelder
Ein Meldungsfeld ist ein spezielles Dialogfeld, mit dem eine Anwendung Meldungen anzeigen und zur Eingabe auffordern kann. Ein Meldungsfeld enthält in der Regel eine Textnachricht und eine oder mehrere Schaltflächen. Eine Anwendung erstellt das Meldungsfeld mithilfe der MessageBox - oder MessageBoxEx-Funktion , wobei der Text sowie die Anzahl und die Typen der anzuzeigenden Schaltflächen angegeben werden. Beachten Sie, dass es derzeit keinen Unterschied zwischen der Funktionsweise von MessageBox und MessageBoxEx gibt.
Obwohl das Meldungsfeld ein Dialogfeld ist, übernimmt das System die vollständige Kontrolle über die Erstellung und Verwaltung des Meldungsfelds. Dies bedeutet, dass die Anwendung keine Dialogfeldvorlage und keine Dialogfeldprozedur bereitstellt. Das System erstellt eine eigene Vorlage basierend auf dem Text und den Schaltflächen, die für das Meldungsfeld angegeben sind, und stellt eine eigene Dialogfeldprozedur bereit.
Ein Meldungsfeld ist ein modales Dialogfeld, und das System erstellt es mit den gleichen internen Funktionen, die DialogBox verwendet. Wenn die Anwendung beim Aufrufen von MessageBox oder MessageBoxEx ein Besitzerfenster angibt, deaktiviert das System den Besitzer. Eine Anwendung kann das System auch anweisen, alle Fenster der obersten Ebene zu deaktivieren, die zum aktuellen Thread gehören, indem beim Erstellen des Dialogfelds der MB_TASKMODAL Wert angegeben wird.
Das System kann Nachrichten an den Besitzer senden, z. B. WM_CANCELMODE und WM_ENABLE, genau wie beim Erstellen eines modalen Dialogfelds. Das Besitzerfenster sollte alle aktionen ausführen, die von diesen Nachrichten angefordert werden.
Modale Dialogfelder
Ein modales Dialogfeld sollte ein Popupfenster mit einem Fenstermenü, einer Titelleiste und einem dicken Rahmen sein. Das heißt, die Dialogfeldvorlage sollte die Formatvorlagen WS_POPUP, WS_SYSMENU, WS_CAPTION und DS_MODALFRAME angeben. Obwohl eine Anwendung die WS_VISIBLE Stil festlegen kann, zeigt das System immer ein modales Dialogfeld an, unabhängig davon, ob die Dialogfeldvorlage den WS_VISIBLE Stil angibt. Eine Anwendung darf kein modales Dialogfeld mit dem WS_CHILD Stil erstellen. Ein modales Dialogfeld mit diesem Format deaktiviert sich selbst und verhindert, dass nachfolgende Eingaben die Anwendung erreichen.
Eine Anwendung erstellt ein modales Dialogfeld mithilfe der Funktion DialogBox oder DialogBoxIndirect . DialogBox erfordert den Namen oder bezeichner einer Ressource, die eine Dialogfeldvorlage enthält. DialogBoxIndirect erfordert ein Handle für ein Speicherobjekt, das eine Dialogfeldvorlage enthält. Die Funktionen DialogBoxParam und DialogBoxIndirectParam erstellen auch modale Dialogfelder. Sie sind identisch mit den zuvor erwähnten Funktionen, übergeben jedoch einen angegebenen Parameter an die Dialogfeldprozedur, wenn das Dialogfeld erstellt wird.
Beim Erstellen des modalen Dialogfelds wird es vom System zum aktiven Fenster. Das Dialogfeld bleibt aktiv, bis die Dialogfeldprozedur die EndDialog-Funktion aufruft oder das System ein Fenster in einer anderen Anwendung aktiviert. Weder der Benutzer noch die Anwendung können das Besitzerfenster aktiv machen, bis das modale Dialogfeld zerstört wird.
Wenn das Besitzerfenster noch nicht deaktiviert ist, deaktiviert das System das Fenster und alle untergeordneten Fenster, die dazu gehören, automatisch, wenn es das modale Dialogfeld erstellt. Das Besitzerfenster bleibt deaktiviert, bis das Dialogfeld zerstört wird. Obwohl eine Dialogfeldprozedur das Besitzerfenster möglicherweise jederzeit aktivieren könnte, wird die Aktivierung des Besitzers den Zweck des modalen Dialogfelds verfehlt und wird nicht empfohlen. Wenn die Dialogfeldprozedur zerstört wird, aktiviert das System das Besitzerfenster erneut, aber nur, wenn das modale Dialogfeld dazu geführt hat, dass der Besitzer deaktiviert wurde.
Während das System das modale Dialogfeld erstellt, sendet es die WM_CANCELMODE Meldung an das Fenster (sofern vorhanden), das derzeit Mauseingaben erfasst. Eine Anwendung, die diese Meldung empfängt, sollte die Mausaufnahme loslassen, damit der Benutzer die Maus im modale Dialogfeld bewegen kann. Da das System das Besitzerfenster deaktiviert, gehen alle Mauseingaben verloren, wenn der Besitzer die Maus beim Empfang dieser Nachricht nicht loslassen kann.
Um Nachrichten für das modale Dialogfeld zu verarbeiten, startet das System eine eigene Nachrichtenschleife und übernimmt die temporäre Kontrolle über die Nachrichtenwarteschlange für die gesamte Anwendung. Wenn das System eine Nachricht abruft, die nicht explizit für das Dialogfeld ist, sendet es die Nachricht an das entsprechende Fenster. Wenn eine WM_QUIT Nachricht abgerufen wird, wird die Nachricht zurück an die Anwendungsnachrichtenwarteschlange gesendet, damit die Standard Nachrichtenschleife der Anwendung die Nachricht schließlich abrufen kann.
Das System sendet die WM_ENTERIDLE Nachricht an das Besitzerfenster, wenn die Anwendungsmeldungswarteschlange leer ist. Die Anwendung kann diese Meldung verwenden, um eine Hintergrundaufgabe auszuführen, während das Dialogfeld auf dem Bildschirm verbleibt. Wenn eine Anwendung die Nachricht auf diese Weise verwendet, muss die Anwendung häufig ein Steuerelement (z. B. mithilfe der PeekMessage-Funktion ) bereitstellen, damit das modale Dialogfeld beliebige Benutzereingaben empfangen kann. Um zu verhindern, dass das modale Dialogfeld die WM_ENTERIDLE Nachrichten sendet, kann die Anwendung beim Erstellen des Dialogfelds den DS_NOIDLEMSG Stil angeben.
Eine Anwendung zerstört ein modales Dialogfeld mithilfe der EndDialog-Funktion . In den meisten Fällen ruft die Dialogfeldprozedur EndDialog auf, wenn der Benutzer im Fenstermenü des Dialogfelds auf Schließen klickt oder im Dialogfeld auf die Schaltfläche OK oder Abbrechen klickt. Das Dialogfeld kann einen Wert über die DialogBox-Funktion (oder andere Erstellungsfunktionen) zurückgeben, indem beim Aufrufen der EndDialog-Funktion ein Wert angegeben wird. Das System gibt diesen Wert zurück, nachdem das Dialogfeld zerstört wurde. Die meisten Anwendungen verwenden diesen Rückgabewert, um zu bestimmen, ob das Dialogfeld seine Aufgabe erfolgreich abgeschlossen hat oder vom Benutzer abgebrochen wurde. Das System gibt die Steuerung von der Funktion, die das Dialogfeld erstellt, erst zurück, wenn die Dialogfeldprozedur die EndDialog-Funktion aufgerufen hat.
Dialogfelder ohne Modus
Ein modusloses Dialogfeld sollte ein Popupfenster mit einem Fenstermenü, einer Titelleiste und einem dünnen Rahmen sein. Das heißt, die Dialogfeldvorlage sollte die Stile WS_POPUP, WS_CAPTION, WS_BORDER und WS_SYSMENU angeben. Das Dialogfeld wird vom System nicht automatisch angezeigt, es sei denn, die Vorlage gibt den WS_VISIBLE Stil an.
Eine Anwendung erstellt mithilfe der Funktion CreateDialog oder CreateDialogIndirect ein dialogfeld ohne Modus. CreateDialog erfordert den Namen oder Bezeichner einer Ressource, die eine Dialogfeldvorlage enthält. CreateDialogIndirect erfordert ein Handle für ein Speicherobjekt, das eine Dialogfeldvorlage enthält. Zwei weitere Funktionen, CreateDialogParam und CreateDialogIndirectParam, erstellen ebenfalls dialogfelder ohne Modus; sie übergeben einen angegebenen Parameter an die Dialogfeldprozedur, wenn das Dialogfeld erstellt wird.
CreateDialog und andere Erstellungsfunktionen geben ein Fensterhandle an das Dialogfeld zurück. Die Anwendung und die Dialogfeldprozedur können dieses Handle verwenden, um das Dialogfeld zu verwalten. Wenn beispielsweise WS_VISIBLE in der Dialogfeldvorlage nicht angegeben ist, kann die Anwendung das Dialogfeld anzeigen, indem sie das Fensterhandle an die ShowWindow-Funktion übergibt.
Ein modusloses Dialogfeld deaktiviert weder das Besitzerfenster noch sendet es Nachrichten. Beim Erstellen des Dialogfelds wird es vom System zum aktiven Fenster, aber der Benutzer oder die Anwendung kann das aktive Fenster jederzeit ändern. Wenn das Dialogfeld inaktiv wird, bleibt es über dem Besitzerfenster in der Z-Reihenfolge, auch wenn das Besitzerfenster aktiv ist.
Die Anwendung ist für das Abrufen und Senden von Eingabenachrichten an das Dialogfeld verantwortlich. Die meisten Anwendungen verwenden hierfür die Standard-Nachrichtenschleife. Damit der Benutzer über die Tastatur zu Steuerelementen wechseln und diese auswählen kann, muss die Anwendung jedoch die IsDialogMessage-Funktion aufrufen. Weitere Informationen zu dieser Funktion finden Sie unter Dialogfeld-Tastaturschnittstelle.
Ein modusloses Dialogfeld kann keinen Wert an die Anwendung zurückgeben, wie es ein modales Dialogfeld tut, aber die Dialogfeldprozedur kann Mithilfe der SendMessage-Funktion Informationen an das Besitzerfenster senden.
Eine Anwendung muss alle moduslosen Dialogfelder zerstören, bevor sie beendet werden. Es kann ein modusloses Dialogfeld mithilfe der DestroyWindow-Funktion zerstören. In den meisten Fällen ruft die Dialogfeldprozedur DestroyWindow als Reaktion auf Benutzereingaben auf, z. B. durch Klicken auf die Schaltfläche Abbrechen . Wenn der Benutzer das Dialogfeld nie auf diese Weise schließt, muss die Anwendung DestroyWindow aufrufen.
DestroyWindow ungültigiert das Fensterhandle für das Dialogfeld, sodass alle nachfolgenden Aufrufe von Funktionen, die den Handle verwenden, Fehlerwerte zurückgeben. Um Fehler zu vermeiden, sollte die Dialogfeldprozedur den Besitzer darüber informieren, dass das Dialogfeld zerstört wurde. Viele Anwendungen verwalten eine globale Variable, die das Handle für das Dialogfeld enthält. Wenn die Dialogfeldprozedur das Dialogfeld zerstört, legt sie auch die globale Variable auf NULL fest, was angibt, dass das Dialogfeld nicht mehr gültig ist.
Die Dialogfeldprozedur darf die EndDialog-Funktion nicht aufrufen, um ein modusloses Dialogfeld zu zerstören.
Dialogfeldvorlagen
Eine Dialogfeldvorlage sind Binärdaten, die das Dialogfeld beschreiben und dessen Höhe, Breite, Stil und die enthaltenen Steuerelemente definieren. Um ein Dialogfeld zu erstellen, lädt das System entweder eine Dialogfeldvorlage aus den Ressourcen in der ausführbaren Datei der Anwendung oder verwendet die Vorlage, die von der Anwendung im globalen Arbeitsspeicher übergeben wird. In beiden Fällen muss die Anwendung beim Erstellen eines Dialogfelds eine Vorlage bereitstellen.
Ein Entwickler erstellt Vorlagenressourcen mithilfe eines Ressourcencompilers oder eines Dialogfeld-Editors. Ein Ressourcencompiler konvertiert eine Textbeschreibung in eine binäre Ressource, und ein Dialogfeld-Editor speichert ein interaktiv erstelltes Dialogfeld als binäre Ressource.
Hinweis
Eine Erläuterung, wie Vorlagenressourcen erstellt und der ausführbaren Datei der Anwendung hinzugefügt werden, sprengt den Rahmen dieser Übersicht. Weitere Informationen zum Erstellen von Vorlagenressourcen und zum Hinzufügen dieser Ressourcen zu einer ausführbaren Datei finden Sie in der Dokumentation, die mit Ihren Anwendungsentwicklungstools bereitgestellt wird.
Um ein Dialogfeld ohne Verwendung von Vorlagenressourcen zu erstellen, müssen Sie eine Vorlage im Arbeitsspeicher erstellen und an die Funktion CreateDialogIndirectParam oder DialogBoxIndirectParam oder an das Makro CreateDialogIndirect oder DialogBoxIndirect übergeben.
Eine Dialogfeldvorlage im Arbeitsspeicher besteht aus einem Header, der das Dialogfeld beschreibt, gefolgt von einem oder mehreren zusätzlichen Datenblöcken, die die einzelnen Steuerelemente im Dialogfeld beschreiben. Die Vorlage kann entweder das Standardformat oder das erweiterte Format verwenden. In einer Standardvorlage ist der Header eine DLGTEMPLATE-Struktur , gefolgt von zusätzlichen Arrays mit variabler Länge. und die Daten für jedes Steuerelement bestehen aus einer DLGITEMTEMPLATE-Struktur gefolgt von zusätzlichen Arrays mit variabler Länge. In einer erweiterten Dialogfeldvorlage verwendet der Header das DLGTEMPLATEEX-Format und die Steuerelementdefinitionen das DLGITEMTEMPLATEEX-Format .
Sie können eine Speichervorlage erstellen, indem Sie ein globales Speicherobjekt zuweisen und es mit den Standard- oder erweiterten Header- und Steuerelementdefinitionen füllen. Eine Speichervorlage ist in Form und Inhalt identisch mit einer Vorlagenressource. Viele Anwendungen, die Speichervorlagen verwenden, verwenden zuerst die LoadResource-Funktion , um eine Vorlagenressource in den Arbeitsspeicher zu laden, und ändern dann die geladene Ressource, um eine neue Speichervorlage zu erstellen. Weitere Informationen zum Erstellen einer Dialogfeldvorlage im Arbeitsspeicher finden Sie unter Vorlagen im Arbeitsspeicher.
In den folgenden Abschnitten werden die Stile, Messungen und andere Werte beschrieben, die in einer Dialogfeldvorlage verwendet werden.
- Dialogfeldvorlagenstile
- Dialogfeldmessungen
- Dialogfeldsteuerelemente
- Menü des Dialogfeldfensters
- Dialogfeldschriftarten
- Vorlagen im Arbeitsspeicher
Dialogfeldvorlagenstile
Jede Dialogfeldvorlage gibt eine Kombination von Formatwerten an, die die Darstellung und die Features des Dialogfelds definieren. Die Formatvorlagenwerte können Fensterstile sein, z. B. WS_POPUP und WS_SYSMENU, sowie Dialogfeldformate, z. B. DS_MODALFRAME. Anzahl und Typ der Formatvorlagen für eine Vorlage hängen vom Typ und Zweck des Dialogfelds ab. Eine Liste der Werte finden Sie unter Dialogfeldstile.
Das System übergibt beim Erstellen des Dialogfelds alle in der Vorlage angegebenen Fensterstile an die CreateWindowEx-Funktion . Abhängig von den angegebenen Dialogfeldformatvorlagen kann das System einen oder mehrere erweiterte Stile übergeben. Wenn die Vorlage beispielsweise DS_MODALFRAME angibt, verwendet das System beim Erstellen des Dialogfelds WS_EX_DLGMODALFRAME .
Die meisten Dialogfelder sind Popupfenster mit einem Fenstermenü und einer Titelleiste. Daher gibt die typische Vorlage die Stile WS_POPUP, WS_SYSMENU und WS_CAPTION an. Die Vorlage gibt auch eine Rahmenart an: WS_BORDER für moduslose Dialogfelder und DS_MODALFRAME für modale Dialogfelder. Eine Vorlage kann einen anderen Fenstertyp als popup (z. B. WS_OVERLAPPED) angeben, wenn sie anstelle eines Dialogfelds ein angepasstes Fenster erstellt.
Das System zeigt immer ein modales Dialogfeld an, unabhängig davon, ob die WS_VISIBLE Stil angegeben ist. Wenn die Vorlage für ein modusloses Dialogfeld die WS_VISIBLE Stil angibt, zeigt das System das Dialogfeld automatisch an, wenn es erstellt wird. Andernfalls ist die Anwendung dafür verantwortlich, das Dialogfeld mithilfe der ShowWindow-Funktion anzuzeigen.
Dialogfeldmessungen
Jede Dialogfeldvorlage enthält Messungen, die die Position, Breite und Höhe des Dialogfelds und der enthaltenen Steuerelemente angeben. Diese Messungen sind geräteunabhängig, sodass eine Anwendung eine einzelne Vorlage verwenden kann, um dasselbe Dialogfeld für alle Arten von Anzeigegeräten zu erstellen. Dadurch wird sichergestellt, dass ein Dialogfeld trotz unterschiedlicher Auflösungen und Seitenverhältnisse auf allen Bildschirmen die gleichen Proportionen und das gleiche Aussehen aufweist.
Die Messungen in einer Dialogfeldvorlage werden in Dialogfeldvorlageneinheiten angegeben. Um Messungen von Einheiten für Dialogvorlagen in Bildschirmeinheiten (Pixel) zu konvertieren, verwenden Sie die MapDialogRect-Funktion , die die vom Dialogfeld verwendete Schriftart berücksichtigt und ein Rechteck aus Dialogfeldvorlageneinheiten ordnungsgemäß in Pixel konvertiert. Für Dialogfelder, die die Systemschriftart verwenden, können Sie die GetDialogBaseUnits-Funktion verwenden, um die Konvertierungsberechnungen selbst durchzuführen, obwohl die Verwendung von MapDialogRect einfacher ist.
Die Vorlage muss die Anfangskoordinaten der oberen linken Ecke des Dialogfelds angeben. Normalerweise sind die Koordinaten relativ zur oberen linken Ecke des Clientbereichs des Besitzerfensters. Wenn die Vorlage die DS_ABSALIGN Stil angibt oder das Dialogfeld keinen Besitzer hat, ist die Position relativ zur oberen linken Ecke des Bildschirms. Das System legt diese Anfangsposition beim Erstellen des Dialogfelds fest, ermöglicht jedoch einer Anwendung, die Position vor dem Anzeigen des Dialogfelds anzupassen. Beispielsweise kann eine Anwendung die Dimensionen des Besitzerfensters abrufen, eine neue Position berechnen, die das Dialogfeld im Besitzerfenster zentriert, und dann die Position mithilfe der SetWindowPos-Funktion festlegen.
Die Vorlage sollte eine Dialogfeldbreite und -höhe angeben, die die Breite und Höhe des Bildschirms nicht überschreitet, und sicherstellen, dass sich alle Steuerelemente im Clientbereich des Dialogfelds befinden. Obwohl das System ein Dialogfeld eine beliebige Größe zulässt, kann das Erstellen eines Dialogfelds, das zu klein oder zu groß ist, verhindern, dass der Benutzer Eingaben bereitstellt, wodurch der Zweck des Dialogfelds verfehlt wird. Viele Anwendungen verwenden mehr als ein Dialogfeld, wenn eine große Anzahl von Steuerelementen vorhanden ist. In solchen Fällen enthält das anfängliche Dialogfeld in der Regel eine oder mehrere Schaltflächen, die der Benutzer auswählen kann, um das nächste Dialogfeld anzuzeigen.
Dialogfeldsteuerelemente
Die Vorlage gibt die Position, Breite, Höhe, Stil, Bezeichner und Fensterklasse für jedes Steuerelement im Dialogfeld an. Das System erstellt jedes Steuerelement, indem diese Daten an die CreateWindowEx-Funktion übergeben werden. Steuerelemente werden in der Reihenfolge erstellt, in der sie in der Vorlage angegeben sind. Die Vorlage sollte die entsprechende Anzahl, den Typ und die Reihenfolge der Steuerelemente angeben, um sicherzustellen, dass der Benutzer die Eingabe eingeben kann, die zum Abschließen der aufgabe erforderlich ist, die dem Dialogfeld zugeordnet ist.
Für jedes Steuerelement gibt die Vorlage Stilwerte an, die die Darstellung und den Betrieb des Steuerelements definieren. Jedes Steuerelement ist ein untergeordnetes Fenster und muss daher über den WS_CHILD-Stil verfügen. Um sicherzustellen, dass das Steuerelement sichtbar ist, wenn das Dialogfeld angezeigt wird, muss jedes Steuerelement auch den WS_VISIBLE Stil aufweisen. Andere häufig verwendete Fensterstile sind WS_BORDER für Steuerelemente mit optionalen Rahmen, WS_DISABLED für Steuerelemente, die deaktiviert werden sollen, wenn das Dialogfeld anfänglich erstellt wird, und WS_TABSTOP und WS_GROUP für Steuerelemente, auf die über die Tastatur zugegriffen werden kann. Die Stile WS_TABSTOP und WS_GROUP werden in Verbindung mit der weiter unten in diesem Thema beschriebenen Dialogtastataturschnittstelle verwendet.
Die Vorlage kann auch Steuerelementstile angeben, die für die Fensterklasse des Steuerelements spezifisch sind. Beispielsweise muss eine Vorlage, die ein Schaltflächensteuerelement angibt, eine Schaltflächensteuerungsart wie BS_PUSHBUTTON oder BS_CHECKBOX. Das System übergibt die Steuerelementstile über die WM_CREATE-Meldung an die Steuerungsfensterprozedur, sodass die Prozedur die Darstellung und den Betrieb des Steuerelements anpassen kann.
Das System konvertiert die Positionskoordinaten sowie die Breiten- und Höhenmessungen von Dialogbasiseinheiten in Pixel, bevor diese an CreateWindowEx übergeben werden. Wenn das System ein -Steuerelement erstellt, gibt es das Dialogfeld als übergeordnetes Fenster an. Dies bedeutet, dass das System die Positionskoordinaten des Steuerelements immer als Clientkoordinaten interpretiert, relativ zur oberen linken Ecke des Clientbereichs des Dialogfelds.
Die Vorlage gibt die Fensterklasse für jedes Steuerelement an. Ein typisches Dialogfeld enthält Steuerelemente, die zu den vordefinierten Steuerelementfensterklassen gehören, z. B. die Schaltflächen- und Bearbeitungsfensterklassen. In diesem Fall gibt die Vorlage Fensterklassen an, indem die entsprechenden vordefinierten Atomwerte für die Klassen bereitgestellt werden. Wenn ein Dialogfeld ein Steuerelement enthält, das zu einer benutzerdefinierten Steuerelementfensterklasse gehört, gibt die Vorlage den Namen der registrierten Fensterklasse oder den Atomwert an, der dem Namen derzeit zugeordnet ist.
Jedes Steuerelement in einem Dialogfeld muss über einen eindeutigen Bezeichner verfügen, um es von anderen Steuerelementen zu unterscheiden. Steuerelemente senden Informationen über WM_COMMAND Nachrichten an die Dialogfeldprozedur, sodass die Steuerelement-IDs für die Prozedur entscheidend sind, um zu bestimmen, welches Steuerelement eine angegebene Nachricht gesendet hat. Die einzige Ausnahme von dieser Regel sind Steuerelementbezeichner für statische Steuerelemente. Statische Steuerelemente erfordern keine eindeutigen Bezeichner, da sie keine WM_COMMAND Nachrichten senden.
Damit der Benutzer das Dialogfeld schließen kann, muss die Vorlage mindestens eine Drucktaste angeben und ihr den Steuerbezeichner IDCANCEL zuweisen. Damit der Benutzer wählen kann, ob die dem Dialogfeld zugeordnete Aufgabe abgeschlossen oder abgebrochen wird, sollte die Vorlage zwei Pushschaltflächen mit den Bezeichnungen OK und Abbrechen mit den Steuerbezeichnern IDOK bzw . IDCANCEL angeben.
Eine Vorlage gibt auch optionalen Text und Erstellungsdaten für ein Steuerelement an. Der Text stellt in der Regel Bezeichnungen für Schaltflächensteuerelemente bereit oder gibt den anfänglichen Inhalt eines statischen Textsteuerelements an. Die Erstellungsdaten sind ein oder mehrere Bytes von Daten, die das System beim Erstellen des Steuerelements an die Steuerelementfensterprozedur übergibt. Das Erstellen von Daten ist nützlich für Steuerelemente, die mehr Informationen zu ihrem ursprünglichen Inhalt oder Stil benötigen, als in anderen Daten angegeben ist. Beispielsweise kann eine Anwendung Erstellungsdaten verwenden, um die anfängliche Einstellung und den Bereich für ein Bildlaufleistensteuerelement festzulegen.
Dialogfeldfenstermenü
Das System gibt einem Dialogfeld ein Fenstermenü, wenn die Vorlage den WS_SYSMENU Stil angibt. Um unangemessene Eingaben zu verhindern, deaktiviert das System automatisch alle Elemente im Menü außer Verschieben und Schließen. Der Benutzer kann auf Verschieben klicken, um das Dialogfeld zu verschieben. Wenn der Benutzer auf Schließen klickt, sendet das System eine WM_COMMAND Meldung an die Dialogfeldprozedur, wobei der wParam-Parameter auf IDCANCEL festgelegt ist. Dies ist identisch mit der Nachricht, die von der Schaltfläche Abbrechen gesendet wird, wenn der Benutzer darauf klickt. Die empfohlene Aktion für diese Meldung besteht darin, das Dialogfeld zu schließen und die angeforderte Aufgabe abzubrechen.
Obwohl andere Menüs in Dialogfeldern nicht empfohlen werden, kann eine Dialogfeldvorlage ein Menü angeben, indem der Bezeichner oder der Name einer Menüressource angegeben wird. In diesem Fall lädt das System die Ressource und erstellt das Menü für das Dialogfeld. Anwendungen verwenden in der Regel Menübezeichner oder Namen in Vorlagen, wenn sie die Vorlagen verwenden, um benutzerdefinierte Fenster anstelle von Dialogfeldern zu erstellen.
Dialogfeldschriftarten
Das System verwendet die durchschnittliche Zeichenbreite der Dialogfeldschriftart, um die Position und die Abmessungen des Dialogfelds zu berechnen. Standardmäßig zeichnet das System den gesamten Text in einem Dialogfeld mit der SYSTEM_FONT Schriftart.
Um eine Schriftart für ein anderes Dialogfeld als die Standardeinstellung anzugeben, müssen Sie das Dialogfeld mithilfe einer Dialogfeldvorlage erstellen. Verwenden Sie in einer Vorlagenressource die FONT-Anweisung. Legen Sie in einer Dialogfeldvorlage die DS_SETFONT oder DS_SHELLFONT Formatvorlage fest, und geben Sie eine Punktgröße und einen Schriftartnamen an. Auch wenn eine Dialogfeldvorlage eine Schriftart auf diese Weise angibt, verwendet das System immer die Systemschriftart für den Dialogfeldtitel und die Dialogfeldmenüs.
Wenn das Dialogfeld den DS_SETFONT- oder DS_SHELLFONT-Stil aufweist, sendet das System beim Erstellen des Steuerelements eine WM_SETFONT Meldung an die Dialogfeldprozedur und jedes Steuerelement. Die Dialogfeldprozedur ist für das Speichern des Schriftarthandles, das mit der WM_SETFONT-Meldung übergeben wird, und für das Auswählen des Handles im Kontext des Anzeigegeräts zuständig, wenn Text in das Fenster geschrieben wird. Vordefinierte Steuerelemente tun dies standardmäßig.
Die Systemschriftart kann zwischen verschiedenen Versionen von Windows variieren. Damit Ihre Anwendung die Systemschriftart unabhängig davon verwendet, auf welchem System sie ausgeführt wird, verwenden Sie DS_SHELLFONT mit der Schriftart MS Shell Dlg, und verwenden Sie die DIALOGEX-Ressource anstelle der DIALOG-Ressource. Das System ordnet diese Schriftart so zu, dass ihr Dialogfeld die Tahoma-Schriftart verwendet. Beachten Sie, dass DS_SHELLFONT keine Auswirkung hat, wenn die Schriftart nicht MS Shell Dlg ist.
Vorlagen im Arbeitsspeicher
Eine Dialogfeldvorlage im Arbeitsspeicher besteht aus einem Header, der das Dialogfeld beschreibt, gefolgt von einem oder mehreren zusätzlichen Datenblöcken, die die einzelnen Steuerelemente im Dialogfeld beschreiben. Die Vorlage kann entweder das Standardformat oder das erweiterte Format verwenden. In einer Standardvorlage ist der Header eine DLGTEMPLATE-Struktur , gefolgt von zusätzlichen Arrays mit variabler Länge. Die Daten für jedes Steuerelement bestehen aus einer DLGITEMTEMPLATE-Struktur , gefolgt von zusätzlichen Arrays variabler Länge. In einer erweiterten Dialogfeldvorlage verwendet der Header das DLGTEMPLATEEX-Format , und die Steuerelementdefinitionen verwenden das DLGITEMTEMPLATEEX-Format .
Um zwischen einer Standardvorlage und einer erweiterten Vorlage zu unterscheiden, überprüfen Sie die ersten 16 Bits einer Dialogfeldvorlage. In einer erweiterten Vorlage ist das erste WORD 0xFFFF. jeder andere Wert gibt eine Standardvorlage an.
Wenn Sie eine Dialogvorlage im Arbeitsspeicher erstellen, müssen Sie sicherstellen, dass die einzelnen DLGITEMTEMPLATE- oder DLGITEMTEMPLATEEX-Steuerelementdefinitionen an DWORD-Grenzen ausgerichtet sind. Darüber hinaus müssen alle Erstellungsdaten, die einer Steuerelementdefinition folgen, an einer DWORD-Grenze ausgerichtet werden. Alle anderen Arrays mit variabler Länge in einer Dialogfeldvorlage müssen an WORD-Grenzen ausgerichtet werden.
Vorlagenheader
Sowohl in den Standardvorlagen als auch in den erweiterten Vorlagen für Dialogfelder enthält der Header die folgenden allgemeinen Informationen:
- Position und Dimensionen des Dialogfelds
- Fenster- und Dialogfeldformatvorlagen für das Dialogfeld
- Die Anzahl der Steuerelemente im Dialogfeld. Dieser Wert bestimmt die Anzahl der DLGITEMTEMPLATE- oder DLGITEMTEMPLATEEX-Steuerelementdefinitionen in der Vorlage.
- Eine optionale Menüressource für das Dialogfeld. Die Vorlage kann angeben, dass das Dialogfeld kein Menü enthält, oder sie kann einen Ordnungswert oder eine unicode-Zeichenfolge mit NULL-Termin angeben, die eine Menüressource in einer ausführbaren Datei identifiziert.
- Die Fensterklasse des Dialogfelds. Dies kann entweder die vordefinierte Dialogfeldklasse oder ein Ordnungswert oder eine unicode-Zeichenfolge mit NULL-Beendigung sein, die eine registrierte Fensterklasse identifiziert.
- Eine mit NULL endende Unicode-Zeichenfolge, die den Titel für das Dialogfeldfenster angibt. Wenn die Zeichenfolge leer ist, ist die Titelleiste des Dialogfelds leer. Wenn das Dialogfeld nicht über die WS_CAPTION-Formatvorlage verfügt, legt das System den Titel auf die angegebene Zeichenfolge fest, zeigt ihn jedoch nicht an.
- Wenn das Dialogfeld über die DS_SETFONT Formatvorlage verfügt, gibt die Kopfzeile die Punktgröße und den Schriftartnamen der Schriftart an, die für den Text im Clientbereich und die Steuerelemente des Dialogfelds verwendet werden soll.
In einer erweiterten Vorlage gibt der DLGTEMPLATEEX-Header auch die folgenden zusätzlichen Informationen an:
- Der Hilfekontextbezeichner des Dialogfeldfensters, wenn das System eine WM_HELP Nachricht sendet.
- Wenn das Dialogfeld über die DS_SETFONT oder DS_SHELLFONT Formatvorlage verfügt, gibt die Kopfzeile die Schriftstärke an und gibt an, ob die Schriftart kursiv ist.
Steuerelementdefinitionen
Nach dem Vorlagenheader finden Sie eine oder mehrere Steuerelementdefinitionen, die die Steuerelemente des Dialogfelds beschreiben. Sowohl in der Standard- als auch in der erweiterten Vorlage verfügt der Dialogfeldheader über einen Member, der die Anzahl der Steuerelementdefinitionen in der Vorlage angibt. In einer Standardvorlage besteht jede Steuerelementdefinition aus einer DLGITEMTEMPLATE-Struktur , gefolgt von zusätzlichen Arrays mit variabler Länge. In einer erweiterten Vorlage verwenden die Steuerelementdefinitionen das DLGITEMTEMPLATEEX-Format .
Sowohl in der Standard- als auch in der erweiterten Vorlage enthält die Steuerelementdefinition die folgenden Informationen:
- Die Position und die Dimensionen des Steuerelements.
- Die Fenster- und Steuerelementstile für das Steuerelement.
- Der Steuerelementbezeichner.
- Die Fensterklasse des Steuerelements. Dies kann entweder der Ordnungswert einer vordefinierten Systemklasse oder eine unicode-Zeichenfolge mit NULL-Beendigung sein, die den Namen einer registrierten Fensterklasse angibt.
- Eine Unicode-Zeichenfolge mit Null-Termin, die den Anfangstext des Steuerelements angibt, oder einen Ordnungswert, der eine Ressource identifiziert, z. B. ein Symbol, in einer ausführbaren Datei.
- Ein optionaler Block von Erstellungsdaten mit variabler Länge. Wenn das System das Steuerelement erstellt, übergibt es einen Zeiger auf diese Daten im lParam-Parameter der WM_CREATE Nachricht, die an das Steuerelement gesendet wird.
In einer erweiterten Vorlage gibt die Steuerelementdefinition auch einen Hilfekontextbezeichner für das Steuerelement an, wenn das System eine WM_HELP Nachricht sendet.