Suchen und Ersetzen von Dialogfeldern
Zeigt ein modusloses Dialogfeld an, in dem der Benutzer eine zu suchbare Zeichenfolge angeben kann, sowie Optionen, die bei der Suche nach Text in einem Dokument verwendet werden sollen. Im Dialogfeld Ersetzen kann der Benutzer eine zu suchende Zeichenfolge und eine Ersetzungszeichenfolge sowie Optionen zum Steuern des Vorgangs angeben.
Sie erstellen und zeigen ein Dialogfeld Suchen an, indem Sie eine FINDREPLACE-Struktur initialisieren und die Struktur an die FindText-Funktion übergeben. Die folgende Abbildung zeigt ein typisches Dialogfeld Suchen .
Sie erstellen und zeigen ein Dialogfeld Ersetzen an, indem Sie eine FINDREPLACE-Struktur initialisieren und die Struktur an die ReplaceText-Funktion übergeben. Die folgende Abbildung zeigt ein typisches Dialogfeld Ersetzen .
Im Gegensatz zu anderen gängigen Dialogfeldern sind die Dialogfelder Suchen und Ersetzen moduslos. Ein modusloses Dialogfeld ermöglicht es dem Benutzer, zwischen dem Dialogfeld und dem Fenster zu wechseln, in dem es erstellt wurde. Dies ist nützlich, um dem Benutzer die Suche nach einer Zeichenfolge zu erlauben, zum Anwendungsfenster zu wechseln, um an der Zeichenfolge zu arbeiten, und zurück zum Dialogfeld wechseln, um nach einer anderen Zeichenfolge zu suchen, ohne den Zum Öffnen des Dialogfelds erforderlichen Befehl zu wiederholen.
Wenn die FindText - oder ReplaceText-Funktion das Dialogfeld erfolgreich erstellt, wird ein Handle an das Dialogfeld zurückgegeben. Sie können dieses Handle verwenden, um das Dialogfeld zu verschieben und mit diesem zu kommunizieren. Wenn die Funktion das Dialogfeld nicht erstellen kann, wird NULL zurückgegeben. Sie können die Ursache eines Fehlers ermitteln, indem Sie die CommDlgExtendedError-Funktion aufrufen, um den erweiterten Fehlerwert abzurufen.
In diesem Abschnitt werden die folgenden Themen erläutert.
Die FINDMSGSTRING-Registrierte Nachricht
Bevor Sie ein Dialogfeld Suchen oder Ersetzen erstellen, müssen Sie die RegisterWindowMessage-Funktion aufrufen, um einen Nachrichtenbezeichner für die registrierte FINDMSGSTRING-Nachricht abzurufen. Anschließend können Sie den Bezeichner verwenden, um vom Dialogfeld gesendete Nachrichten zu erkennen und zu verarbeiten. Wenn der Benutzer in einem Dialogfeld auf die Schaltfläche Weiter suchen, Ersetzen oder Alle ersetzen klickt, sendet die Dialogfeldprozedur eine FINDMSGSTRING-Meldung an die Fensterprozedur des Besitzerfensters. Wenn Sie das Dialogfeld erstellen, identifiziert das hwndOwner-Element der FINDREPLACE-Struktur das Besitzerfenster.
Der lParam-Parameter einer FINDMSGSTRING-Nachricht ist ein Zeiger auf die FINDREPLACE-Struktur , die Sie beim Erstellen des Dialogfelds angegeben haben. Vor dem Senden der Nachricht legt das Dialogfeld die Member dieser Struktur mit der neuesten Benutzereingabe fest, einschließlich der zu suchenden Zeichenfolge, der Ersatzzeichenfolge (falls vorhanden) und optionen für den Such- und Ersetzen-Vorgang.
In einer FINDMSGSTRING-Nachricht enthält das Flags-Element der FINDREPLACE-Struktur eines der folgenden Flags, um das Ereignis anzugeben, das die Nachricht verursacht hat.
Flag | Bedeutung |
---|---|
FR_DIALOGTERM | Das Dialogfeld wird geschlossen. Nachdem das Besitzerfenster diese Nachricht verarbeitet hat, ist ein Handle für das Dialogfeld nicht mehr gültig. |
FR_FINDNEXT | Der Benutzer hat in einem Dialogfeld Suchen oder Ersetzen auf die Schaltfläche Weiter suchen geklickt. Der lpstrFindWhat-Member gibt die Zeichenfolge an, nach der gesucht werden soll. |
FR_REPLACE | Der Benutzer hat in einem Dialogfeld Ersetzen auf die Schaltfläche Ersetzen geklickt. Das lpstrFindWhat-Element gibt die zu ersetzende Zeichenfolge an, und das lpstrReplaceWith-Element gibt die Ersetzungszeichenfolge an. |
FR_REPLACEALL | Der Benutzer hat in einem Dialogfeld Ersetzen auf die Schaltfläche Alle ersetzen geklickt. Das lpstrFindWhat-Element gibt die zu ersetzende Zeichenfolge an, und das lpstrReplaceWith-Element gibt die Ersetzungszeichenfolge an. |
Für eine Nachricht Weiter suchen oder Alle ersetzen kann das Flags-Element eine beliebige Kombination der folgenden Flags enthalten, um die Suchoptionen anzugeben.
Flag | Bedeutung |
---|---|
FR_DOWN | Wenn festgelegt, wird die Schaltfläche Nach unten der Optionsfelder richtung ausgewählt, was angibt, dass der Benutzer von der aktuellen Position bis zum Ende des Dokuments suchen möchte. Wenn FR_DOWN nicht festgelegt ist, wird die Schaltfläche Nach oben ausgewählt, sodass der Benutzer bis zum Anfang des Dokuments suchen möchte. |
FR_MATCHCASE | Falls festgelegt, ist das Kontrollkästchen Groß-/Kleinschreibung übereinstimmen aktiviert, das angibt, dass der Benutzer die Groß-/Kleinschreibung bei der Suche beachten möchte. Wenn FR_MATCHCASE nicht festgelegt ist, ist das Kontrollkästchen deaktiviert, sodass bei der Suche die Groß-/Kleinschreibung nicht beachtet werden kann. |
FR_WHOLEWORD | Wenn diese Option festgelegt ist, ist das Kontrollkästchen Ganze Word nur übereinstimmen aktiviert, was angibt, dass der Benutzer nur nach ganzen Wörtern suchen möchte, die der Suchzeichenfolge entsprechen. Wenn FR_WHOLEWORD nicht festgelegt ist, ist das Kontrollkästchen deaktiviert, sodass Sie auch nach Wortfragmenten suchen sollten, die der Suchzeichenfolge entsprechen. |
Anpassen des Dialogfelds "Suchen oder Ersetzen"
Zum Anpassen eines Dialogfelds Suchen oder Ersetzen können Sie eine der folgenden Methoden verwenden:
- Angeben von Werten in der FINDREPLACE-Struktur beim Erstellen des Dialogfelds
- Bereitstellen einer benutzerdefinierten Vorlage
- Bereitstellen einer Hookprozedur
Wenn Sie ein Dialogfeld Suchen oder Ersetzen erstellen, können Sie Flags im Flags-Member der FINDREPLACE-Struktur festlegen, um eines der Suchoptionssteuerelemente auszublenden oder zu deaktivieren. Sie können z. B. das flag FR_NOMATCHCASE so festlegen, dass das Kontrollkästchen Groß-/Kleinschreibung abgleichen deaktiviert wird, oder das flag FR_HIDEMATCHCASE so festlegen, dass es ausgeblendet wird.
Sie können eine benutzerdefinierte Vorlage für ein Dialogfeld Suchen oder Ersetzen bereitstellen, z. B. wenn Sie zusätzliche Steuerelemente einschließen möchten, die für Ihre Anwendung eindeutig sind. Die Funktionen FindText und ReplaceText verwenden Ihre benutzerdefinierte Vorlage anstelle der Standardvorlage.
So stellen Sie eine benutzerdefinierte Vorlage für ein Dialogfeld "Suchen oder Ersetzen" bereit
- Erstellen Sie die benutzerdefinierte Vorlage, indem Sie die in der Datei Findtext.dlg angegebene Standardvorlage ändern. Die in der Standarddialogvorlage Suchen oder Ersetzen verwendeten Steuerelementbezeichner sind in der Datei Dlgs.h definiert.
- Verwenden Sie die FINDREPLACE-Struktur , um die Vorlage wie folgt zu aktivieren:
-
Wenn Es sich bei Ihrer benutzerdefinierten Vorlage um eine Ressource in einer Anwendung oder einer Dynamic Link-Bibliothek handelt, legen Sie das flag FR_ENABLETEMPLATE im Flags-Element fest. Verwenden Sie die Elemente hInstance und lpTemplateName der -Struktur, um den Modul- und Ressourcennamen zu identifizieren.
-Oder-
Wenn sich Ihre benutzerdefinierte Vorlage bereits im Arbeitsspeicher befindet, legen Sie das flag FR_ENABLETEMPLATEHANDLE fest. Verwenden Sie den hInstance-Member , um das Speicherobjekt zu identifizieren, das die Vorlage enthält.
-
Sie können eine FRHookProc-Hookprozedur für ein Dialogfeld Suchen oder Ersetzen bereitstellen. Die Hookprozedur kann nachrichten verarbeiten, die an das Dialogfeld gesendet werden. Wenn Sie eine benutzerdefinierte Vorlage verwenden, um zusätzliche Steuerelemente zu definieren, müssen Sie eine Hookprozedur zum Verarbeiten von Eingaben für Ihre Steuerelemente bereitstellen.
So aktivieren Sie eine Hookprozedur für ein Dialogfeld "Suchen oder Ersetzen"
- Legen Sie das FR_ENABLEHOOK-Flag im Flags-Element der FINDREPLACE-Struktur fest.
- Geben Sie die Adresse der Hookprozedur im lpfnHook-Element an.
Nach der Verarbeitung der WM_INITDIALOG Nachricht sendet die Dialogfeldprozedur eine WM_INITDIALOG Nachricht an die Hookprozedur. Der lParam-Parameter dieser Meldung ist ein Zeiger auf die FINDREPLACE-Struktur , die zum Initialisieren des Dialogfelds verwendet wird.
Wenn die Hookprozedur als Antwort auf die meldung WM_INITDIALOGfalse zurückgibt, wird das Dialogfeld nur angezeigt, wenn es von der Hookprozedur angezeigt wird. Führen Sie dazu zunächst alle anderen Malvorgänge aus, und rufen Sie dann die Funktionen ShowWindow und UpdateWindow auf. Der folgende Code veranschaulicht dies:
// We've returned FALSE in response to WM_INITDIALOG.
// We've performed any other paint operations.
// Now we display the dialog box.
ShowWindow(hDlg, SW_SHOWNORMAL);
UpdateWindow(hDlg);