共通ダイアログ ボックスのカスタマイズ
一般的なダイアログ ボックスは、標準フォームで使用することも、カスタマイズすることもできます。 ユーザーの観点から見ると、共通ダイアログ ボックスの主な利点は、アプリケーションからアプリケーションへの一貫した外観と機能です。 そのため、アプリケーションに絶対に必要な場合にのみ、共通のダイアログ ボックスをカスタマイズすることが重要です。 それ以外の場合は、一貫した外観と単純なコーディング インターフェイスが失われます。 適切なカスタマイズは、可能な限り多くの元のコントロールをそのまま残します。 ダイアログ ボックスのサイズを大きくするか、ダイアログ ボックスで既に使用可能な領域に新しいコントロールを追加することは、適切なカスタマイズです。 元のコントロールを非表示にする、または元のコントロールの目的の機能を変更することは、あまり適切ではないカスタマイズです。
このセクションでは、共通のダイアログ ボックスをカスタマイズするための次の方法について説明します。
カスタム テンプレート
一般的なダイアログ ボックスには、ダイアログ ボックス内の標準コントロールの番号、種類、位置を定義する既定のテンプレートがあります。 カスタム テンプレートを定義して、ユーザーがアプリケーションに固有の追加のコントロールにアクセスできるようにします。
エクスプローラー スタイルの [開く] ダイアログ ボックスと [名前を付けて保存] ダイアログ ボックスを除くすべての一般的なダイアログ ボックスでは、既定のテンプレートを変更して、既定のテンプレートを置き換えるカスタム テンプレートを作成します。 カスタム テンプレートは、標準コントロールの型と位置、および追加のコントロールを定義します。
既定のダイアログ ボックス テンプレートを変更してカスタム ダイアログ ボックス テンプレートを作成する場合は、追加されたコントロールの識別子が一意であり、標準コントロールの識別子と競合していないことを確認します。 次の表に、一般的なダイアログ ボックスの種類ごとに、既定のテンプレート ファイルとインクルード ファイルの名前を示します。
ダイアログ ボックスの種類 | テンプレート ファイル | インクルード ファイル |
---|---|---|
Color | Color.dlg | ColorDlg.h |
Find | Findtext.dlg | Dlgs.h |
フォント | Font.dlg | Dlgs.h |
開く (複数選択) | Fileopen.dlg | Dlgs.h |
開く (単一選択) | Fileopen.dlg | Dlgs.h |
ページ設定 | Prnsetup.dlg | Dlgs.h |
印刷 | Prnsetup.dlg | Dlgs.h |
印刷設定 (廃止) | Prnsetup.dlg | Dlgs.h |
Replace | Findtext.dlg | Dlgs.h |
カスタム テンプレートを有効にするには、ダイアログ ボックスの対応する構造体の Flags メンバーにフラグを設定する必要があります。 テンプレートがアプリケーションまたはダイナミック リンク ライブラリのリソースである場合は、Flags メンバーに ENABLETEMPLATE フラグを設定し、構造体の hInstance メンバーと lpTemplateName メンバーを使用してモジュールとリソース名を識別します。 テンプレートが既にメモリ内にある場合は、Flags メンバーに ENABLETEMPLATEHANDLE フラグを設定し、hInstance メンバーを使用してテンプレートを含むメモリ オブジェクトを識別します。
ほとんどの場合、ダイアログ ボックスのフック プロシージャを有効にして、カスタム テンプレート内の追加のコントロールの入力をサポートおよび処理する必要もあります。
エクスプローラースタイルの [開く] ダイアログ ボックスと [名前を付けて保存] ダイアログ ボックスでは、既定のテンプレートは変更できません。 代わりに、カスタム テンプレートは、標準ダイアログ ボックスに追加する項目のみを含む子ダイアログ ボックスを定義します。 カスタム テンプレートでは、子ダイアログ ボックス内の標準コントロールのクラスターの場所を指定する静的コントロールを定義することもできます。 詳細については、「エクスプローラー スタイルのカスタム テンプレート」を参照してください。
共通ダイアログ ボックスのフック プロシージャ
共通ダイアログ ボックスごとに、フック プロシージャを有効にして、既定のダイアログ ボックス プロシージャからのメッセージを処理できます。 一般的なダイアログ フック プロシージャには、次の 2 種類があります。
- 最も一般的なダイアログ ボックスで使用される標準フック プロシージャ
- [開く] ダイアログ ボックスと [名前を付けて保存] ダイアログ ボックスでサポートされているエクスプローラー スタイルのフック プロシージャ
一般的なダイアログ ボックスの 1 つに標準のフック プロシージャを指定すると、既定のダイアログ ボックス プロシージャはそのメッセージを次のように処理します。
Message | 処理 |
---|---|
WM_INITDIALOG | 既定のダイアログ ボックス プロシージャは、メッセージをフック プロシージャに渡す前に処理します。 メッセージの lParam パラメーターは、ダイアログの作成時に指定された初期化構造体へのポインターです。 |
その他のすべてのメッセージ | フック プロシージャは、最初にメッセージを受け取ります。 次に、フック プロシージャの戻り値によって、既定のダイアログ プロシージャがメッセージを処理するか、無視するかを決定します。 |
エクスプローラー スタイルの [開く] ダイアログ ボックスと [名前を付けて保存] ダイアログ ボックスでは、フック プロシージャはダイアログ ボックスの標準コントロールを対象としたメッセージを受信しません。 代わりに、ダイアログ ボックスから通知メッセージと、カスタム テンプレートで定義した追加のコントロールのメッセージを受信します。 詳細については、「エクスプローラー スタイルのフック プロシージャ」を参照してください。
フック プロシージャを有効にするには、ダイアログ ボックスの対応する構造体の Flags メンバーに ENABLEHOOK 値を設定します。 ENABLEHOOK フラグが設定されている場合、構造体の lpfnHook メンバーは、フック・プロシージャーのアドレスを指定する必要があります。
次の表は、一般的な各ダイアログ ボックスに提供するフック プロシージャの種類を示しています。
ダイアログ ボックスの種類 | フック プロシージャ |
---|---|
Color | CCHookProc |
検索 または 置換 | FRHookProc |
フォント | CFHookProc |
[名前を付けて開く] または [名前を付けて保存] (エクスプローラー スタイル) | OFNHookProc |
[名前を付けて開く] または [名前を付けて保存] (古いスタイル) | OFNHookProcOldStyle |
印刷 | PrintHookProc |
ページ設定 | PageSetupHook |
[ ページ設定] ダイアログ ボックスでは、 PagePaintHook フック プロシージャを指定することもできます。 これは、[ ページ設定 ] ダイアログ ボックスで表示されるサンプル ページの外観をカスタマイズするために使用できる特別なフック プロシージャです。
注意
[ 印刷設定] ダイアログ ボックスは、[ ページ設定 ] ダイアログ ボックスに置き換わりました。 アプリケーションでは、[ ページ設定] ダイアログ ボックスを使用する必要があります。 ただし、互換性のために、 PrintDlg 関数は引き続き [ 印刷設定] ダイアログ ボックスの表示をサポートします。 [印刷設定] ダイアログ ボックスに SetupHookProc フック プロシージャを 指定 できます。
共通ダイアログ メッセージ
一般的なダイアログ ボックスでは、メッセージを使用して、特定のイベントが発生したときにウィンドウ プロシージャまたはフック プロシージャに通知します。 また、情報を取得したり、ダイアログ ボックスの動作や外観を制御したりするために、共通のダイアログ ボックスに送信できるメッセージもあります。 ここでは、RegisterWindowMessage 関数によって登録される一般的なダイアログ メッセージ、[フォント] ダイアログ ボックスと [ページ設定] ダイアログ ボックスで使用されるメッセージ、および エクスプローラー スタイルの [開く] ダイアログ ボックスと [名前を付けて保存] ダイアログ ボックスで使用されるメッセージについて説明します。
共通ダイアログ ボックス ライブラリは、メッセージ文字列のセットを定義します。 これらのメッセージ文字列のいずれかに関連付けられている定数を RegisterWindowMessage に渡して、メッセージ識別子を取得できます。 その後、識別子を使用して、共通のダイアログ ボックスから送信されたメッセージを検出して処理したり、共通のダイアログ ボックスにメッセージを送信したりできます。 次の表は、メッセージ定数とその使用方法を示しています。
連続体 | 用途 |
---|---|
COLOROKSTRING | [色] ダイアログ ボックスは、ユーザーが色を選択して [OK] ボタンをクリックすると、フック プロシージャにこのメッセージを送信します。 フック プロシージャは、色を受け入れるか、拒否してダイアログ ボックスを強制的に開いたままにすることができます。 |
FILEOKSTRING | [ 開く ] または [名前を付けて保存 ] ダイアログ ボックスは、ユーザーがファイル名を選択して [OK] ボタンをクリックすると、フック プロシージャにこのメッセージを送信します。 フック プロシージャは、ファイル名を受け入れるか、拒否してダイアログ ボックスを強制的に開いたままにすることができます。 エクスプローラー スタイルの [名前を付けて開く] ダイアログ ボックスと [名前を付けて保存] ダイアログ ボックスの場合、このメッセージはCDN_FILEOK通知メッセージに置き換えられます。 |
FINDMSGSTRING | [ 検索 ] または [置換 ] ダイアログ ボックスは、ユーザーが [ 次の検索]、[ 置換]、または [ すべて置換] をクリックするか、ダイアログ ボックスを閉じると、親ウィンドウのウィンドウ プロシージャにこのメッセージを送信します。 メッセージの lParam パラメーターは、ユーザーの入力を含む FINDREPLACE 構造体へのポインターです。 |
HELPMSGSTRING | すべての一般的なダイアログ ボックスは、ユーザーが [ヘルプ ] ボタンをクリックすると、親ウィンドウのウィンドウ プロシージャにこのメッセージを送信します。 エクスプローラー スタイルの [開く] ダイアログ ボックスと [名前を付けて保存] ダイアログ ボックスの場合、このメッセージはCDN_HELP通知メッセージに置き換えられます。 |
LBSELCHSTRING | ユーザーが [ファイル名] リスト ボックスで選択内容を変更すると、[開く] または [名前を付けて保存] ダイアログ ボックスからフック プロシージャにこのメッセージが送信されます。 エクスプローラー スタイルの [名前を付けて開く] ダイアログ ボックスと [名前を付けて保存] ダイアログ ボックスの場合、このメッセージはCDN_SELCHANGE通知メッセージに置き換えられます。 |
SETRGBSTRING | フック プロシージャは、このメッセージを [色 ] ダイアログ ボックスに送信して、現在の色の選択を設定できます。 |
SHAREVISTRING | [ 開く ] または [名前を付けて保存 ] ダイアログ ボックスは、ユーザーが [OK] ボタンをクリックしたときに、選択したファイルに対して共有違反が発生した場合に、このメッセージをフック プロシージャに送信します。 エクスプローラースタイルの [名前を付けて開く] ダイアログ ボックスと [名前を付けて保存] ダイアログ ボックスの場合、このメッセージはCDN_SHAREVIOLATION通知メッセージに置き換えられます。 |
一部の一般的なダイアログ ボックスでは、他のウィンドウ メッセージを送受信します。 [フォント] ダイアログ ボックスのフック プロシージャは、任意のWM_CHOOSEFONT_* メッセージを [フォント] ダイアログ ボックスに送信できます。 詳細については、「 フォント ダイアログ ボックス」を参照してください。 PagePaintHook フック プロシージャを有効にしている場合は、[ページ設定] ダイアログ ボックスから WM_PSD_* メッセージが送信されます。 詳細については、「 [ページ設定] ダイアログ ボックス」を参照してください。
エクスプローラー スタイルの [名前を付けて開く] ダイアログ ボックスと [名前を付けて保存] ダイアログ ボックスでは、定義済みのメッセージのセットがサポートされています。 これには、フック プロシージャに WM_NOTIFY メッセージの形式で送信される通知メッセージや、フック プロシージャがダイアログ ボックスに送信できるメッセージが含まれます。 これらのメッセージの完全な一覧については、「エクスプローラー スタイルのフック プロシージャ」を参照してください。
ヘルプ サポート
一般的なダイアログ ボックスは、ダイアログ ボックスの標準コントロールに状況依存のヘルプを提供します。 共通ダイアログ ボックスの追加のヘルプを提供するには、[ ヘルプ ] ボタンを表示し、ユーザーがボタンをクリックしたときに生成されたメッセージを処理できます。 [ ヘルプ ] ボタンは、状況依存の既定のヘルプの補足です。 [ ヘルプ ] ボタンは、アプリケーションに適用されるダイアログ ボックスの一般的な目的を説明するのに役立ちます。
Context-Sensitive ヘルプ
すべての一般的なダイアログ ボックスは、ダイアログ ボックスの標準コントロールに状況依存のヘルプを提供します。 ユーザーは、次のいずれかの方法で個々のコントロールのヘルプを表示できます。
- コントロールを選択し、F1 キーを押します。
- タイトル バーの [? ] ボタンをクリックし、その後コントロールをクリックします。
- コントロールの上でマウスの右ボタンをクリックします。
新しいコントロールを追加してダイアログ ボックスをカスタマイズする場合は、フック プロシージャでヘルプの要求を処理することで、これらのコントロールのヘルプ サポートも拡張する必要があります。 ユーザーがヘルプを要求すると、フック プロシージャは次のメッセージを受け取ります。
ユーザー アクション | Message |
---|---|
コントロールの上にあるマウスの右ボタンをクリックします。 | WM_CONTEXTMENU |
F1 キーを押しました。 | Wm_help |
タイトル バーの [? ] ボタンをクリックし、コントロールをクリックしました。 | Wm_help |
追加したコントロールに対してこれらのメッセージを処理する必要がありますが、既定のダイアログ ボックス プロシージャで標準コントロールのメッセージを処理します。 これらのメッセージを処理する方法の詳細については、「 ヘルプ」を参照してください。
[ヘルプ] ボタン
ダイアログ ボックスの初期化構造の Flags メンバーに SHOWHELP 値を設定することで、一般的なダイアログ ボックスのいずれかに [ヘルプ] ボタンを表示できます。 [ヘルプ] ボタンを表示する場合は、ユーザーのヘルプ要求を処理する必要があります。 処理は、アプリケーションのいずれかのウィンドウ プロシージャまたはダイアログ ボックスのフック プロシージャで実行できます。 通常、 WinHelp 関数を呼び出すことによって、ヘルプの要求を処理します。
いずれかのウィンドウ プロシージャでヘルプ メッセージを処理するには、 HELPMSGSTRING 値で定義された文字列のメッセージ識別子を取得し、メッセージを受信するウィンドウを識別する必要があります。 メッセージ識別子を取得するには、RegisterWindowMessage 関数の呼び出しでパラメーターとして HELPMSGSTRING を指定します。 ダイアログ ボックスを作成するときは、ダイアログ ボックス初期化構造体の hwndOwner メンバーを使用して、メッセージを受信するウィンドウを識別します。 ダイアログ ボックス プロシージャは、ユーザーが [ヘルプ ] ボタンをクリックするたびに、ウィンドウ プロシージャにメッセージを送信します。
フック プロシージャでヘルプ メッセージを処理するには、 WM_COMMAND メッセージを処理する必要があります。 このメッセージの wParam パラメーターがユーザーが [ヘルプ] ボタンをクリックしたことを示している場合、フック プロシージャは ヘルプ を提供します。 [ヘルプ] ボタンの識別子は、Dlgs.h ファイルで定義されている pshHelp 定数です。
エクスプローラー スタイルの [名前を付けて開く] ダイアログ ボックスと [名前を付けて保存] ダイアログ ボックスのフック プロシージャは、[ヘルプ] ボタンのWM_COMMANDメッセージを受け取りません。 代わりに、[ヘルプ] ボタンがクリックされたときに、ダイアログ ボックスからフック プロシージャにCDN_HELP通知メッセージが送信されます。