次の方法で共有


[検索と置換] ダイアログ ボックス

ユーザーが検索する文字列と、ドキュメント内のテキストを検索するときに使用するオプションを指定できるモードレス ダイアログ ボックスを表示します。 [ 置換 ] ダイアログ ボックスでは、検索する文字列と置換文字列、および操作を制御するオプションを指定できます。

FINDREPLACE 構造体を初期化し、その構造を FindText 関数に渡すことで、[検索] ダイアログ ボックスを作成して表示します。 次の図は、一般的な [検索 ] ダイアログ ボックスを示しています。

[検索] ダイアログ ボックス

FINDREPLACE 構造体を初期化し、その構造体を ReplaceText 関数に渡すことで、[置換] ダイアログ ボックスを作成して表示します。 次の図は、一般的な [置換 ] ダイアログ ボックスを示しています。

[置換] ダイアログ ボックス

他の一般的なダイアログ ボックスとは異なり、[ 検索 ] ダイアログ ボックスと [ 置換 ] ダイアログ ボックスはモードレスです。 モードレス ダイアログ ボックスを使用すると、ユーザーはダイアログ ボックスとそれを作成したウィンドウを切り替えることができます。 これは、ユーザーが文字列を検索したり、アプリケーション ウィンドウに切り替えて文字列を操作したり、ダイアログ ボックスに戻ったりして、ダイアログ ボックスを開くために必要なコマンドを繰り返すことなく別の文字列を検索する場合に便利です。

FindText 関数または ReplaceText 関数がダイアログ ボックスを正常に作成すると、ダイアログ ボックスにハンドルが返されます。 このハンドルを使用して、ダイアログ ボックスを移動して通信できます。 関数がダイアログ ボックスを作成できない場合は、 NULL を返します。 CommDlgExtendedError 関数を呼び出して拡張エラー値を取得することで、エラーの原因を特定できます。

このセクションでは、次のトピックについて説明します。

FINDMSGSTRING 登録済みメッセージ

[検索または置換] ダイアログ ボックスを作成する前に、RegisterWindowMessage 関数を呼び出して、FINDMSGSTRING 登録済みメッセージのメッセージ識別子を取得する必要があります。 その後、識別子を使用して、ダイアログ ボックスから送信されたメッセージを検出して処理できます。 ユーザーがダイアログ ボックスの [ 次の検索]、[ 置換]、または [すべて置換] ボタンをクリックすると、ダイアログ ボックス プロシージャは所有者ウィンドウのウィンドウ プロシージャに FINDMSGSTRING メッセージを送信します。 ダイアログ ボックスを作成すると、FINDREPLACE 構造体の hwndOwner メンバーによって所有者ウィンドウが識別されます。

FINDMSGSTRING メッセージの lParam パラメーターは、ダイアログ ボックスの作成時に指定した FINDREPLACE 構造体へのポインターです。 メッセージを送信する前に、ダイアログ ボックスは、検索する文字列、置換文字列 (存在する場合)、検索および置換操作のオプションなど、最新のユーザー入力を使用してこの構造体のメンバーを設定します。

FINDMSGSTRING メッセージでは、FINDREPLACE 構造体の Flags メンバーに、メッセージの原因となったイベントを示す次のいずれかのフラグが含まれています。

フラグ 説明
FR_DIALOGTERM ダイアログ ボックスが閉じています。 所有者ウィンドウがこのメッセージを処理すると、ダイアログ ボックスへのハンドルは無効になります。
FR_FINDNEXT ユーザーが [検索または置換] ダイアログ ボックスの [検索] ボタンをクリックしました。 lpstrFindWhat メンバーは、検索する文字列を指定します。
FR_REPLACE ユーザーが [ 置換 ] ダイアログ ボックスの [ 置換 ] ボタンをクリックしました。 lpstrFindWhat メンバーは置換する文字列を指定し、lpstrReplaceWith メンバーは置換文字列を指定します。
FR_REPLACEALL ユーザーが [置換] ダイアログ ボックスの [すべて置換] ボタンをクリックしました。 lpstrFindWhat メンバーは置換する文字列を指定し、lpstrReplaceWith メンバーは置換文字列を指定します。

 

[ 次を検索] または [すべて置換] メッセージの場合、 Flags メンバーは次のフラグの任意の組み合わせを含めて検索オプションを示すことができます。

フラグ 説明
FR_DOWN 設定すると、方向のラジオ ボタンの [下へ] ボタンが選択され、ユーザーが現在の場所からドキュメントの末尾まで検索することを示します。 FR_DOWNが設定されていない場合は、[上へ] ボタンが選択されるため、ユーザーはドキュメントの先頭まで検索します。
FR_MATCHCASE 設定した場合は、[大文字と小文字を区別する] チェック ボックスが選択され、ユーザーが検索で大文字と小文字を区別することを示します。 FR_MATCHCASEが設定されていない場合、検索で大文字と小文字を区別できないように、チェック ボックスは選択されません。
FR_WHOLEWORD 設定した場合は、[Word全体に一致チェックのみ] ボックスが選択され、ユーザーが検索文字列に一致する単語全体のみを検索することを示します。 FR_WHOLEWORDが設定されていない場合、チェック ボックスは選択されていないため、検索文字列に一致する単語フラグメントも検索する必要があります。

 

[検索または置換] ダイアログ ボックスのカスタマイズ

[ 検索 または 置換 ] ダイアログ ボックスをカスタマイズするには、次のいずれかの方法を使用できます。

  • ダイアログ ボックスの作成時に FINDREPLACE 構造体に値を指定する
  • カスタム テンプレートを指定する
  • フック プロシージャを指定する

[検索または置換] ダイアログ ボックスを作成するときに、FINDREPLACE 構造体の Flags メンバーにフラグを設定して、検索オプション コントロールを非表示または無効にすることができます。 たとえば、FR_NOMATCHCASE フラグを設定して [大文字と小文字を区別する] チェック ボックスを無効にしたり、FR_HIDEMATCHCASE フラグを設定して非表示にすることができます。

たとえば、アプリケーションに固有の追加のコントロールを含める場合は、[ 検索 または 置換 ] ダイアログ ボックスにカスタム テンプレートを指定できます。 FindText 関数と ReplaceText 関数では、既定のテンプレートの代わりにカスタム テンプレートが使用されます。

[検索または置換] ダイアログ ボックスのカスタム テンプレートを指定するには

  1. Findtext.dlg ファイルで指定された既定のテンプレートを変更して、カスタム テンプレートを作成します。 既定の [検索 ] または [ 置換] ダイアログ テンプレートで使用されるコントロール識別子は、Dlgs.h ファイルで定義されています。
  2. FINDREPLACE 構造体を使用して、次のようにテンプレートを有効にします。
      • カスタム テンプレートがアプリケーションまたはダイナミック リンク ライブラリのリソースである場合は、 Flags メンバーで FR_ENABLETEMPLATE フラグを設定します。 モジュールとリソース名を識別するには、構造体の hInstance メンバーと lpTemplateName メンバーを使用します。

        または

      • カスタム テンプレートが既にメモリ内にある場合は、FR_ENABLETEMPLATEHANDLE フラグを設定します。 テンプレートを含むメモリ オブジェクトを識別するには、 hInstance メンバーを使用します。

[検索または置換] ダイアログ ボックスには、FRHookProc フック プロシージャを指定できます。 フック プロシージャは、ダイアログ ボックスに送信されたメッセージを処理できます。 カスタム テンプレートを使用して追加のコントロールを定義する場合は、コントロールの入力を処理するフック プロシージャを指定する必要があります。

[検索または置換] ダイアログ ボックスのフック プロシージャを有効にするには

  1. FINDREPLACE 構造体の Flags メンバーにFR_ENABLEHOOK フラグを設定します。
  2. lpfnHook メンバーにフック プロシージャのアドレスを指定します。

ダイアログ ボックス プロシージャは、 WM_INITDIALOG メッセージを処理した後、 WM_INITDIALOG メッセージをフック プロシージャに送信します。 このメッセージの lParam パラメーターは、ダイアログ ボックスの初期化に使用される FINDREPLACE 構造体へのポインターです。

WM_INITDIALOG メッセージに応答してフック プロシージャが FALSE を返した場合、フック プロシージャに表示されない限り、ダイアログ ボックスは表示されません。 これを行うには、最初に他のペイント操作を実行してから、 ShowWindow 関数と UpdateWindow 関数を呼び出します。 次にコード例を示します。

// 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);