[検索と置換] ダイアログ ボックス
ユーザーが検索する文字列と、ドキュメント内のテキストを検索するときに使用するオプションを指定できるモードレス ダイアログ ボックスを表示します。 [置換] ダイアログ ボックスでは、検索する文字列と置換文字列、および操作を制御するオプションを指定できます。
FINDREPLACE 構造体を初期化し、その構造体を FindText 関数に渡すことで、Find ダイアログ ボックスを作成して表示します。 次の図は、[検索] ダイアログ ボックスの一般的な を示しています。
[検索] ダイアログ ボックス
FINDREPLACE 構造体を初期化し、その構造体を ReplaceText 関数に渡すことで、[置換] ダイアログ ボックスを作成して表示します。 次の図は、一般的な [置換] ダイアログ ボックス 示しています。
他の一般的なダイアログ ボックスとは異なり、検索 と 置換 ダイアログ ボックスはモードレスです。 モードレス ダイアログ ボックスを使用すると、ユーザーはダイアログ ボックスとそれを作成したウィンドウを切り替えることができます。 これは、ユーザーが文字列を検索したり、アプリケーション ウィンドウに切り替えて文字列を操作したり、ダイアログ ボックスを開くために必要なコマンドを繰り返さずにダイアログ ボックスに戻って別の文字列を検索したりするのに便利です。
FindText または ReplaceText関数正常にダイアログ ボックスが作成されると、ダイアログ ボックスにハンドルが返されます。 このハンドルを使用して、ダイアログ ボックスを移動および通信できます。 関数がダイアログ ボックスを作成できない場合は、NULLを返します。 CommDlgExtendedError 関数を呼び出して拡張エラー値を取得することで、エラーの原因を特定できます。
このセクションでは、次のトピックについて説明します。
- FINDMSGSTRING 登録済みメッセージ を する
- 検索または置換ダイアログ ボックスのカスタマイズ
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 メンバーは置換文字列を指定します。 |
次の検索 または Replace All メッセージの場合、Flags メンバーには、検索オプションを示す次のフラグの任意の組み合わせを含めることができます。
旗 | 意味 |
---|---|
FR_DOWN | 設定すると、方向オプション ボタンの [下] ボタンが選択され、ユーザーが現在の場所から文書の末尾まで検索することを示します。 FR_DOWN が設定されていない場合は、[アップ] ボタンが選択されているため、ユーザーはドキュメントの先頭まで検索します。 |
FR_MATCHCASE | 設定すると、[大文字と小文字 ] チェック ボックスがオンになり、ユーザーが検索で大文字と小文字を区別する必要があることを示します。 FR_MATCHCASE が設定されていない場合、検索で大文字と小文字が区別されないように、チェック ボックスはオフになります。 |
FR_WHOLEWORD | 設定すると、[単語全体に一致する] チェック ボックスがオンになります。これは、ユーザーが検索文字列に一致する単語全体のみを検索することを示します。 FR_WHOLEWORD が設定されていない場合、チェック ボックスはオフになるため、検索文字列に一致する単語フラグメントも検索する必要があります。 |
[検索または置換] ダイアログ ボックスのカスタマイズ
[ の検索] ダイアログ ボックスまたは [置換] ダイアログ ボックスをカスタマイズするには、次のいずれかの方法を使用できます。
- ダイアログ ボックスを作成するときに、FINDREPLACE 構造体の値を指定する
- カスタム テンプレートを指定する
- フック プロシージャを指定する
検索 または 置換] ダイアログ ボックスを作成すると、FINDREPLACE 構造体の Flags メンバーにフラグを設定して、検索オプション コントロールを非表示または無効にすることができます。 たとえば、FR_NOMATCHCASE フラグを設定して [大文字と小文字の区別] チェック ボックスを無効にしたり、FR_HIDEMATCHCASE フラグを設定して非表示にしたりすることができます。
アプリケーションに固有の追加のコントロールを含める場合など、[検索] ダイアログ ボックスまたは [置換] ダイアログ ボックスにカスタム テンプレートを指定できます。 FindText 関数と ReplaceText 関数では、既定のテンプレートの代わりにカスタム テンプレートが使用されます。
検索または置換] ダイアログ ボックスのカスタム テンプレートを指定するには
- Findtext.dlg ファイルで指定された既定のテンプレートを変更して、カスタム テンプレートを作成します。 既定の 検索 または 置換 ダイアログ テンプレートで使用されるコントロール識別子は、Dlgs.h ファイルで定義されます。
-
FINDREPLACE 構造体を使用して、次のようにテンプレートを有効にします。
-
カスタム テンプレートがアプリケーションまたはダイナミック リンク ライブラリのリソースである場合は、Flags メンバーでFR_ENABLETEMPLATE フラグを設定します。 hInstance と lpTemplateName 構造体のメンバーを使用して、モジュールとリソース名を識別します。
-又は-
カスタム テンプレートが既にメモリ内にある場合は、FR_ENABLETEMPLATEHANDLE フラグを設定します。 テンプレートを含むメモリ オブジェクトを識別するには、hInstance メンバーを使用します。
-
検索 または 置換ダイアログ ボックスに対して、FRHookProc フック プロシージャ 指定できます。 フック プロシージャは、ダイアログ ボックスに送信されたメッセージを処理できます。 カスタム テンプレートを使用して追加のコントロールを定義する場合は、コントロールの入力を処理するためのフック プロシージャを指定する必要があります。
検索または置換] ダイアログ ボックスのフック プロシージャを有効にするには
- FINDREPLACE 構造体の Flags メンバーにFR_ENABLEHOOK フラグを設定します。
- 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);