Share via


Dialogfelder "Öffnen" und "Speichern unter"

Hinweis

Die GetOpenFileName-Funktion wird im Beispiel Datei wird verwendet veranschaulicht.

[Ab Windows Vista wurden die allgemeinen Dialogfelder Öffnen und Speichern unter durch das Dialogfeld "Gemeinsame Elemente" ersetzt. Es wird empfohlen, anstelle dieser Dialogfelder aus der Common Dialog Box Library die API für allgemeine Elemente zu verwenden.]

Im Dialogfeld Öffnen kann der Benutzer das Laufwerk, das Verzeichnis und den Namen einer datei oder einer Gruppe von Dateien angeben, die geöffnet werden sollen. Sie erstellen und zeigen ein Dialogfeld Öffnen an, indem Sie eine OPENFILENAME-Struktur initialisieren und die Struktur an die GetOpenFileName-Funktion übergeben.

Im Dialogfeld Speichern unter kann der Benutzer das Laufwerk, das Verzeichnis und den Namen einer zu speichernden Datei angeben. Sie erstellen und zeigen ein Dialogfeld Speichern unter an, indem Sie eine OPENFILENAME-Struktur initialisieren und die Struktur an die GetSaveFileName-Funktion übergeben.

Explorer Dialogfelder Öffnen und Speichern unter bieten Benutzeroberflächenfeatures, die dem Windows-Explorer ähneln. Das System unterstützt jedoch weiterhin die Dialogfelder "Öffnen " und "Speichern unter " im alten Stil für Anwendungen, die mit der Benutzeroberfläche im alten Stil konsistent sein müssen.

Zusätzlich zum unterschiedlichen Aussehen unterscheiden sich die Dialogfelder im Explorer-Stil und im alten Stil in ihrer Verwendung von benutzerdefinierten Vorlagen und Hookprozeduren zum Anpassen der Dialogfelder. Die Dialogfelder im Explorer und im alten Stil weisen jedoch das gleiche Verhalten für die meisten grundlegenden Vorgänge auf, z. B. das Angeben eines Dateinamenfilters, das Überprüfen der Eingabe des Benutzers und das Abrufen des vom Benutzer angegebenen Dateinamens. Weitere Informationen zu den Dialogfeldern im Explorer und im alten Stil finden Sie unter Anpassung von Dialogfeldern öffnen und speichern.

Die folgende Abbildung zeigt ein typisches Dialogfeld "Öffnen" im Explorer-Format.

Datei öffnen (Dialogfeld)

Die folgende Abbildung zeigt ein typisches Dialogfeld im Explorer-Format Speichern unter.

Dialogfeld

Wenn der Benutzer einen Dateinamen angibt und auf die Schaltfläche OK klickt, gibt GetOpenFileName oder GetSaveFileNameTRUE zurück. Der Puffer, auf den der lpstrFile-Member der OPENFILENAME-Struktur verweist, enthält den vollständigen Pfad und dateinamen, der vom Benutzer angegeben wird.

Wenn der Benutzer das Dialogfeld Öffnen oder Speichern unter abbricht oder ein Fehler auftritt, gibt die Funktion FALSE zurück. Um die Fehlerursache zu ermitteln, rufen Sie die CommDlgExtendedError-Funktion auf, um den erweiterten Fehlerwert abzurufen. Wenn der lpstrFile-Puffer zu klein ist, um den vollständigen Namen zu erhalten, gibt CommDlgExtendedErrorFNERR_BUFFERTOOSMALL zurück, und die ersten 2 Bytes des Puffers, auf den das lpstrFile-Element verweist, werden auf einen ganzzahligen Wert festgelegt, der die Größe angibt, die zum Empfangen des vollständigen Namens erforderlich ist.

Die folgenden Themen werden in diesem Abschnitt behandelt.

Dateinamen und Verzeichnisse

Die Informationen in diesem Abschnitt gelten sowohl für Explorer die Dialogfelder "Öffnen" als auch "Speichern unter" im alten Stil.

Vor dem Aufrufen der Funktionen GetOpenFileName oder GetSaveFileName muss das lpstrFile-Element der OPENFILENAME-Struktur auf den Puffer verweisen, um den Dateinamen zu empfangen. Das nMaxFile-Element muss die Größe des lpstrFile-Puffers in Zeichen angeben. Für eine ANSI-Funktion ist dies die Anzahl der Bytes, aber für eine Unicode-Funktion ist dies die Anzahl der Zeichen.

Wenn der Benutzer einen Dateinamen angibt und auf die Schaltfläche OK klickt, kopiert das Dialogfeld das ausgewählte Laufwerk, das verzeichnis und den Dateinamen in den puffer lpstrFile . Die Funktion legt auch die Member nFileOffset und nFileExtension auf die Offsets in Zeichen vom Anfang des Puffers auf den Dateinamen bzw. die Dateinamenerweiterung fest.

Um nur den Dateinamen und die Erweiterung abzurufen, legen Sie den LpstrFileTitle-Member so fest, dass er auf einen Puffer zeigt, und legen Sie das Element nMaxFileTitle auf die Größe des Puffers in Zeichen fest. Alternativ können Sie den puffer lpstrFile in einem Aufruf der GetFileTitle-Funktion übergeben, um den Anzeigenamen der ausgewählten Datei abzurufen. Beachten Sie jedoch, dass der von GetFileTitle zurückgegebene Dateiname nur eine Erweiterung enthält, wenn dies die Bevorzugte des Benutzers für die Anzeige von Dateinamen ist.

Im Dialogfeld wird das aktuelle Verzeichnis für den aufrufenden Prozess als erstes Verzeichnis verwendet, aus dem Dateien und Verzeichnisse angezeigt werden. Verwenden Sie die Funktionen GetCurrentDirectory und SetCurrentDirectory , um das aktuelle Verzeichnis eines Prozesses abzurufen und zu ändern. Wenn Sie ein anderes Anfangsverzeichnis angeben möchten, ohne Ihr aktuelles Verzeichnis zu ändern, verwenden Sie das lpstrInitialDir-Element , um den Namen eines Verzeichnisses anzugeben. Das Dialogfeld ändert automatisch Ihr aktuelles Verzeichnis, wenn der Benutzer ein anderes Laufwerk oder Verzeichnis auswählt. Um zu verhindern, dass das Dialogfeld Ihr aktuelles Verzeichnis ändert, legen Sie das flag OFN_NOCHANGEDIR fest. Dieses Flag hindert den Benutzer nicht daran, verzeichnisse zu ändern, um eine Datei zu finden.

Verwenden Sie den lpstrDefExt-Member , um eine Standarddateierweiterung anzugeben. Wenn der Benutzer einen Dateinamen ohne Erweiterung angibt, fügt das Dialogfeld die Standarderweiterung hinzu. Wenn Sie eine Standarderweiterung angeben und der Benutzer einen Dateinamen mit einer anderen Erweiterung angibt, wird im Dialogfeld das flag OFN_EXTENSIONDIFFERENT festgelegt.

Damit der Benutzer mehrere Dateien aus einem Verzeichnis auswählen kann, legen Sie das flag OFN_ALLOWMULTISELECT fest. Aus Gründen der Kompatibilität mit älteren Anwendungen verwendet das Standardmäßige Dialogfeld für die Mehrfachauswahl die Benutzeroberfläche im alten Stil. Um ein mehrfaches Auswahldialogfeld im Explorer-Format anzuzeigen, müssen Sie auch das Flag OFN_EXPLORER festlegen.

Wenn der Benutzer mehrere Dateien auswählt, gibt der Puffer, auf den der lpstrFile-Member verweist, den Pfad zum aktuellen Verzeichnis gefolgt von den Dateinamen der ausgewählten Dateien zurück. Das nFileOffset-Element ist der Offset zum ersten Dateinamen, und das nFileExtension-Element wird nicht verwendet. In der folgenden Tabelle wird der Unterschied zwischen dialogfeldern im Explorer und alten Format beim Zurückgeben mehrerer Dateinamen beschrieben.

Dialogfeldformatvorlage BESCHREIBUNG
Dialogfelder im Explorer-Format Die Verzeichnis- und Dateinamenzeichenfolgen sind durch NULL getrennt, und nach dem letzten Dateinamen wird ein zusätzliches NULL-Zeichen angegeben. Dieses Format ermöglicht es den Dialogfeldern im Explorer-Format, lange Dateinamen zurückzugeben, die Leerzeichen enthalten.
Dialogfelder im alten Stil Die Verzeichnis- und Dateinamenzeichenfolgen sind durch Leerzeichen getrennt. Für Dateinamen mit Leerzeichen verwendet die Funktion kurze Dateinamen.

 

Sie können die FindFirstFile-Funktion verwenden, um zwischen langen und kurzen Dateinamen zu konvertieren.

Wenn Sie OFN_ALLOWMULTISELECT angeben und der Benutzer nur eine Datei auswählt, hat die lpstrFile-Zeichenfolge kein Trennzeichen zwischen pfad und Dateiname.

Filter

Die Informationen in diesem Abschnitt gelten sowohl für Explorer- als auch für die Dialogfelder "Öffnen" und "Speichern unter".

Sie können Dateinamenfilter bereitstellen, um den Benutzer bei der Einschränkung der im Dialogfeld angezeigten Dateinamen zu unterstützen. Ein Dateinamefilter besteht aus einem Paar von NULL-beendeten Zeichenfolgen, einer Beschreibung und einem Muster, die mit der anderen verkettet sind. Im Dialogfeld wird die Beschreibung angezeigt, damit der Benutzer den zu verwendenden Filter auswählen kann. und verwendet das Muster, um die anzuzeigenden Dateien auszuwählen.

Um die Filter anzugeben, legen Sie den lpstrFilter-Member der OPENFILENAME-Struktur so fest, dass er auf einen Puffer verweist, der ein Array von Filterzeichenfolgenpaaren enthält. Auf die letzte Zeichenfolge im Array muss ein zusätzliches NULL-Zeichen folgen.

Eine Musterzeichenfolge kann eine Kombination aus gültigen Dateinamenzeichen und dem Sternchen (*) sein. Das Sternchen ist ein Platzhalter, der eine beliebige Kombination gültiger Dateinamenzeichen darstellt. Im Dialogfeld werden nur die Dateien angezeigt, die dem Muster entsprechen. Um mehrere Muster für dieselbe Beschreibung anzugeben, müssen Sie ein Semikolon (;) , um die Muster zu trennen. Beachten Sie, dass Leerzeichen in der Musterzeichenfolge zu unerwarteten Ergebnissen führen können.

Das folgende Codefragment gibt zwei Filter an. Der Filter mit der Beschreibung "Quelle" weist zwei Muster auf. Wenn der Benutzer diesen Filter auswählt, werden im Dialogfeld nur Dateien angezeigt, die den aufweisen. C und . CXX-Erweiterungen. Beachten Sie, dass in der Programmiersprache C eine in doppelte Anführungszeichen eingeschlossene Zeichenfolge null-beendet ist.

OPENFILENAME ofn;       // common dialog box structure

ofn.lpstrFilter = "Source\0*.C;*.CXX\0All\0*.*\0"
ofn.nFilterIndex = 1;

Das nFilterIndex-Element der OPENFILENAME-Struktur gibt einen Index an, der angibt, welchen Filter das Dialogfeld anfänglich verwendet. Der erste Filter im Puffer hat Index 1, der zweite 2 usw. Wenn der Benutzer den Filter ändert, während er das Dialogfeld verwendet, wird der nFilterIndex-Member bei der Rückgabe auf den Index des ausgewählten Filters festgelegt.

Sie können einen benutzerdefinierten Filter erstellen, indem Sie den lpstrCustomFilter-Member auf die Adresse eines Puffers festlegen, der einen einzelnen Filter enthält, und indem Sie das Element nMaxCustFilter auf die Größe des Puffers in Zeichen oder Bytes festlegen. Das Dialogfeld platziert den benutzerdefinierten Filter immer am Anfang der Filterliste und aktualisiert bei der Rückgabe immer den Musterteil des Filters mit dem Muster aus dem vom Benutzer ausgewählten Filter.

Bei dialogfeldern im Explorer kann sich die Standarderweiterung ändern, wenn der Benutzer einen anderen Filter auswählt. Wenn der Benutzer einen Filter auswählt, dessen erstes Muster das Format * aufweist. xxx (d. h. die Erweiterung enthält kein Wildcardzeichen), das Dialogfeld verwendet xxx als Standarderweiterung. Dies tritt nur auf, wenn Sie eine Standarderweiterung im lpstrDefExt-Element der OPENFILENAME-Struktur angegeben haben. Wenn der Benutzer beispielsweise "Quelle\0* auswählt. C;*. CXX\0"-Filter, die Standarderweiterung wird in "C" geändert. Wenn Sie den Filter jedoch als "Quelle\0* definiert hätten. C*\0", würde sich die Standarderweiterung nicht ändern, da die Erweiterung einen Wildcard enthält.

Die CDN_INCLUDEITEM Benachrichtigung bietet eine weitere Möglichkeit, die im Dialogfeld angezeigten Namen zu filtern. Um diese Meldung zu verwenden, geben Sie eine OFNHookProc-Hookprozedur an, und geben Sie das flag OFN_ENABLEINCLUDENOTIFY in der OPENFILENAME-Struktur an, wenn Sie das Dialogfeld erstellen. Jedes Mal, wenn der Benutzer einen Ordner öffnet, sendet das Dialogfeld eine CDN_INCLUDEITEM Benachrichtigung an Ihre Hookprozedur für jedes Element im neu geöffneten Ordner. Der Rückgabewert der Hookprozedur gibt an, ob das Dialogfeld das Element in der Elementliste des Ordners anzeigen soll.

Datei- und Verzeichnisüberprüfung

Außer wie erwähnt, gelten die Informationen in diesem Abschnitt sowohl für die Dialogfelder Explorer als auch für die Dialogfelder "Öffnen" und "Speichern unter".

Im Dialogfeld werden vom Benutzer eingegebene Dateinamen automatisch überprüft, um sicherzustellen, dass die Namen nur gültige Zeichen enthalten. Um die Überprüfung der Dateinamenzeichen außer Kraft zu setzen, legen Sie das flag OFN_NOVALIDATE fest.

Um zu erzwingen, dass das Dialogfeld überprüft, ob der Benutzer den Namen einer vorhandenen Datei angegeben hat, legen Sie das flag OFN_FILEMUSTEXIST fest. Um die Überprüfung zu erzwingen, dass der angegebene Pfad vorhanden ist, legen Sie das flag OFN_PATHMUSTEXIST fest. Wenn Sie das flag OFN_CREATEPROMPT festlegen, fordert das Dialogfeld den Benutzer zur Berechtigung auf, eine nicht vorhandene Datei zu erstellen. Wenn dieses Flag festgelegt ist und der Benutzer eine neue Datei erstellen möchte, wird das Dialogfeld geschlossen, und die Funktion gibt den angegebenen Namen zurück. Andernfalls bleibt das Dialogfeld geöffnet.

Wenn Sie das Dialogfeld Speichern unter verwenden, können Sie das Dialogfeld anweisen, den Benutzer zur Berechtigung zum Überschreiben einer vorhandenen Datei aufzufordern, indem Sie das flag OFN_OVERWRITEPROMPT festlegen.

Standardmäßig erstellt das Dialogfeld eine Testdatei der Länge Null, um zu bestimmen, ob eine neue Datei im ausgewählten Verzeichnis erstellt werden kann. Um die Erstellung dieser Testdatei zu verhindern, legen Sie das flag OFN_NOTESTFILECREATE fest.

Wenn Sie eine Hookprozedur aktivieren, benachrichtigt das Dialogfeld Ihre Hookprozedur, wenn ein Verstoß gegen die Netzwerkfreigabe für den vom Benutzer angegebenen Dateinamen auftritt. Wenn Sie das OFN_EXPLORER-Flag festlegen, sendet das Dialogfeld die CDN_SHAREVIOLATION Nachricht an die Hookprozedur. Wenn Sie OFN_EXPLORER nicht festlegen, sendet das Dialogfeld die REGISTRIERTE SHAREVISTRING-Nachricht an die Hookprozedur. Um zu verhindern, dass das Dialogfeld Benachrichtigungen zu Freigabeverstößen sendet, legen Sie das flag OFN_SHAREAWARE fest.

Wenn der Benutzer das schreibgeschützte Kontrollkästchen aktiviert, wird im Dialogfeld bei der Rückgabe das flag OFN_READONLY festgelegt. Um das Kontrollkästchen Als schreibgeschützten Öffnen auszublenden, legen Sie das flag OFN_HIDEREADONLY fest. Um zu verhindern, dass das Dialogfeld Namen vorhandener Dateien zurückgibt, die über das schreibgeschützte Attribut verfügen, legen Sie das flag OFN_NOREADONLYRETURN fest.

Um zu verhindern, dass das Dialogfeld Verknüpfungsdateien dereferenziert, legen Sie den wert OFN_NODEREFERENCELINKS fest. In diesem Fall gibt das Dialogfeld den Namen der Linkdatei und nicht den Namen der Datei zurück, auf die von der Linkdatei verwiesen wird.

Anpassung des Dialogfelds "Öffnen" und "Speichern unter"

Sie können ein Dialogfeld Öffnen oder Speichern unter anpassen, indem Sie eine Hookprozedur, eine benutzerdefinierte Vorlage oder beides bereitstellen. Die Explorer- und alten Versionen der Dialogfelder unterscheiden sich jedoch in ihrer Verwendung von benutzerdefinierten Vorlagen und Hookprozeduren.

Informationen zum Anpassen eines Dialogfelds im Explorer-Format finden Sie unter Hookprozeduren im Explorer-Stil, benutzerdefinierte Vorlagen im Explorer-Stil und Explorer-Steuerelementbezeichner. Informationen zum Anpassen eines Dialogfelds im alten Stil finden Sie unter Anpassen Old-Style Dialogfelder.

In der folgenden Tabelle sind die Unterschiede zwischen den beiden Stilen zusammengefasst.

Anpassung BESCHREIBUNG
Hook-Prozedur im Explorer-Stil Die Hookprozedur empfängt Benachrichtigungen, die vom allgemeinen Dialogfeld gesendet werden, und Meldungen für alle zusätzlichen Steuerelemente, die Sie durch Angeben einer untergeordneten Dialogvorlage definiert haben. Die Hookprozedur empfängt keine Nachrichten für die Standardsteuerelemente des Standarddialogfelds.
benutzerdefinierte Vorlage im Explorer-Format Das System verwendet die benutzerdefinierte Vorlage, um ein untergeordnetes Dialogfeld zu erstellen. Die Vorlage kann zusätzliche Steuerelemente definieren und den Speicherort des Clusters der Standardsteuerelemente angeben. Die benutzerdefinierte Vorlage ersetzt nicht die Standardvorlage.
Hook-Prozedur im alten Stil Die Hookprozedur empfängt alle an das Dialogfeld gesendeten Nachrichten, einschließlich Meldungen für die Standardsteuerelemente und alle benutzerdefinierten Steuerelemente. Die Hookprozedur empfängt auch registrierte Nachrichten, die vom allgemeinen Dialogfeld gesendet werden.
Benutzerdefinierte Vorlage im alten Stil Die benutzerdefinierte Vorlage ersetzt die Standardvorlage. Erstellen Sie die benutzerdefinierte Vorlage, indem Sie die in der Datei Fileopen.dlg angegebene Standardvorlage ändern.

 

Der Standardtitel für Dialogfelder im Explorer und im alten Stil lautet entweder "Öffnen" oder "Speichern unter". Um den Titel zu ändern, geben Sie den neuen Titel im lpstrTitle-Element der OPENFILENAME-Struktur an.

Die HKEY_CURRENT_USER Registrierungsstruktur eines Benutzers kann Werte enthalten, die den Inhalt der Dialogfelder "Öffnen" und "Speichern unter" im Explorer-Format anpassen. Diese Registrierungseinträge wirken sich nur auf die Dialogfelder aus, die für den Benutzer angezeigt werden, der der Registrierungsstruktur zugeordnet ist.

Zum Ausblenden von Features Explorer Dialogfeldern "Öffnen" und "Speichern unter" kann ein Administrator die Werte in der folgenden Tabelle unter diesem Unterschlüssel festlegen:

HKEY_CURRENT_USER
   Software
      Microsoft
         Windows
            CurrentVersion
               Policies
                  Comdlg32
Wertname Wert Bedeutung
NoPlacesBar 1 Blendet die Platzleiste aus.
NoFileMRU 1 Blendet die Liste zuletzt verwendet (MRU) aus.
NoBackButton 1 Blendet die Schaltfläche Zurück aus.

 

Der Inhalt der Leiste "Orte " wird durch den Inhalt des folgenden Unterschlüssels bestimmt:

HKEY_CURRENT_USER
   Software
      Microsoft
         Windows
            CurrentVersion
               Policies
                  Comdlg32
                     Placesbar

Derzeit können unter diesem Schlüssel nur fünf Einträge enthalten sein, und der Wert/Name-Index ist nullbasiert. Die Namen für die Einträge sollten Place0, Place1, Place2, Place3 und Place4 sein. Die Werte der Einträge können REG_DWORD, REG_SZ oder REG_EXPAND_SZ Werte sein, die Orte identifizieren, die in die Platzleiste aufgenommen werden sollen.

Werttyp Bedeutung
REG_DWORD Ein CSIDL-Wert, der einen Ordner identifiziert. Eine Liste der CSIDL-Werte finden Sie unter CSIDL-Werte.
REG_SZ oder REG_EXPAND_SZ Eine null-endende Zeichenfolge, die einen gültigen Pfad angibt.

 

Explorer-Style Hook-Prozeduren

Sie können ein Explorer Dialogfeld "Öffnen" oder "Speichern unter" anpassen, indem Sie eine Hookprozedur, eine benutzerdefinierte Vorlage oder beides bereitstellen. Wenn Sie eine Hookprozedur für ein Dialogfeld im Explorer-Format bereitstellen, erstellt das System ein Dialogfeld, das ein untergeordnetes Element des Standarddialogfelds ist. Die Hookprozedur fungiert als Dialogprozedur für das untergeordnete Dialogfeld. Dieses untergeordnete Dialogfeld basiert auf der benutzerdefinierten Vorlage oder auf einer Standardvorlage, falls keine bereitgestellt wird. Weitere Informationen finden Sie unter benutzerdefinierte Vorlagen im Explorer-Format.

Verwenden Sie beim Erstellen des Dialogfelds die OPENFILENAME-Struktur, um eine Hookprozedur für ein Dialogfeld im Explorer Format öffnen oder speichern unter zu aktivieren. Legen Sie die flags OFN_ENABLEHOOK und OFN_EXPLORER im Flags-Element fest, und geben Sie die Adresse einer OFNHookProc-Hookprozedur im lpfnHook-Member an. Wenn Sie eine Hookprozedur bereitstellen und das flag OFN_EXPLORER weglassen, müssen Sie eine OFNHookProcOldStyle-Hookprozedur verwenden, und Sie erhalten die Benutzeroberfläche im alten Stil. Weitere Informationen finden Sie unter Anpassen Old-Style Dialogfelder.

Eine hook-Prozedur im Explorer-Stil empfängt eine Vielzahl von Meldungen, während das Dialogfeld geöffnet ist. Hierzu gehört Folgendes:

  • Die WM_INITDIALOG Nachricht und andere Standarddialogfeldmeldungen, z. B. die WM_CTLCOLORDLG Farbmeldung des Steuerelements.
  • Ein Satz von WM_NOTIFY Benachrichtigungen, die vom Benutzer ausgeführte Aktionen oder andere Dialogfeldereignisse angeben.
  • Meldungen für alle zusätzlichen Steuerelemente, die Sie durch Angeben einer untergeordneten Dialogvorlage definiert haben.

Darüber hinaus gibt es eine Reihe von Meldungen, die Sie an ein dialogfeld im Explorer-Format senden können, um Informationen abzurufen oder das Verhalten und die Darstellung des Dialogfelds zu steuern.

Wenn Sie eine Hookprozedur für ein Dialogfeld im Explorer-Format bereitstellen, erstellt die Standarddialogfeldprozedur ein untergeordnetes Dialogfeld, wenn die Standarddialogprozedur ihre WM_INITDIALOG Meldung verarbeitet. Die Hookprozedur fungiert als Dialogprozedur für das untergeordnete Dialogfeld. Zu diesem Zeitpunkt empfängt die Hookprozedur eine eigene WM_INITDIALOG Nachricht, wobei der lParam-Parameter auf die Adresse der OPENFILENAME-Struktur festgelegt ist, die zum Initialisieren des Dialogfelds verwendet wird. Nachdem das untergeordnete Dialogfeld die Verarbeitung seiner eigenen WM_INITDIALOG Nachricht abgeschlossen hat, verschiebt die Standarddialogprozedur bei Bedarf die Standardsteuerelemente, um Platz für zusätzliche Steuerelemente des untergeordneten Dialogfelds zu schaffen. Die Standarddialogprozedur sendet dann die CDN_INITDONE Benachrichtigung an die Hookprozedur.

Die Hookprozedur empfängt WM_NOTIFY Benachrichtigungen, die vom Benutzer im Dialogfeld ausgeführte Aktionen angeben. Sie können einige dieser Meldungen verwenden, um das Verhalten des Dialogfelds zu steuern. Beispielsweise empfängt die Hookprozedur die CDN_FILEOK Meldung, wenn der Benutzer einen Dateinamen auswähelt und auf die Schaltfläche OK klickt. Als Reaktion auf diese Meldung kann die Hookprozedur die SetWindowLong-Funktion verwenden, um den ausgewählten Namen abzulehnen und zu erzwingen, dass das Dialogfeld geöffnet bleibt.

Der lParam-Parameter für jede WM_NOTIFY Nachricht ist ein Zeiger auf eine OFNOTIFY - oder OFNOTIFYEX-Struktur , die die Aktion definiert. Der Codemember im Header dieser Struktur enthält eine der folgenden Benachrichtigungen.

Nachricht Bedeutung
CDN_FILEOK Der Benutzer hat auf die Schaltfläche OK geklickt. das Dialogfeld wird gerade geschlossen.
CDN_FOLDERCHANGE Der Benutzer hat einen neuen Ordner oder ein neues Verzeichnis geöffnet.
CDN_HELP Der Benutzer hat auf die Schaltfläche Hilfe geklickt.
CDN_INCLUDEITEM Bestimmt, ob ein Element angezeigt werden soll. Wenn der Benutzer einen neuen Ordner oder ein neues Verzeichnis öffnet, sendet das System diese Benachrichtigung für jedes Element im Ordner oder Verzeichnis. Das System sendet diese Benachrichtigung nur, wenn das flag OFN_ENABLEINCLUDENOTIFY festgelegt wurde.
CDN_INITDONE Das System hat die Initialisierung des Dialogfelds abgeschlossen, und das Dialogfeld hat die Verarbeitung der meldung WM_INITDIALOG abgeschlossen. Außerdem hat das System das Anordnen von Steuerelementen im allgemeinen Dialogfeld abgeschlossen, um Platz für die Steuerelemente des untergeordneten Dialogfelds (falls vorhanden) zu schaffen.
CDN_SELCHANGE Der Benutzer hat eine neue Datei oder einen neuen Ordner aus der Dateiliste ausgewählt.
CDN_SHAREVIOLATION Im allgemeinen Dialogfeld wurde ein Freigabeverstoß für die Datei festgestellt, die zurückgegeben werden soll.
CDN_TYPECHANGE Der Benutzer hat einen neuen Dateityp aus der Liste der Dateitypen ausgewählt.

 

Diese WM_NOTIFY Nachrichten ersetzen die registrierten Nachrichten FILEOKSTRING, LBSELCHSTRING, SHAREVISTRING und HELPMSGSTRING , die von früheren Versionen der Dialogfelder Öffnen und Speichern unter verwendet wurden. Die Hookprozedur empfängt jedoch auch die abgelöste Nachricht nach der WM_NOTIFY-Nachricht , wenn die WM_NOTIFY verarbeitung setWindowLong nicht verwendet, um einen wert ungleich null DWL_MSGRESULT festzulegen.

Um Informationen über die status des Dialogfelds abzurufen oder das Verhalten und die Darstellung des Dialogfelds zu steuern, kann die Hookprozedur die folgenden Meldungen an das Dialogfeld senden.

Nachricht Bedeutung
CDM_GETFILEPATH Ruft den Pfad und Dateinamen der ausgewählten Datei ab.
CDM_GETFOLDERIDLIST Ruft die Elementbezeichnerliste ab, die dem aktuellen Ordner entspricht, den das Dialogfeld geöffnet hat. Weitere Informationen zu Elementbezeichnerlisten finden Sie unter Einführung in den Shellnamespace.
CDM_GETFOLDERPATH Ruft den Pfad des aktuellen Ordners oder Verzeichnisses für das Dialogfeld ab.
CDM_GETSPEC Ruft den Dateinamen (ohne Pfad) der datei ab, die derzeit im Dialogfeld ausgewählt ist.
CDM_HIDECONTROL Blendet das angegebene Steuerelement aus.
CDM_SETCONTROLTEXT Legt den Text im angegebenen Steuerelement fest.
CDM_SETDEFEXT Legt die Standarddateierweiterung für das Dialogfeld fest.

 

Explorer-Style benutzerdefinierte Vorlagen

Verwenden Sie die OPENFILENAME-Struktur, um zusätzliche Steuerelemente für ein Dialogfeld im Explorer-Format Öffnen oder Speichern unter zu definieren, um eine Vorlage für ein untergeordnetes Dialogfeld anzugeben, das die zusätzlichen Steuerelemente enthält. Wenn Ihre untergeordnete Dialogvorlage eine Ressource in einer Anwendung oder einer Dynamic-Link-Bibliothek ist, legen Sie das flag OFN_ENABLETEMPLATE im Flags-Element fest, und verwenden Sie die Elemente hInstance und lpTemplateName der Struktur, um das Modul und den Ressourcennamen zu identifizieren. Wenn sich die Vorlage bereits im Arbeitsspeicher befindet, legen Sie das flag OFN_ENABLETEMPLATEHANDLE fest, und verwenden Sie den hInstance-Member , um das Speicherobjekt zu identifizieren, das die Vorlage enthält. Wenn Sie eine untergeordnete Dialogvorlage für ein Dialogfeld im Explorer-Format bereitstellen, müssen Sie auch das flag OFN_EXPLORER festlegen. Andernfalls geht das System davon aus, dass Sie eine Ersatzvorlage für ein Dialogfeld im alten Stil bereitstellen. Wenn Sie zusätzliche Steuerelemente bereitstellen, müssen Sie in der Regel auch eine hook-Prozedur im Explorer-Stil bereitstellen, um Nachrichten für die neuen Steuerelemente zu verarbeiten.

Sie können ihre untergeordnete Dialogfeldervorlage wie jede andere Vorlage erstellen, mit der Ausnahme, dass Sie die formatvorlagen WS_CHILD und WS_CLIPSIBLINGS angeben und die DS_3DLOOK und DS_CONTROL Formatvorlagen angeben müssen. Das System erfordert die WS_CHILD , da Ihre Vorlage ein untergeordnetes Dialogfeld des Standarddialogfelds Öffnen oder Speichern unter definiert. Die WS_CLIPSIBLINGS Stil stellt sicher, dass das untergeordnete Dialogfeld keine Steuerelemente im Standarddialogfeld übermalt. Die DS_3DLOOK Stil stellt sicher, dass die Darstellung der Steuerelemente im untergeordneten Dialogfeld mit den Steuerelementen im Standarddialogfeld konsistent ist. Die DS_CONTROL Stil stellt sicher, dass der Benutzer die TAB-TASTE und andere Navigationstasten verwenden kann, um zwischen allen Steuerelementen im benutzerdefinierten Dialogfeld zu wechseln, ob standard oder benutzerdefiniert.

Um Platz für die neuen Steuerelemente zu schaffen, erweitert das System das Standarddialogfeld um die Breite und Höhe des benutzerdefinierten Dialogfelds. Standardmäßig werden alle Steuerelemente aus dem benutzerdefinierten Dialogfeld unter den Steuerelementen im Standarddialogfeld positioniert. Sie können diese Standardpositionierung jedoch überschreiben, indem Sie ein statisches Textsteuerelement in Ihre benutzerdefinierte Dialogfeldvorlage einfügen und ihr den Steuerelementbezeichnerwert stc32 zuweisen. (Dieser Wert ist in der Dlgs.h-Headerdatei definiert.) In diesem Fall verwendet das System das -Steuerelement als Bezugspunkt, um zu bestimmen, wo die neuen Steuerelemente positioniert werden sollen. Alle neuen Steuerelemente oberhalb und links neben dem stc32-Steuerelement befinden sich im Standarddialogfeld auf dem gleichen Betrag oben und links neben den Steuerelementen. Neue Steuerelemente unterhalb und rechts neben dem stc32-Steuerelement befinden sich unterhalb und rechts neben den Standardsteuerelementen. Im Allgemeinen wird jedes neue Steuerelement so positioniert, dass es relativ zu den Standardsteuerelementen dieselbe Position wie das stc32-Steuerelement hat. Um Platz für diese neuen Steuerelemente zu schaffen, fügt das System nach Bedarf Platz links, rechts, unten und oben im Standarddialogfeld hinzu.

Das System erfordert, dass die Hookprozedur alle Nachrichten verarbeitet, die für das benutzerdefinierte Dialogfeld vorgesehen sind, und sendet daher die gleichen Fenstermeldungen an die Hookprozedur wie an jede andere Dialogfeldprozedur. Beispielsweise empfängt die Hookprozedur WM_COMMAND Nachrichten, wenn der Benutzer im benutzerdefinierten Dialogfeld auf Schaltflächensteuerelemente klickt. Die Hookprozedur ist für die Initialisierung dieser Steuerelemente und das Abrufen von Werten aus den Steuerelementen zuständig, wenn das Dialogfeld geschlossen wird. Wenn die Hookprozedur die WM_INITDIALOG Nachricht empfängt, hat das System die Steuerelemente noch nicht an ihre endgültigen Positionen verschoben.

Die Standarddialogfeldprozedur verarbeitet Meldungen für alle Steuerelemente im Standarddialogfeld, aber die Hookprozedur empfängt die Benachrichtigungen für Benutzeraktionen für diese Steuerelemente, wie unter Explorer-Style Hook Procedures beschrieben.

Explorer-Style-Steuerelementbezeichner

Das Windows Software Development Kit (SDK) stellt die Standarddialogfeldvorlage für die Dialogfelder im alten Stil bereit, enthält jedoch nicht die Standardvorlage für die Dialogfelder im Explorer-Format. Dies liegt daran, dass Sie in den Dialogfeldern im Explorer-Format eigene Steuerelemente hinzufügen können, aber das Ändern der Vorlage für die Standardsteuerelemente nicht unterstützen. In einigen Fällen müssen Sie jedoch möglicherweise die Steuerelementbezeichner kennen, die in den Standardvorlagen verwendet werden. Für die CDM_HIDECONTROL - und CDM_SETCONTROLTEXT-Nachrichten ist beispielsweise ein Steuerelementbezeichner erforderlich.

In der folgenden Tabelle werden die Bezeichner der Standardsteuerelemente in den Dialogfeldern öffnen und speichern unter Explorer angezeigt. Die Bezeichner sind Konstanten, die in Dlgs.h und Winuser.h definiert sind.

Steuerelementbezeichner Steuerelementbeschreibung
chx1 Das schreibgeschützte Kontrollkästchen
cmb1 Dropdown-Kombinationsfeld, das die Liste der Dateitypfilter anzeigt
stc2 Bezeichnung für das Kombinationsfeld cmb1
cmb2 Dropdown-Kombinationsfeld, das das aktuelle Laufwerk oder den aktuellen Ordner anzeigt und dem Benutzer die Auswahl eines Laufwerks oder Ordners zum Öffnen ermöglicht
stc4 Bezeichnung für das Kombinationsfeld cmb2
cmb13 Dropdown-Kombinationsfeld, in dem der Name der aktuellen Datei angezeigt wird, der Benutzer den Namen einer zu öffnenden Datei eingeben und eine Datei auswählen kann, die kürzlich geöffnet oder gespeichert wurde. Dies gilt für frühere Explorer kompatible Anwendungen ohne Hook- oder Dialogvorlage. Vergleichen Sie mit edt1.
edt1 Bearbeitungssteuerelement, das den Namen der aktuellen Datei anzeigt oder dem Benutzer ermöglicht, den Namen der zu öffnenden Datei einzugeben. Vergleichen Sie mit cmb13.
stc3 Bezeichnung für das Kombinationsfeld cmb13 und das Bearbeitungssteuerelement edt1
lst1 Listenfeld, in dem der Inhalt des aktuellen Laufwerks oder Ordners angezeigt wird
stc1 Bezeichnung für das Listenfeld lst1
IDOK Die Befehlsschaltfläche OK (Drucktaste)
IDCANCEL Die Befehlsschaltfläche "Abbrechen " (Drucktaste)
pshHelp Die Befehlsschaltfläche "Hilfe " (Drucktaste)

 

Anpassen von Old-Style Dialogfeldern

Sie können ein Dialogfeld "Öffnen " oder "Speichern unter " im alten Stil anpassen, indem Sie eine OFNHookProcOldStyle-Hookprozedur bereitstellen, die Nachrichten oder Benachrichtigungen empfängt, die für die Standarddialogfeldprozedur vorgesehen sind. Sie können auch eine benutzerdefinierte Vorlage bereitstellen, die anstelle der Standardvorlage verwendet werden soll. Die Hookprozeduren und Vorlagen, die mit den Dialogfeldern im alten Stil verwendet werden, ähneln denen, die in den anderen gängigen Dialogfeldern verwendet werden. Weitere Informationen finden Sie unter HookProzeduren für allgemeine Dialogfelder und benutzerdefinierte Vorlagen.

Um eine Hookprozedur für ein Dialogfeld "Öffnen " oder "Speichern unter " im alten Stil zu aktivieren, verwenden Sie beim Erstellen des Dialogfelds die OPENFILENAME-Struktur . Legen Sie das OFN_ENABLEHOOK-Flag im Flags-Member fest, und geben Sie die Adresse einer OFNHookProcOldStyle-Hookprozedur im lpfnHook-Element an. Die Dialogfeldprozedur sendet eine WM_INITDIALOG Nachricht an die Hookprozedur, wobei der Param-Parameter auf die Adresse der OPENFILENAME-Struktur festgelegt ist, die zum Initialisieren des Dialogfelds verwendet wird.

Sie können die OPENFILENAME-Struktur verwenden, um eine benutzerdefinierte Vorlage für das Dialogfeld Öffnen oder Speichern unter anzugeben, die anstelle der Standardvorlage verwendet werden soll. Wenn Es sich bei Ihrer benutzerdefinierten Vorlage um eine Ressource in einer Anwendung oder einer Bibliothek mit dynamischem Link handelt, legen Sie das OFN_ENABLETEMPLATE-Flag im Flags-Element fest, und verwenden Sie die Elemente hInstance und lpTemplateName der Struktur, um das Modul und den Ressourcennamen zu identifizieren. Wenn sich Ihre benutzerdefinierte Vorlage bereits im Arbeitsspeicher befindet, legen Sie das OFN_ENABLETEMPLATEHANDLE-Flag fest, und verwenden Sie den hInstance-Member , um das Speicherobjekt zu identifizieren, das die Vorlage enthält. Erstellen Sie die benutzerdefinierte Vorlage, indem Sie die Standardvorlage ändern, die in der Datei Fileopen.dlg angegeben ist. Die steuerelementbezeichner, die in den Standarddialogvorlagen suchen und ersetzen verwendet werden, sind in der Datei Dlgs.h definiert.

Standardmäßig zeigen die Funktionen GetOpenFileName und GetSaveFileName die Dialogfelder im Explorer-Stil an. Wenn Sie ein Dialogfeld im alten Stil anzeigen möchten, müssen Sie eine OFNHookProcOldStyle-Hookprozedur bereitstellen und sicherstellen, dass das OFN_EXPLORER-Flag nicht im Flags-Element der OPENFILENAME-Struktur festgelegt ist.

Wenn Sie das OFN_EXPLORER-Flag festlegen, behandelt das System eine Hookprozedur oder benutzerdefinierte Vorlage als Explorer Anpassung. Informationen zum Anpassen eines Dialogfelds im Explorer-Format finden Sie unter benutzerdefinierte Vorlagen im Explorer-Format.

Siehe auch