Dialogfelder suchen und ersetzen

Zeigt ein nicht modusloses Dialogfeld an, in dem der Benutzer eine Zeichenfolge angeben kann, nach der gesucht werden soll, sowie Optionen, die beim Suchen nach Text in einem Dokument verwendet werden können. Im Dialogfeld Ersetzen kann der Benutzer eine Zeichenfolge, nach der gesucht werden soll, und eine Ersatzzeichenfolge 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.

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.

Dialogfeld "Ersetzen"

Im Gegensatz zu anderen gängigen Dialogfeldern sind die Dialogfelder Suchen und Ersetzen moduslos. Mit einem moduslosen Dialogfeld kann der Benutzer zwischen dem Dialogfeld und dem Fenster wechseln, in dem es erstellt wurde. Dies ist nützlich, damit der Benutzer nach einer Zeichenfolge suchen, zum Anwendungsfenster wechseln kann, um an der Zeichenfolge zu arbeiten, und zurück zum Dialogfeld wechseln kann, um nach einer anderen Zeichenfolge zu suchen, ohne den Befehl zu wiederholen, der zum Öffnen des Dialogfelds erforderlich ist.

Wenn die Funktion FindText oder ReplaceText 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, gibt sie NULL zurück. 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 registrierte FINDMSGSTRING-Nachricht

Vor dem Erstellen eines Dialogfelds Suchen oder Ersetzen müssen Sie die RegisterWindowMessage-Funktion aufrufen, um einen Nachrichtenbezeichner für die registrierte FINDMSGSTRING-Nachricht zu erhalten. 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-Member 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 Ersetzungszeichenfolge (falls verfügbar) und der Optionen für den Such- und Ersetzungsvorgang.

In einer FINDMSGSTRING-Nachricht enthält das Flags-Member 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 Meldung 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. Der lpstrFindWhat-Member gibt die zu ersetzende Zeichenfolge und das lpstrReplaceWith-Element die Ersetzungszeichenfolge an.
FR _ REPLACEALL Der Benutzer hat in einem Dialogfeld Ersetzen auf die Schaltfläche Alle ersetzen geklickt. Der lpstrFindWhat-Member gibt die zu ersetzende Zeichenfolge und das lpstrReplaceWith-Element die Ersetzungszeichenfolge an.

Für die Meldung "Weiter suchen" oder "Alle ersetzen" kann das Flags-Member eine beliebige Kombination der folgenden Flags enthalten, um die Suchoptionen anzugeben.

Flag Bedeutung
FR _ DOWN Wenn diese Option festgelegt ist, wird die Schaltfläche Nach unten der Optionsfelder für die Richtung ausgewählt, die 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, damit der Benutzer bis zum Anfang des Dokuments suchen möchte.
FR _ MATCHCASE Wenn diese Option festgelegt ist, wird das Kontrollkästchen Übereinstimmungsfall aktiviert, das angibt, dass bei der Suche die Schreibung beachtet werden soll. 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 Nur ganzes Wort suchen aktiviert, das angibt, dass der Benutzer nur nach ganzen Wörtern suchen möchte, die mit der Suchzeichenfolge übereinstimmen. Wenn FR _ WHOLEWORD nicht festgelegt ist, ist das Kontrollkästchen deaktiviert, sodass Sie auch nach Wortfragmenten suchen sollten, die mit der Suchzeichenfolge übereinstimmen.

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 alle Steuerelemente der Suchoption auszublenden oder zu deaktivieren. Beispielsweise können Sie das FR NOMATCHCASE-Flag so festlegen, dass das Kontrollkästchen Groß-/Kleinschreibung abgleichen deaktiviert wird, oder das FR HIDEMATCHCASE-Flag so festlegen, dass _ es _ auszublenden ist.

Sie können eine benutzerdefinierte Vorlage für ein Dialogfeld Suchen oder Ersetzen bereitstellen, z. B. wenn Sie zusätzliche Steuerelemente einfügen möchten, die für Ihre Anwendung eindeutig sind. Die Funktionen FindText und ReplaceText verwenden Ihre benutzerdefinierte Vorlage statt der Standardvorlage.

So stellen Sie eine benutzerdefinierte Vorlage für ein Dialogfeld "Suchen oder Ersetzen" zur Verfügung

  1. Erstellen Sie die benutzerdefinierte Vorlage, indem Sie die in der Datei Findtext.dlg angegebene Standardvorlage ändern. Die Steuerelementbezeichner, die in der Standarddialogvorlage Suchen oder Ersetzen verwendet werden, werden in der Datei Dlgs.h definiert.
  2. Verwenden Sie die FINDREPLACE-Struktur, um die Vorlage wie folgt zu aktivieren:
      • Wenn Ihre benutzerdefinierte Vorlage eine Ressource in einer Anwendung oder dynamic-link-Bibliothek ist, legen Sie das FR _ ENABLETEMPLATE-Flag im Flags-Element fest. Verwenden Sie die Elemente hInstance und lpTemplateName der Struktur, um das Modul und den Ressourcennamen zu identifizieren.

        -Oder-

      • Wenn sich Ihre benutzerdefinierte Vorlage bereits im Arbeitsspeicher befindet, legen Sie das FR _ ENABLETEMPLATEHANDLE-Flag 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 bereitstellen, um Eingaben für Ihre Steuerelemente zu verarbeiten.

So aktivieren Sie eine Hookprozedur für ein Dialogfeld "Suchen oder Ersetzen"

  1. Legen Sie das FR _ ENABLEHOOK-Flag im Flags-Member der FINDREPLACE-Struktur fest.
  2. Geben Sie die Adresse der Hookprozedur im lpfnHook-Member 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 WM _ INITDIALOG-Meldung FALSE zurückgibt, wird das Dialogfeld nur angezeigt, wenn es in der Hookprozedur angezeigt wird. Führen Sie dazu zunächst alle anderen Zeichnen-Vorgä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);