Dialogfelder "Öffnen und Speichern unter"
Anmerkung
Die GetOpenFileName--Funktion wird in der Datei im Beispielveranschaulicht.
[Ab Windows Vista wurden die Öffnen und Allgemeinen Dialogfelder "Speichern unter" durch das Dialogfeld "Allgemeines Element"ersetzt. Es wird empfohlen, anstelle dieser Dialogfelder aus der Allgemeinen Dialogfeldbibliothek die Api für das allgemeine Elementdialogfeld zu verwenden.]
Mit dem Dialogfeld "öffnen" können Benutzer das Laufwerk, das Verzeichnis und den Namen einer datei oder einer Gruppe geöffneter Dateien angeben. 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 können 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-Format Öffnen und Dialogfelder "Speichern unter" bieten Benutzeroberflächenfeatures, die dem Windows-Explorer ähneln. Das System unterstützt jedoch weiterhin alte Formatvorlagen Open und Dialogfelder "Speichern unter" für Anwendungen, die mit der Benutzeroberfläche des alten Stils konsistent sein müssen.
Neben dem Unterschied bei der Darstellung unterscheiden sich die Dialogfelder im Explorer-Stil und im alten Stil bei der Verwendung von benutzerdefinierten Vorlagen und Hook-Verfahren zum Anpassen der Dialogfelder. Die Dialogfelder im Explorer-Stil 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 Benutzereingabe und das Abrufen des vom Benutzer angegebenen Dateinamens. Weitere Informationen zu den Dialogfeldern "Explorer" und "Alte Formatvorlage" finden Sie unter Anpassung des Dialogfelds "Öffnen und Speichern unter".
Die folgende Abbildung zeigt ein typisches Explorer-Format Dialogfeld " öffnen".
Die folgende Abbildung zeigt ein typisches Explorer-Format Dialogfeld "Speichern unter".
Wenn der Benutzer einen Dateinamen angibt und auf die Schaltfläche OK klickt, gibt GetOpenFileName oder GetSaveFileNameTRUEzurück. Der Puffer, der vom 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 Dialogfeld speichern unter abbricht oder ein Fehler auftritt, gibt die Funktion FALSE-zurück. Rufen Sie zum Ermitteln der Ursache des Fehlers 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 Byte des Puffers, auf den das lpstrFile Member verweist, werden auf einen ganzzahligen Wert festgelegt, der die erforderliche Größe angibt, um den vollständigen Namen zu erhalten.
Die folgenden Themen werden in diesem Abschnitt behandelt.
- Dateinamen und Verzeichnisse
- Filter
- Datei- und Verzeichnisüberprüfung
- Anpassung des Dialogfelds "Öffnen und Speichern unter"
- Explorer-Style Hook Procedures
- Explorer-Style benutzerdefinierte Vorlagen
- Explorer-Style Steuerelementbezeichner
- Anpassen Old-Style Dialogfelder
Dateinamen und Verzeichnisse
Die Informationen in diesem Abschnitt gelten sowohl für Explorer-Format als auch für alte Öffnen und Dialogfelder "Speichern unter".
Bevor Sie die funktionen GetOpenFileName oder GetSaveFileName aufrufen, muss der lpstrFile Member der OPENFILENAME Struktur auf den Puffer verweisen, um den Dateinamen zu erhalten. Der nMaxFile Member muss die Größe des lpstrFile- Puffers in Zeichen angeben. Bei einer 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 lpstrFile Puffer. Die Funktion legt außerdem die nFileOffset- und nFileExtension- Elemente auf die Offsets (in Zeichen) vom Anfang des Puffers bis zum Dateinamen und zur 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 den nMaxFileTitle Member auf die Größe des Puffers in Zeichen fest. Alternativ können Sie den lpstrFile- Puffer in einem Aufruf der GetFileTitle--Funktion übergeben, um den Anzeigenamen der ausgewählten Datei abzurufen. Beachten Sie jedoch, dass der Dateiname, der GetFileTitle zurückgibt, nur dann eine Erweiterung enthält, wenn dies die Einstellung des Benutzers für die Anzeige von Dateinamen ist.
Das Dialogfeld verwendet das aktuelle Verzeichnis für den Aufrufprozess als erstes Verzeichnis, aus dem Dateien und Verzeichnisse angezeigt werden sollen. Verwenden Sie die funktionen GetCurrentDirectory und SetCurrentDirectory, um das aktuelle Verzeichnis eines Prozesses abzurufen und zu ändern. Um ein anderes Anfangsverzeichnis anzugeben, ohne das aktuelle Verzeichnis zu ändern, verwenden Sie das lpstrInitialDir Member, um den Namen eines Verzeichnisses anzugeben. Das Dialogfeld ändert ihr aktuelles Verzeichnis automatisch, wenn der Benutzer ein anderes Laufwerk oder Verzeichnis auswählt. Um zu verhindern, dass das Dialogfeld Ihr aktuelles Verzeichnis ändert, legen Sie das OFN_NOCHANGEDIR Flag fest. Dieses Kennzeichen verhindert nicht, dass der Benutzer Verzeichnisse ändert, um eine Datei zu finden.
Um eine Standarddateierweiterung anzugeben, verwenden Sie das lpstrDefExt Member. Wenn der Benutzer einen Dateinamen angibt, der nicht über eine Erweiterung verfügt, fügt das Dialogfeld die Standarderweiterung hinzu. Wenn Sie eine Standarderweiterung angeben und der Benutzer einen Dateinamen mit einer anderen Erweiterung angibt, legt das Dialogfeld das OFN_EXTENSIONDIFFERENT Flag fest.
Um dem Benutzer die Auswahl mehrerer Dateien aus einem Verzeichnis zu ermöglichen, legen Sie das OFN_ALLOWMULTISELECT Flag fest. Aus Gründen der Kompatibilität mit älteren Anwendungen verwendet das Standarddialogfeld für mehrfache Auswahl die Benutzeroberfläche des alten Stils. Um ein Dialogfeld mit mehrfacher Auswahl im Explorer-Stil anzuzeigen, müssen Sie auch das OFN_EXPLORER Flag 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. Der nFileOffset Member ist der Offset auf den ersten Dateinamen, und der nFileExtension Member wird nicht verwendet. In der folgenden Tabelle wird der Unterschied zwischen Explorer-Format- und Alten Dialogfeldern beim Zurückgeben mehrerer Dateinamen beschrieben.
Dialogfeldformat | Beschreibung |
---|---|
Dialogfelder im Explorer-Stil | Die Zeichenfolgen für Verzeichnis- und Dateinamen sind NULL getrennt, wobei nach dem Nachnamen ein zusätzliches NULL- Zeichen vorhanden ist. Dieses Format ermöglicht es den Dialogfeldern im Explorer-Stil, lange Dateinamen zurückzugeben, die Leerzeichen enthalten. |
Dialogfelder im alten Stil | Die Zeichenfolgen für Verzeichnis- und Dateinamen werden durch Leerzeichen getrennt. Bei Dateinamen mit Leerzeichen verwendet die Funktion kurze Dateinamen. |
Sie können die funktion FindFirstFile verwenden, um zwischen langen und kurzen Dateinamen zu konvertieren.
Wenn Sie OFN_ALLOWMULTISELECT angeben und der Benutzer nur eine Datei auswählt, weist die lpstrFile- Zeichenfolge kein Trennzeichen zwischen dem Pfad und dem Dateinamen auf.
Filter
Die Informationen in diesem Abschnitt gelten sowohl für Explorer- als auch für die alte Formatvorlage "Öffnen" und Dialogfelder "Speichern unter".
Sie können Dateinamenfilter bereitstellen, um den Benutzer bei der Einschränkung der angezeigten Dateinamen zu unterstützen. Ein Dateinamefilter besteht aus einem Paar von mit Null beendeten Zeichenfolgen, einer Beschreibung und einem Muster, das mit dem anderen verkettet ist. Im Dialogfeld wird die Beschreibung angezeigt, damit der Benutzer den zu verwendenden Filter auswählen kann. und es verwendet das Muster, um die anzuzeigenden Dateien auszuwählen.
Um die Filter anzugeben, legen Sie den lpstrFilter Member der OPENFILENAME- Struktur so fest, dass sie auf einen Puffer zeigt, der ein Array von Filterzeichenfolgenpaaren enthält. Auf die letzte Zeichenfolge im Array muss ein zusätzliches Nullzeichen folgen.
Eine Musterzeichenfolge kann eine Kombination aus gültigen Dateinamenzeichen und sternchen (*) sein. Das Sternchen ist ein Wildcard, 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 (;) verwenden, 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, zeigt das Dialogfeld nur Dateien an, die über die Option verfügen. 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;
Der nFilterIndex- Member der OPENFILENAME- Struktur gibt einen Index an, der angibt, welcher Filter das Dialogfeld anfänglich verwendet. Der erste Filter im Puffer weist Index 1, die zweite 2 usw. auf. Wenn der Benutzer den Filter während der Verwendung des Dialogfelds ändert, wird der nFilterIndex Member auf den Index des ausgewählten Filters festgelegt, der zurückgegeben wird.
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 den nMaxCustFilter Member auf die Größe des Puffers, in Zeichen oder Byte festlegen. Das Dialogfeld platziert den benutzerdefinierten Filter immer am Anfang der Liste der Filter und aktualisiert im Gegenzug immer den Musterteil des Filters mit dem Muster aus dem vom Benutzer ausgewählten Filter.
Bei Dialogfeldern im Explorer-Stil kann sich die Standarderweiterung ändern, wenn der Benutzer einen anderen Filter auswählt. Wenn der Benutzer einen Filter auswählt, dessen erstes Muster das Formular *ist.xxx- (d. h. die Erweiterung enthält kein Wildcardzeichen), verwendet das Dialogfeld xxx- als Standarderweiterung. Dies tritt nur auf, wenn Sie eine Standarderweiterung in der lpstrDefExt Member der OPENFILENAME- Struktur angegeben haben. Wenn der Benutzer beispielsweise "Quelle\0*" auswählt. C;*. CXX\0"-Filter, die Standarderweiterung ändert sich in "C". Wenn Sie den Filter jedoch als "Source\0*" definiert haben. C*\0", die Standarderweiterung würde sich nicht ändern, da die Erweiterung einen Wildcard enthält.
Die CDN_INCLUDEITEM-Benachrichtigung bietet eine weitere Möglichkeit zum Filtern der Namen, die im Dialogfeld angezeigt werden. Um diese Meldung zu verwenden, geben Sie eine OFNHookProc- Hook-Prozedur an, und geben Sie das OFN_ENABLEINCLUDENOTIFY Flag 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 das Hook-Verfahren für jedes Element im neu geöffneten Ordner. Der Rückgabewert der Hook-Prozedur gibt an, ob das Dialogfeld das Element in der Elementliste des Ordners anzeigen soll.
Datei- und Verzeichnisüberprüfung
Abgesehen davon gelten die Informationen in diesem Abschnitt sowohl für Explorer-Stil- als auch für alte Formatvorlagen "Öffnen" und Dialogfelder "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 des Dateinamenzeichens außer Kraft zu setzen, legen Sie das OFN_NOVALIDATE Flag fest.
Um zu erzwingen, dass der Benutzer den Namen einer vorhandenen Datei angegeben hat, legen Sie das OFN_FILEMUSTEXIST Flag fest. Um die Überprüfung zu erzwingen, dass der angegebene Pfad vorhanden ist, legen Sie das OFN_PATHMUSTEXIST Flag fest. Wenn Sie das OFN_CREATEPROMPT Flag festlegen, fordert das Dialogfeld den Benutzer zur Berechtigung zum Erstellen einer nicht vorhandenen Datei auf. Wenn dieses Kennzeichen 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 an den Benutzer weiterleiten, um den Benutzer aufzufordern, eine vorhandene Datei zu überschreiben, indem Sie das OFN_OVERWRITEPROMPT Flag festlegen.
Standardmäßig erstellt das Dialogfeld eine 0-Länge-Testdatei, um zu bestimmen, ob eine neue Datei im ausgewählten Verzeichnis erstellt werden kann. Um die Erstellung dieser Testdatei zu verhindern, legen Sie das OFN_NOTESTFILECREATE Flag fest.
Wenn Sie eine Hook-Prozedur aktivieren, benachrichtigt das Dialogfeld Ihre Hook-Prozedur, wenn eine Netzwerkfreigabeverletzung für den vom Benutzer angegebenen Dateinamen auftritt. Wenn Sie das OFN_EXPLORER Flag festlegen, sendet das Dialogfeld die CDN_SHAREVIOLATION Nachricht an die Hook-Prozedur. Wenn Sie OFN_EXPLORERnicht festlegen, sendet das Dialogfeld die SHAREVISTRING- registrierte Nachricht an die Hook-Prozedur. Um zu verhindern, dass das Dialogfeld Benachrichtigungen zu Freigabeverstößen sendet, legen Sie das OFN_SHAREAWARE Flag fest.
Wenn der Benutzer das schreibgeschützte Kontrollkästchen aktiviert, legt das Dialogfeld das OFN_READONLY Flag für die Rückgabe fest. Wenn Sie das Kontrollkästchen Als schreibgeschützt öffnen ausblenden möchten, legen Sie das OFN_HIDEREADONLY Flag fest. Um zu verhindern, dass das Dialogfeld Namen vorhandener Dateien zurückgibt, die über das schreibgeschützte Attribut verfügen, legen Sie das OFN_NOREADONLYRETURN Flag fest.
Um zu verhindern, dass das Dialogfeld Verknüpfungsdateien ableiten kann, legen Sie den OFN_NODEREFERENCELINKS Wert 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 Dialogfeld "Speichern unter" anpassen, indem Sie eine Hook-Prozedur, eine benutzerdefinierte Vorlage oder beides bereitstellen. Die Versionen im Explorer- und alten Stil der Dialogfelder unterscheiden sich jedoch in ihrer Verwendung von benutzerdefinierten Vorlagen und Hook-Prozeduren.
Informationen zum Anpassen eines Dialogfelds im Explorer-Stil finden Sie unter Explorer-Style Hook Procedures, Explorer-Style Custom Templatesund Explorer-Style Control Identifiers. Informationen zum Anpassen eines Dialogfelds im alten Stil finden Sie unter Anpassen von Old-Style Dialogfeldern.
In der folgenden Tabelle sind die Unterschiede zwischen den beiden Formatvorlagen zusammengefasst.
Anpassung | Beschreibung |
---|---|
Explorer-Stil Hook-Prozedur | Die Hook-Prozedur empfängt Benachrichtigungen, die aus dem allgemeinen Dialogfeld und nachrichten für alle zusätzlichen Steuerelemente gesendet werden, die Sie durch Angeben einer untergeordneten Dialogfeldvorlage definiert haben. Die Hook-Prozedur empfängt keine Meldungen für die Standardsteuerelemente des Standarddialogfelds. |
Benutzerdefinierte Explorer-Vorlage | Das System verwendet die benutzerdefinierte Vorlage zum Erstellen eines untergeordneten Dialogfelds. Die Vorlage kann zusätzliche Steuerelemente definieren und den Speicherort des Clusters von Standardsteuerelementen angeben. Die benutzerdefinierte Vorlage ersetzt nicht die Standardvorlage. |
Old-Style Hook-Verfahren | Die Hook-Prozedur empfängt alle nachrichten, die an das Dialogfeld gesendet werden, einschließlich Nachrichten für die Standardsteuerelemente und alle benutzerdefinierten Steuerelemente. Die Hook-Prozedur empfängt auch registrierte Nachrichten, die aus dem 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 alten Stil ist entweder ""Öffnen" oder "Speichern unter" ." Um den Titel zu ändern, geben Sie den neuen Titel im lpstrTitle Member der OPENFILENAME- Struktur an.
Die HKEY_CURRENT_USER Registrierungsstruktur eines Benutzers kann Werte enthalten, die den Inhalt des Explorer-Stils anpassen, Dialogfelder "Öffnen" und Dialogfelder "Speichern unter" 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 im Explorer-Stil "Öffnen" und Dialogfeldern "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 Places Leiste wird durch den Inhalt des folgenden Unterschlüssels bestimmt:
HKEY_CURRENT_USER
Software
Microsoft
Windows
CurrentVersion
Policies
Comdlg32
Placesbar
Derzeit können nur fünf Einträge unter diesem Schlüssel vorhanden 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_SZoder REG_EXPAND_SZ Werte sein, die Speicherorte identifizieren, die in die Platzleiste eingeschlossen 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 mit Null beendete Zeichenfolge, die einen gültigen Pfad angibt. |
Explorer-Style Hook-Verfahren
Sie können ein Explorer-Format Öffnen oder Dialogfeld "Speichern unter" anpassen, indem Sie eine Hook-Prozedur, eine benutzerdefinierte Vorlage oder beides bereitstellen. Wenn Sie eine Hook-Prozedur für ein Dialogfeld im Explorer-Stil bereitstellen, erstellt das System ein Dialogfeld, das ein untergeordnetes Element des Standarddialogfelds ist. Die Hook-Prozedur fungiert als Dialogfeld für das untergeordnete Dialogfeld. Dieses untergeordnete Dialogfeld basiert auf der benutzerdefinierten Vorlage oder auf einer Standardvorlage, wenn keine angegeben wird. Weitere Informationen finden Sie unter Explorer-Style benutzerdefinierten Vorlagen.
Zum Aktivieren einer Hook-Prozedur für eine Explorer-Formatvorlage Öffnen oder Dialogfeld "Speichern unter" verwenden Sie beim Erstellen des Dialogfelds die OPENFILENAME- Struktur. Legen Sie die flags OFN_ENABLEHOOK und OFN_EXPLORER im Flags Member fest, und geben Sie die Adresse eines OFNHookProc Hook-Prozedur im lpfnHook Member an. Wenn Sie ein Hook-Verfahren bereitstellen und das OFN_EXPLORER Flag weglassen, müssen Sie ein OFNHookProcOldStyle- Hook-Verfahren verwenden, und Sie erhalten die Benutzeroberfläche des alten Stils. Weitere Informationen finden Sie unter Anpassen Old-Style Dialogfelder.
Eine Hook-Prozedur im Explorer-Stil empfängt eine Vielzahl von Nachrichten, während das Dialogfeld geöffnet ist. Dazu gehören folgendes:
- Die WM_INITDIALOG Nachricht und andere Standarddialogfeldmeldungen, z. B. die WM_CTLCOLORDLG Steuerelementfarbmeldung.
- Eine Reihe von WM_NOTIFY Benachrichtigungen, die Aktionen des Benutzers oder anderer Dialogfeldereignisse angeben.
- Nachrichten für alle zusätzlichen Steuerelemente, die Sie durch Angeben einer untergeordneten Dialogfeldvorlage definiert haben.
Darüber hinaus gibt es eine Reihe von Nachrichten, die Sie an ein Dialogfeld im Explorer-Stil senden können, um Informationen abzurufen oder das Verhalten und die Darstellung des Dialogfelds zu steuern.
Wenn Sie eine Hook-Prozedur für ein Dialogfeld im Explorer-Stil bereitstellen, erstellt die Standarddialogfeldprozedur ein untergeordnetes Dialogfeld, wenn die Standarddialogprozedur die WM_INITDIALOG Nachricht verarbeitet. Die Hook-Prozedur fungiert als Dialogfeld für das untergeordnete Dialogfeld. Zurzeit empfängt die Hook-Prozedur eine eigene WM_INITDIALOG Nachricht, wobei der parameter lParam auf die Adresse der OPENFILENAME Struktur festgelegt ist, die zum Initialisieren des Dialogfelds verwendet wird. Nachdem das untergeordnete Dialogfeld die Verarbeitung einer 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 Hook-Prozedur.
Die Hook-Prozedur empfängt WM_NOTIFY Benachrichtigungen, die aktionen des Benutzers im Dialogfeld angeben. Sie können einige dieser Meldungen verwenden, um das Verhalten des Dialogfelds zu steuern. Beispielsweise empfängt die Hook-Prozedur die CDN_FILEOK Nachricht, wenn der Benutzer einen Dateinamen auswähelt und auf die Schaltfläche OK klickt. Als Reaktion auf diese Meldung kann die Hook-Prozedur 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 Code Member in der Kopfzeile dieser Struktur enthält eine der folgenden Benachrichtigungen.
Nachricht | Bedeutung |
---|---|
CDN_FILEOK | Der Benutzer hat auf die Schaltfläche OK geklickt; das Dialogfeld wird 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 OFN_ENABLEINCLUDENOTIFY Flag festgelegt wurde. |
CDN_INITDONE | Das System hat die Initialisierung des Dialogfelds abgeschlossen, und das Dialogfeld hat die Verarbeitung der WM_INITDIALOG Nachricht 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 | Das allgemeine Dialogfeld hat eine Freigabeverletzung 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 FILEOKSTRING-, LBSELCHSTRING-, SHAREVISTRING-und HELPMSGSTRING- registrierte Nachrichten, die in früheren Versionen der Dialogfelder Öffnen und Speichern unter verwendet werden. Die Hook-Prozedur empfängt jedoch auch die abgelöste Nachricht nach der WM_NOTIFY Nachricht, wenn die WM_NOTIFY Verarbeitung nicht SetWindowLong- verwendet, um einen Wert ungleich null DWL_MSGRESULT festzulegen.
Zum Abrufen von Informationen zum Status des Dialogfelds oder zum Steuern des Verhaltens und der Darstellung des Dialogfelds kann die Hook-Prozedur 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 Shell-Namespace. |
CDM_GETFOLDERPATH | Ruft den Pfad des aktuellen Ordners oder Verzeichnisses für das Dialogfeld ab. |
CDM_GETSPEC | Ruft den Dateinamen (nicht einschließlich des Pfads) der aktuell im Dialogfeld ausgewählten Datei ab. |
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
Um zusätzliche Steuerelemente für ein Explorer-Format Dialogfeld "Öffnen" oder Dialogfeld "Speichern unter" zu definieren, verwenden Sie die OPENFILENAME- Struktur, um eine Vorlage für ein untergeordnetes Dialogfeld anzugeben, das die zusätzlichen Steuerelemente enthält. Wenn es sich bei Der untergeordneten Dialogfeldvorlage um eine Ressource in einer Anwendungs- oder Dynamic Link Library handelt, legen Sie das OFN_ENABLETEMPLATE Flag im Flags Member fest, und verwenden Sie die hInstance und lpTemplateName Member der Struktur, um den Modul- und Ressourcennamen zu identifizieren. Wenn sich die Vorlage bereits im Arbeitsspeicher befindet, legen Sie das OFN_ENABLETEMPLATEHANDLE-Flag fest, und verwenden Sie das hInstance Member, um das Speicherobjekt zu identifizieren, das die Vorlage enthält. Wenn Sie eine untergeordnete Dialogfeldvorlage für ein Dialogfeld im Explorer-Stil bereitstellen, müssen Sie auch das OFN_EXPLORER Flag festlegen; andernfalls geht das System davon aus, dass Sie eine Ersatzvorlage für ein Dialogfeld im alten Stil bereitstellen. Wenn Sie normalerweise zusätzliche Steuerelemente bereitstellen, müssen Sie auch eine Explorer-Hookprozedur bereitstellen, um Nachrichten für die neuen Steuerelemente zu verarbeiten.
Sie können ihre untergeordnete Dialogfeldvorlage wie jede andere Vorlage erstellen, mit der Ausnahme, dass Sie die Formatvorlagen WS_CHILD und WS_CLIPSIBLINGS angeben und die formatvorlagen DS_3DLOOK und DS_CONTROL angeben müssen. Das System erfordert die WS_CHILD Formatvorlage, da ihre Vorlage ein untergeordnetes Dialogfeld des Standarddialogfelds "Öffnen" oder Dialogfeld "Speichern unter" definiert. Die WS_CLIPSIBLINGS Formatvorlage stellt sicher, dass das untergeordnete Dialogfeld keines der Steuerelemente im Standarddialogfeld überstreicht. Die DS_3DLOOK Formatvorlage stellt sicher, dass die Darstellung der Steuerelemente im untergeordneten Dialogfeld mit den Steuerelementen im Standarddialogfeld konsistent ist. Die DS_CONTROL Formatvorlage stellt sicher, dass der Benutzer die TAB-TASTE und andere Navigationstasten verwenden kann, um im benutzerdefinierten Dialogfeld zwischen allen Steuerelementen, Standard- oder Benutzerdefiniert zu wechseln.
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 unterhalb der Steuerelemente im Standarddialogfeld positioniert. Sie können diese Standardpositionierung jedoch außer Kraft setzen, indem Sie ein statisches Textsteuerelement in die benutzerdefinierte Dialogfeldvorlage einfügen und ihm den Wert des Steuerelementbezeichners stc32zuweisen. (Dieser Wert wird in der Headerdatei "Dlgs.h" definiert.) In diesem Fall verwendet das System das Steuerelement als Referenzpunkt, um zu bestimmen, wo die neuen Steuerelemente positioniert werden sollen. Alle neuen Steuerelemente oberhalb und links neben dem stc32 Steuerelement werden über und links neben den Steuerelementen im Standarddialogfeld positioniert. Neue Steuerelemente unterhalb und rechts neben dem stc32- Steuerelement werden unterhalb und rechts neben den Standardsteuerelementen positioniert. Im Allgemeinen wird jedes neue Steuerelement so positioniert, dass es die gleiche Position relativ zu den Standardsteuerelementen wie zum 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 die Hook-Prozedur, um alle Nachrichten zu verarbeiten, die für das benutzerdefinierte Dialogfeld vorgesehen sind, und sendet daher dieselben Fenstermeldungen an die Hook-Prozedur wie an jede andere Dialogfeldprozedur. Beispielsweise empfängt die Hook-Prozedur WM_COMMAND Meldungen, wenn der Benutzer im benutzerdefinierten Dialogfeld auf Schaltflächensteuerelemente klickt. Das Hook-Verfahren ist für die Initialisierung dieser Steuerelemente und das Abrufen von Werten aus den Steuerelementen verantwortlich, wenn das Dialogfeld geschlossen wird. Beachten Sie, dass das System, wenn die Hook-Prozedur die WM_INITDIALOG Nachricht empfängt, die Steuerelemente noch nicht an ihre endgültigen Positionen verschoben hat.
Die Standarddialogfeldprozedur behandelt Nachrichten für alle Steuerelemente im Standarddialogfeld, aber die Hook-Prozedur empfängt die Benachrichtigungen für Benutzeraktionen für diese Steuerelemente, wie in Explorer-Style Hook Proceduresbeschrieben.
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-Stil. Dies liegt daran, dass Sie in den Dialogfeldern im Explorer-Stil eigene Steuerelemente hinzufügen, aber die Änderung 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. Beispielsweise erfordern die CDM_HIDECONTROL und CDM_SETCONTROLTEXT Nachrichten einen Steuerelementbezeichner.
In der folgenden Tabelle sind die Bezeichner der Standardsteuerelemente im Explorer-Stil Dialogfelder "Öffnen" und Dialogfelder "Speichern unter" aufgeführt. Die Bezeichner sind Konstanten, die in Dlgs.h und Winuser.h definiert sind.
Steuerelementbezeichner | Steuerelementbeschreibung |
---|---|
chx1 | Das schreibgeschützte Kontrollkästchen |
cmb1 | Dropdown-Kombinationsfeld, in dem die Liste der Dateitypfilter angezeigt wird |
stc2- | Beschriftung für das kombinationsfeld cmb1 |
cmb2 | Dropdown-Kombinationsfeld, das das aktuelle Laufwerk oder den aktuellen Ordner anzeigt und dem Benutzer das Auswählen eines Laufwerks oder Ordners zum Öffnen ermöglicht |
stc4- | Beschriftung für das kombinationsfeld cmb2 |
cmb13 | Dropdown-Kombinationsfeld, in dem der Name der aktuellen Datei angezeigt wird, ermöglicht es dem Benutzer, den Namen einer Zu öffnenden Datei einzugeben und eine Datei auszuwählen, die kürzlich geöffnet oder gespeichert wurde. Dies gilt für frühere Explorer-kompatible Anwendungen ohne Hook oder Dialogvorlage. Vergleich mit edt1. |
edt1 | Bearbeitungssteuerelement, das den Namen der aktuellen Datei anzeigt, oder der Benutzer kann den Namen der Zu öffnenden Datei eingeben. Vergleich mit cmb13. |
stc3- | Beschriftung für das cmb13 Kombinationsfeld und das Bearbeitungssteuerelement edt1 |
lst1 | Listenfeld, in dem der Inhalt des aktuellen Laufwerks oder Ordners angezeigt wird |
stc1- | Beschriftung für das listenfeld lst1 |
IDOK- | Die OK Befehlsschaltfläche (Knopfdruck) |
IDCANCEL- | Die Befehlsschaltfläche Abbrechen (Knopfdruck) |
pshHelp- | Die -Hilfe--Befehlsschaltfläche (Knopfdruck) |
Anpassen Old-Style Dialogfelder
Sie können ein altes Format Öffnen oder Dialogfeld "Speichern unter" anpassen, indem Sie eine OFNHookProcOldStyle- Hook-Prozedur 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 kann. Die Hook-Prozeduren und Vorlagen, die mit den Dialogfeldern im alten Stil verwendet werden, ähneln denen, die mit den anderen gängigen Dialogfeldern verwendet werden. Weitere Informationen finden Sie unter Hook Procedures for Common Dialog Boxes and Custom Templates.
Verwenden Sie zum Aktivieren eines Hook-Verfahrens für eine alte Formatvorlage Öffnen oder Dialogfeld "Speichern unter" die OPENFILENAME- Struktur, wenn Sie das Dialogfeld erstellen. Legen Sie das OFN_ENABLEHOOK Flag im Flags Member fest, und geben Sie die Adresse eines OFNHookProcOldStyle Hook-Prozedur im lpfnHook Member an. Die Dialogfeldprozedur sendet eine WM_INITDIALOG Nachricht an die Hook-Prozedur, wobei der parameter Param 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 die Öffnen oder Dialogfeld "Speichern unter" anzugeben, um anstelle der Standardvorlage zu verwenden. Wenn es sich bei der benutzerdefinierten Vorlage um eine Ressource in einer Anwendungs- oder Dynamic Link Library handelt, legen Sie das OFN_ENABLETEMPLATE Flag im Flags Member fest, und verwenden Sie die hInstance und lpTemplateName Member der Struktur, um den Modul- und Ressourcennamen zu identifizieren. Wenn sich Ihre benutzerdefinierte Vorlage bereits im Arbeitsspeicher befindet, legen Sie das OFN_ENABLETEMPLATEHANDLE-Flag fest, und verwenden Sie das hInstance Element, um das Speicherobjekt zu identifizieren, das die Vorlage enthält. Erstellen Sie die benutzerdefinierte Vorlage, indem Sie die in der Datei Fileopen.dlg angegebene Standardvorlage ändern. Die steuerelementbezeichner, die in den Standarddialogvorlagen "Suchen und Ersetzen" verwendet werden, werden in der Datei "Dlgs.h" definiert.
Standardmäßig werden mit den funktionen GetOpenFileName und GetSaveFileName funktionen die Dialogfelder im Explorer-Stil angezeigt. Wenn Sie ein Dialogfeld im alten Stil anzeigen möchten, müssen Sie eine OFNHookProcOldStyle- Hook-Prozedur angeben und sicherstellen, dass das OFN_EXPLORER Flag nicht im Flags Member der OPENFILENAME- Struktur festgelegt ist.
Wenn Sie das OFN_EXPLORER-Flag festlegen, behandelt das System eine Hook-Prozedur oder benutzerdefinierte Vorlage als Anpassung im Explorer-Stil. Informationen zum Anpassen eines Dialogfelds im Explorer-Stil finden Sie unter Explorer-Style benutzerdefinierte Vorlagen.