次の方法で共有


共通ダイアログ ボックスのカスタマイズ

一般的なダイアログ ボックスは、標準フォームで使用することも、カスタマイズすることもできます。 ユーザーの観点から見ると、共通ダイアログ ボックスの主な利点は、アプリケーションからアプリケーションへの一貫した外観と機能です。 そのため、アプリケーションに絶対に必要な場合にのみ、共通のダイアログ ボックスをカスタマイズすることが重要です。 それ以外の場合は、一貫した外観と単純なコーディング インターフェイスが失われます。 適切なカスタマイズは、可能な限り多くの元のコントロールをそのまま残します。 ダイアログ ボックスのサイズを大きくするか、ダイアログ ボックスで既に使用可能な領域に新しいコントロールを追加することは、適切なカスタマイズです。 元のコントロールを非表示にする、または元のコントロールの目的の機能を変更することは、あまり適切ではないカスタマイズです。

このセクションでは、共通のダイアログ ボックスをカスタマイズするための次の方法について説明します。

カスタム テンプレート

一般的なダイアログ ボックスには、ダイアログ ボックス内の標準コントロールの番号、種類、位置を定義する既定のテンプレートがあります。 カスタム テンプレートを定義して、ユーザーがアプリケーションに固有の追加のコントロールにアクセスできるようにします。

エクスプローラー スタイルの [開く] ダイアログ ボックスと [名前を付けて保存] ダイアログ ボックスを除くすべての一般的なダイアログ ボックスでは、既定のテンプレートを変更して、既定のテンプレートを置き換えるカスタム テンプレートを作成します。 カスタム テンプレートは、標準コントロールの型と位置、および追加のコントロールを定義します。

既定のダイアログ ボックス テンプレートを変更してカスタム ダイアログ ボックス テンプレートを作成する場合は、追加されたコントロールの識別子が一意であり、標準コントロールの識別子と競合していないことを確認します。 次の表に、一般的なダイアログ ボックスの種類ごとに、既定のテンプレート ファイルとインクルード ファイルの名前を示します。

ダイアログ ボックスの種類 テンプレート ファイル インクルード ファイル
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通知メッセージが送信されます。