ダイアログ ボックスのプログラミングに関する考慮事項

この概要では、ダイアログ ボックスに関するプログラミング上の考慮事項について説明します。

概要には、次のトピックが含まれています。

ダイアログ ボックスの手順

ダイアログ ボックス プロシージャは、実行する情報やタスクがある場合に、システムがプロシージャにメッセージを送信するという点で、ウィンドウ プロシージャに似ています。ウィンドウ プロシージャとは異なり、ダイアログ ボックス プロシージャは DefWindowProc 関数を呼び出しません。 代わりに、メッセージを処理する場合は TRUE を 返し、処理しない場合は FALSE を 返します。

すべてのダイアログ ボックス プロシージャには、次の形式があります。

BOOL CALLBACK DlgProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    switch (message) 
    { 
 
        // Place message cases here. 
 
        default: 
            return FALSE; 
    } 
}

プロシージャ パラメーターは、ダイアログ ボックスのウィンドウ ハンドルを受け取る hwndDlg パラメーターを使用して、ウィンドウ プロシージャと同じ目的を果たします。

ほとんどのダイアログ ボックス プロシージャは 、WM_INITDIALOG メッセージと、コントロールによって送信された WM_COMMAND メッセージを処理しますが、他のメッセージがある場合は、ほとんど処理しません。 ダイアログ ボックス プロシージャがメッセージを処理しない場合は、システムにメッセージを内部的に処理するように指示するために FALSE を 返す必要があります。 このルールの唯一の例外は 、WM_INITDIALOG メッセージです。 ダイアログ ボックス プロシージャは、WM_INITDIALOG メッセージをさらに処理するようにシステムに指示するために TRUE を返す必要があります。 いずれの場合も、プロシージャは DefWindowProc を呼び出してはなりません。

WM_INITDIALOG メッセージ

システムは、ダイアログ ボックス プロシージャ にWM_CREATE メッセージを送信しません。 代わりに、ダイアログ ボックスとそのすべてのコントロールを作成するときに、ダイアログ ボックスを表示する前に、 WM_INITDIALOG メッセージを送信します。 この手順では、ダイアログ ボックスにタスクに関連付けられている現在の設定が表示されるようにするために必要な初期化を実行する必要があります。 たとえば、ダイアログ ボックスに現在のドライブとディレクトリを表示するコントロールが含まれている場合、プロシージャは現在のドライブとディレクトリを決定し、コントロールをその値に設定する必要があります。

プロシージャは、 SetDlgItemTextCheckDlgButton などの関数を使用してコントロールを初期化できます。 コントロールはウィンドウであるため、 プロシージャは EnableWindowSetFocus などのウィンドウ管理機能を使用して操作することもできます。 プロシージャは、 GetDlgItem 関数を使用してコントロールへのウィンドウ ハンドルを取得できます。

ダイアログ ボックス プロシージャでは、必要に応じて、コントロールの内容、状態、位置を変更できます。 たとえば、ファイル名のリスト ボックスと [開く ] ボタンを含むダイアログ ボックスでは、ユーザーがリストからファイルを選択するまで、[ 開く ] ボタンを無効にすることができます。 この例では、ダイアログ ボックス テンプレートによって [開く] ボタンのWS_DISABLED スタイルが指定され、ボタンの作成時にシステムによって自動的に無効になります。 ダイアログ ボックス プロシージャは、ユーザーがファイルを選択したことを示す通知メッセージをリスト ボックスから受信すると、 EnableWindow 関数を呼び出して [開く ] ボタンを有効にします。

ダイアログ ボックスのキャプション バーにカスタム アイコンを表示するために、WM_INITDIALOG ハンドラーはWM_SETICON メッセージをダイアログ ボックスに送信できます。

アプリケーションが、DialogBoxParam、DialogBoxIndirectParamCreateDialogParam、または CreateDialogIndirectParam のいずれかの関数を使用してダイアログ ボックスを作成する場合、WM_INITDIALOG メッセージの lParam パラメーターには、関数に渡される追加のパラメーターが含まれます。 通常、アプリケーションでは、この追加のパラメーターを使用して、ダイアログ ボックス プロシージャに追加の初期化情報へのポインターを渡しますが、ダイアログ ボックス プロシージャはパラメーターの意味を決定する必要があります。 アプリケーションが別の関数を使用してダイアログ ボックスを作成する場合、システムは lParam パラメーターを NULL に設定します。

WM_INITDIALOG メッセージから戻る前に、プロシージャは入力フォーカスを指定したコントロールに設定する必要があるかどうかを判断する必要があります。 ダイアログ ボックス プロシージャが TRUE を返す場合、ウィンドウ ハンドルが wParam パラメーターにあるコントロールに入力フォーカスが自動的に設定されます。 既定のフォーカスを受け取るコントロールが適切でない場合は、 SetFocus 関数を使用して適切なコントロールにフォーカスを設定できます。 プロシージャが入力フォーカスを設定する場合は、システムが既定のフォーカスを設定できないように FALSE を 返す必要があります。 既定の入力フォーカスを受け取るコントロールは、常にテンプレートで指定された最初のコントロールであり、表示され、無効ではなく、 WS_TABSTOP スタイルを持っています。 このようなコントロールが存在しない場合、システムは既定の入力フォーカスをテンプレートの最初のコントロールに設定します。

WM_COMMAND メッセージ

コントロールは、 ユーザーがコントロール でアクションを実行するときに、WM_COMMAND メッセージをダイアログ ボックス プロシージャに送信できます。 通知メッセージと呼ばれるこれらのメッセージは、ユーザー入力の手順を通知し、適切な応答を実行できるようにします。

静的コントロールを除くすべての定義済みコントロールは、選択したユーザー アクションの通知メッセージを送信します。 たとえば、プッシュ ボタンは、ユーザーがボタンをクリックするたびに BN_CLICKED 通知メッセージを送信します。 いずれの場合も、 wParam パラメーターの下位ワードにはコントロール識別子が含まれ、 wParam の上位ワードには通知コードが含まれ、 lParam パラメーターにはコントロール ウィンドウ ハンドルが含まれます。

ダイアログ ボックスの手順では、通知メッセージを監視して処理する必要があります。 特に、プロシージャは IDOK または IDCANCEL 識別子を持つメッセージを処理する必要があります。これらのメッセージは、ユーザーがダイアログ ボックスを閉じる要求を表します。 プロシージャは、モーダル ダイアログ ボックスの EndDialog 関数とモードレス ダイアログ ボックスの DestroyWindow 関数を使用して、ダイアログ ボックスを閉じる必要があります。

また、ダイアログ ボックスにウィンドウ メニューなどのメニューがあり、ユーザーがメニュー項目をクリックすると、ダイアログ ボックス プロシージャにWM_COMMANDメッセージも送信されます。 特に、ユーザーがダイアログ ボックスのウィンドウ メニューで [閉じる] をクリックするたびに、wParam パラメーターが IDCANCEL に設定されたWM_COMMAND メッセージが送信されます。 メッセージは、[ キャンセル] ボタンによって送信された通知メッセージとほぼ同じであり、まったく同じ方法で処理する必要があります。

WM_PARENTNOTIFY メッセージ

コントロールをポイントしながらユーザーがマウス ボタンを押すたびに、コントロールから WM_PARENTNOTIFY メッセージが送信されます。 一部のアプリケーションでは、コントロールの目的を説明するテキスト行の表示など、コントロールに関連するアクションを実行するためのシグナルとしてこのメッセージを解釈します。

また、ダイアログ ボックス テンプレートから作成 された コントロールに対してではなく、ウィンドウを作成および破棄するときに、WM_PARENTNOTIFYメッセージも送信されます。 システムは、コントロールの作成時に WS_EX_NOPARENTNOTIFY スタイルを指定することで、これらのメッセージを防止します。 アプリケーションは、ダイアログ ボックス用に独自のコントロールを作成しない限り、この既定の動作をオーバーライドできません。

Control-Color メッセージ

コントロールとシステムは、特定のブラシと色を使用して、コントロールまたは他のウィンドウの背景を描画するダイアログ ボックス プロシージャが必要な場合に、コントロールカラー メッセージを送信できます。 これは、アプリケーションがダイアログ ボックスとそのコントロールで使用される既定の色をオーバーライドする場合に便利です。 WM_CTLCOLOR メッセージを置き換えたコントロールカラー メッセージを次に示します。

コントロールは、独自の背景を描画する直前に、ダイアログ ボックス プロシージャにコントロールカラー メッセージを送信します。 メッセージを使用すると、プロシージャで使用するブラシを指定し、背景色と前景色を設定できます。 プロシージャは、ブラシ ハンドルを返すことによってブラシを指定します。 背景色と前景色を設定するには、コントロールの表示デバイス コンテキストと共に SetBkColor 関数と SetTextColor 関数を使用します。 コントロール カラー メッセージは、メッセージの wParam パラメーター内のプロシージャに、ディスプレイ デバイス コンテキストへのハンドルを渡します。

プロシージャが WM_ERASEBKGND メッセージを処理しない場合、システムはダイアログ ボックス プロシージャに WM_CTLCOLORDLG メッセージを送信します。 定義済みのダイアログ ボックス クラスにはクラスの背景ブラシがないため、このメッセージでは、作業を実行するコードを含めなくても、プロシージャが独自の背景を定義できます。

いずれの場合も、ダイアログ ボックス プロシージャがコントロールカラー メッセージを処理しない場合、システムは既定のウィンドウ色のブラシを使用して、スクロール バーを除くすべてのコントロールとウィンドウの背景を描画します。 アプリケーションは、 COLOR_WINDOW 値を GetSysColor 関数に渡すことで、既定のウィンドウの色を取得できます。 背景が描画されている間、ディスプレイ デバイス コンテキストの前景色は既定のテキストの色 (COLOR_WINDOWTEXT) に設定されます。 スクロール バーの場合、既定のスクロール バーの色 (COLOR_SCROLLBAR) を持つブラシが使用されます。 この場合、ディスプレイ デバイス コンテキストの背景色と前景色はそれぞれ白と黒に設定されます。

ダイアログ ボックスの既定のメッセージ処理

定義済みのダイアログ ボックス クラスのウィンドウ プロシージャは、ダイアログ ボックス プロシージャが処理しないすべてのメッセージに対して既定の処理を実行します。 ダイアログ ボックス プロシージャがメッセージに対して FALSE を 返すと、定義済みのウィンドウ プロシージャによってメッセージがチェックされ、次の既定のアクションが実行されます。

Message 既定の動作
DM_GETDEFID このメッセージは、ダイアログ ボックスに送信できます。 ダイアログ ボックスに既定のプッシュ ボタンがある場合、ダイアログ ボックスはコントロール識別子を返します。それ以外の場合は、0 を返します。
DM_REPOSITION このメッセージは、最上位のダイアログ ボックスに送信できます。 ダイアログ ボックスは、デスクトップ領域内に収まるように、それ自体の位置を変更します。
DM_SETDEFID このメッセージは、ダイアログ ボックスに送信できます。 ダイアログ ボックスは、既定のプッシュ ボタンを 、wParam パラメーターのコントロール識別子で指定されたコントロールに設定します。
WM_ACTIVATE ダイアログ ボックスがアクティブ化されている場合は、以前に保存したハンドルによって識別されるコントロールに入力フォーカスを復元します。 それ以外の場合、プロシージャは入力フォーカスを持つコントロールにハンドルを保存します。
WM_CHARTOITEM ゼロを返します。
WM_CLOSE IDCANCEL をコントロール識別子として指定して、BN_CLICKED通知メッセージをダイアログ ボックスに投稿します。 ダイアログ ボックスに IDCANCEL コントロール識別子があり、コントロールが現在無効になっている場合、プロシージャは警告を鳴らし、メッセージを投稿しません。
WM_COMPAREITEM ゼロを返します。
WM_ERASEBKGND WM_CTLCOLORDLG メッセージから返されたブラシまたは既定のウィンドウの色を使用して、ダイアログ ボックスのクライアント領域を塗りつぶします。
WM_GETFONT アプリケーション定義のダイアログ ボックスフォントへのハンドルを返します。
WM_INITDIALOG ゼロを返します。
WM_LBUTTONDOWN 入力フォーカスを持つコンボ ボックスに CB_SHOWDROPDOWN メッセージを送信し、ドロップダウン リスト ボックスを非表示にするようにコントロールに指示します。 プロシージャは DefWindowProc を 呼び出して、既定のアクションを完了します。
WM_NCDESTROY ダイアログ ボックスの編集コントロールに割り当てられたグローバル メモリを解放し ( DS_LOCALEDIT スタイルを指定するダイアログ ボックスに適用されます)、アプリケーション定義フォント ( DS_SETFONT または DS_SHELLFONT スタイルを指定するダイアログ ボックスに適用) を解放します。 プロシージャは DefWindowProc 関数を呼び出して、既定のアクションを完了します。
WM_NCLBUTTONDOWN 入力フォーカスを持つコンボ ボックスに CB_SHOWDROPDOWN メッセージを送信し、ドロップダウン リスト ボックスを非表示にするようにコントロールに指示します。 プロシージャは DefWindowProc を 呼び出して、既定のアクションを完了します。
WM_NEXTDLGCTL 入力フォーカスを、ダイアログ ボックス内の次または前のコントロール、 wParam パラメーターのハンドルによって識別されるコントロール、またはダイアログ ボックスの最初のコントロール (表示、無効、 WS_TABSTOP スタイル) に設定します。 入力フォーカスを持つ現在のウィンドウがコントロールでない場合、プロシージャはこのメッセージを無視します。
WM_SETFOCUS 以前に保存したコントロール ウィンドウ ハンドルによって識別されるコントロールに入力フォーカスを設定します。 このようなハンドルが存在しない場合、プロシージャは入力フォーカスをダイアログ ボックス テンプレート内の最初のコントロールに設定します。このコントロールは表示され、無効ではなく、 WS_TABSTOP スタイルです。 このようなコントロールが存在しない場合、プロシージャは入力フォーカスをテンプレートの最初のコントロールに設定します。
WM_SHOWWINDOW ダイアログ ボックスが非表示になっている場合は、入力フォーカスを持つコントロールへのハンドルを保存し、 DefWindowProc を呼び出して既定のアクションを完了します。
WM_SYSCOMMAND ダイアログ ボックスが最小化されている場合は、入力フォーカスを持つコントロールへのハンドルを保存し、 DefWindowProc を呼び出して既定のアクションを完了します。
WM_VKEYTOITEM ゼロを返します。

定義済みのウィンドウ プロシージャは、既定の処理のために他のすべてのメッセージを DefWindowProc に渡します。

ダイアログ ボックスのキーボード インターフェイス

システムは、いくつかのキーに対して特別な処理を実行するダイアログ ボックス用の特別なキーボード インターフェイスを提供します。 インターフェイスは、ダイアログ ボックス内の特定のボタンに対応するメッセージを生成するか、入力フォーカスをあるコントロールから別のコントロールに変更します。 このインターフェイスで使用されるキーと、それぞれのアクションを次に示します。

Key アクション
Alt + ニーモニック 指定したニーモニックを含む静的コントロールの後の最初のコントロール ( WS_TABSTOP スタイルを持つ) に入力フォーカスを移動します。
DOWN 入力フォーカスをグループ内の次のコントロールに移動します。
Enter ダイアログ ボックス のプロシージャ にWM_COMMAND メッセージを送信します。 wParam パラメーターは、既定のプッシュ ボタンの IDOK またはコントロール識別子に設定されます。
Esc ダイアログ ボックス のプロシージャ にWM_COMMAND メッセージを送信します。 wParam パラメーターは IDCANCEL に設定されています。
LEFT 入力フォーカスをグループ内の前のコントロールに移動します。
ニーモニック 指定したニーモニックを含む静的コントロールの後の最初のコントロール ( WS_TABSTOP スタイルを持つ) に入力フォーカスを移動します。
RIGHT 入力フォーカスをグループ内の次のコントロールに移動します。
Shift + Tab 入力フォーカスを、 WS_TABSTOP スタイルの前のコントロールに移動します。
Tab 入力フォーカスを、 WS_TABSTOP スタイルを持つ次のコントロールに移動します。
UP 入力フォーカスをグループ内の前のコントロールに移動します。

システムは、すべてのモーダル ダイアログ ボックスにキーボード インターフェイスを自動的に提供します。 アプリケーションが IsDialogMessage 関数を呼び出してメッセージ ループ内のメッセージをフィルター処理しない限り、モードレス ダイアログ ボックスのインターフェイスメイン提供されません。 つまり、アプリケーションは、メッセージ キューからメッセージを取得した直後に 、メッセージを IsDialogMessage に渡す必要があります。 この関数は、ダイアログ ボックス用のメッセージの場合はメッセージを処理し、メッセージが処理され、 TranslateMessage 関数または DispatchMessage 関数に渡してはならないことを示す 0 以外の値を返します。

ダイアログ ボックスのキーボード インターフェイスでは方向キーを使用してダイアログ ボックス内のコントロール間を移動するため、アプリケーションでは、これらのキーを使用して、 IsDialogMessage が呼び出されたモーダル ダイアログ ボックスまたはモードレス ダイアログ ボックスの内容をスクロールすることはできません。 ダイアログ ボックスにスクロール バーがある場合、アプリケーションはスクロール バー用の代替キーボード インターフェイスを提供する必要があります。 スクロール用のマウス インターフェイスは、システムにマウスが含まれている場合に使用できます。

WS_TABSTOP スタイル

WS_TABSTOP スタイルでは、Tab キーまたは Shift + Tab キーを押してユーザーが移動できるコントロールを指定します。

ユーザーが Tab キーまたは Shift キーを押しながら Tab キーを押すと、最初に、入力フォーカスが設定されているコントロールによってこれらのキーが処理されるかどうかを判断します。 コントロールに WM_GETDLGCODE メッセージを送信し、コントロールがDLGC_WANTTABを返すと、システムはコントロールにキーを渡します。 それ以外の場合、システムは GetNextDlgTabItem 関数を使用して、表示され、無効ではなく、 WS_TABSTOP スタイルを持つ次のコントロールを検索します。 検索は、現在入力フォーカスを持つコントロールから始まり、コントロールが作成された順序 (つまり、ダイアログ ボックス テンプレートで定義されている順序) で進みます。 システムが必要な特性を持つコントロールを見つけると、入力フォーカスがそれに移動します。

WS_TABSTOP スタイルの次のコントロールを検索すると、WS_EX_CONTROLPARENT スタイルのウィンドウが検出された場合、システムはウィンドウの子を再帰的に検索します。

アプリケーションでは 、GetNextDlgTabItem を 使用して 、WS_TABSTOP スタイルを持つコントロールを検索することもできます。 関数は、入力フォーカスを移動せずに 、WS_TABSTOP スタイルを持つ次または前のコントロールのウィンドウ ハンドルを取得します。

WS_GROUP スタイル

既定では、ユーザーが方向キーを押すたびに、入力フォーカスが次または前のコントロールに移動されます。 入力フォーカスを持つ現在のコントロールがこれらのキーを処理せず、次または前のコントロールが静的コントロールでない限り、ユーザーが方向キーを押し続ける間、システムはダイアログ ボックス内のすべてのコントロールに入力フォーカスを移動し続けます。

アプリケーションでは、 WS_GROUP スタイルを使用して、この既定の動作を変更できます。 スタイルは、コントロールのグループの先頭をマークします。 ユーザーが方向キーの押し始め時にグループ内のコントロールに入力フォーカスがある場合、フォーカスはグループ内に残ります。 一般に、グループ内の最初のコントロールには WS_GROUP スタイルが必要であり、グループ内の他のすべてのコントロールにはこのスタイルを含めてはなりません。 グループ内のすべてのコントロールは連続している必要があります。つまり、介在するコントロールなしで連続して作成されている必要があります。

ユーザーが方向キーを押すと、システムは最初に、入力フォーカスを持つ現在のコントロールが方向キーを処理するかどうかを判断します。 システムは WM_GETDLGCODE メッセージをコントロールに送信し、コントロールが DLGC_WANTARROWS 値を返す場合は、コントロールにキーを渡します。 それ以外の場合、システムは GetNextDlgGroupItem 関数を使用して、グループ内の次のコントロールを決定します。

GetNextDlgGroupItem は、作成された順序 (または逆順) でコントロールを検索します。 ユーザーが RIGHT キーまたは DOWN キーを押すと、そのコントロールにWS_GROUPスタイルがない場合、GetNextDlgGroupItem は次のコントロールを返します。 それ以外の場合、関数は検索の順序を逆にし、WS_GROUP スタイルを持つ最初のコントロール 返します。 ユーザーが LEFT キーまたは UP キーを押すと、現在のコントロールに 既にWS_GROUP スタイルがない限り、関数は前のコントロールを返します。 現在のコントロールにこのスタイルがある場合、関数は検索の順序を逆にし、 WS_GROUP スタイルを持つ最初のコントロールを検索し、配置されたコントロールのすぐ前にあるコントロールを返します。

グループ内の次のコントロールを検索すると、 WS_EX_CONTROLPARENT スタイルのウィンドウが検出された場合、システムはウィンドウの子を再帰的に検索します。

システムは、次のコントロールまたは前のコントロールを取得した後、 WM_GETDLGCODE メッセージをコントロールに送信して、コントロールの種類を決定します。 その後、システムは入力フォーカスを移動して、静的コントロールでない場合は制御します。 コントロールが自動ラジオ ボタンの場合、システムは BM_CLICK メッセージを送信します。 アプリケーションでは 、GetNextDlgGroupItem を 使用してグループ内のコントロールを検索することもできます。

一般に、グループ内の最初のコントロールは 、WS_GROUP スタイルと WS_TABSTOP スタイルを組み合わせて、ユーザーが TAB キーを使用してグループ間を移動できるようにします。 グループにラジオ ボタンが含まれている場合、アプリケーションはグループ内の最初のコントロールにのみ WS_TABSTOP スタイルを適用する必要があります。 ユーザーがグループ内のコントロール間を移動すると、スタイルが自動的に移動されます。 これにより、ユーザーが TAB キーを使用してグループに移動したときに、入力フォーカスが常に最後に選択されたコントロールに移動します。

ニーモニック

ニーモニックは、ボタンのラベルまたは静的コントロールのテキストで選択された文字または数字です。 ユーザーがニーモニックに対応するキーを押すか、このキーと Alt キーを組み合わせて押すたびに、入力フォーカスがニーモニックに関連付けられているコントロールに移動します。 ニーモニックは、ユーザーがキーボードを使用して指定したコントロールにすばやく移動する方法を提供します。

アプリケーションは、コントロールのラベルまたはテキストに、選択した文字または数字の直前にアンパサンド (&) を挿入することで、コントロールのニーモニックを作成します。 ほとんどの場合、ダイアログ ボックス テンプレートの コントロールに null で終わる文字列にはアンパサンドが含まれています。 ただし、アプリケーションでは 、SetDlgItemText 関数を使用してコントロールの既存のラベルまたはテキストを置き換えることで、いつでもニーモニックを作成できます。 コントロールごとに指定できるニーモニックは 1 つだけです。 推奨されますが、ダイアログ ボックス内のニーモニックは一意である必要はありません。

ユーザーが文字または数字キーを押すと、システムは最初に、入力フォーカスを持つ現在のコントロールがキーを処理するかどうかを判断します。 システムは WM_GETDLGCODE メッセージをコントロールに送信し、コントロールが DLGC_WANTALLKEYS または DLG_WANTMESSAGE 値を返す場合、システムはキーをコントロールに渡します。 それ以外の場合は、ニーモニックが指定した文字または数字と一致するコントロールを検索します。 コントロールが見つかるまで、またはすべてのコントロールを調べるまで、検索を続けます。 検索中に、 SS_NOPREFIX スタイルを持つ静的コントロールはすべてスキップされます。

一致するニーモニックを持つコントロールを検索すると、 WS_EX_CONTROLPARENT スタイルのウィンドウが検出された場合、システムはウィンドウの子を再帰的に検索します。

システムが静的コントロールを見つけ、コントロールが無効でない場合、システムは、表示、無効、 およびWS_TABSTOP スタイルを持つ静的コントロールの後の最初のコントロールに入力フォーカスを移動します。 システムは、一致するニーモニックを持つ他のコントロールを見つけた場合、入力フォーカスをそのコントロールに移動します。 コントロールが既定のプッシュ ボタンの場合、システムはダイアログ ボックス プロシージャ にBN_CLICKED 通知メッセージを送信します。 コントロールが別のスタイルのボタンであり、ダイアログ ボックスに同じニーモニックを持つ他のコントロールがない場合は、 BM_CLICK メッセージがコントロールに送信されます。

ダイアログ ボックスの設定

ダイアログ ボックスの設定は、ダイアログ ボックスのコントロールの現在の選択と値です。 ダイアログ ボックスのプロシージャは、ダイアログ ボックスの作成時にこれらの設定にコントロールを初期化する役割を担います。 また、ダイアログ ボックスを破棄する前に、コントロールから現在の設定を取得する必要もあります。 設定の初期化と取得に使用されるメソッドは、コントロールの種類によって異なります。

詳細については、次のトピックを参照してください。

ラジオ ボタンとチェック ボックス

ダイアログ ボックスでは、ラジオ ボタンとチェック ボックスを使用して、ユーザーがオプションの一覧から選択できるようにします。 ラジオ ボタンを使用すると、ユーザーは相互に排他的なオプションから選択できます。チェックボックスを使用すると、ユーザーはオプションの組み合わせを選択できます。

ダイアログ ボックス プロシージャでは、チェック ボックスを設定またはクリアする CheckDlgButton 関数を使用して、チェック ボックスの初期状態を設定できます。 相互に排他的なラジオ ボタンのグループ内のラジオ ボタンの場合、ダイアログ ボックスの手順では 、CheckRadioButton 関数を使用して適切なラジオ ボタンを設定し、他のラジオ ボタンを自動的にクリアできます。

ダイアログ ボックスが終了する前に、ダイアログ ボックス プロシージャは、ボタンの現在の状態を返す IsDlgButtonChecked 関数を使用して、各ラジオ ボタンとチェック ボックスの状態をチェックできます。 ダイアログ ボックスは通常、この情報を保存して、次回ダイアログ ボックスを作成したときにボタンを初期化します。

ダイアログ ボックスのコントロールの編集

多くのダイアログ ボックスには、ユーザーがテキストを入力として指定できる編集コントロールがあります。 ほとんどのダイアログ ボックス プロシージャは、ダイアログ ボックスが最初に開始されたときに編集コントロールを初期化します。 たとえば、ダイアログ ボックス プロシージャでは、ユーザーが選択、変更、または置換できるファイル名をコントロールに配置できます。 ダイアログ ボックス プロシージャでは、指定したバッファーから編集コントロールにテキストをコピーする SetDlgItemText 関数を使用して、編集コントロール内のテキストを設定できます。 編集コントロールは、入力フォーカスを受け取ると、編集用の完全なテキストを自動的に選択します。

編集コントロールではテキストがダイアログ ボックスに自動的に返されないため、ダイアログ ボックス プロシージャは終了する前にテキストを取得する必要があります。 編集コントロールのテキストをバッファーにコピーする GetDlgItemText 関数を使用して、テキストを取得できます。 ダイアログ ボックス プロシージャは通常、このテキストを保存して後で編集コントロールを初期化するか、処理のために親ウィンドウに渡します。

一部のダイアログ ボックスでは、ユーザーが数値を入力できる編集コントロールを使用します。 ダイアログ ボックス プロシージャは、編集コントロールからテキストを取得し、テキストを 10 進値に変換する GetDlgItemInt 関数を使用して、編集コントロールから数値を取得できます。 ユーザーは、数値を 10 進数で入力します。 符号付きまたは符号なしを使用できます。 ダイアログ ボックス プロシージャでは、 SetDlgItemInt 関数を使用して整数を表示できます。 SetDlgItemInt は、符号付き整数または符号なし整数を 10 進数の文字列に変換します。

リスト ボックス、コンボ ボックス、ディレクトリ一覧

一部のダイアログ ボックスには、ユーザーが 1 つ以上の名前を選択できる名前の一覧が表示されます。 たとえば、ダイアログ ボックスでファイル名の一覧を表示するには、通常、リスト ボックスと DlgDirList 関数と DlgDirSelectEx 関数 使用します。 DlgDirList 関数は、現在のディレクトリ内のファイル名をリスト ボックスに自動的に入力します。 DlgDirSelect 関数は、選択したファイル名をリスト ボックスから取得します。 これら 2 つの関数を組み合わせることで、ダイアログ ボックスにディレクトリの一覧を表示する便利な方法が提供されるため、ユーザーは名前と場所を入力しなくてもファイルを選択できます。

ダイアログ ボックスでは、コンボ ボックスを使用してファイル名の一覧を表示することもできます。 DlgDirListComboBox 関数は、コンボ ボックスのリスト ボックス部分に現在のディレクトリ内のファイル名を自動的に入力します。 DlgDirSelectComboBoxEx 関数は、リスト ボックス部分から選択したファイル名を取得します。

ダイアログ ボックス コントロール メッセージ

多くのコントロールは、定義済みのメッセージを認識します。このメッセージは、コントロールによって受信されると、何らかのアクションを実行します。 たとえば、BM_SETCHECK メッセージはチェック ボックスにチェックを設定し、EM_GETSEL メッセージは現在選択されているコントロールのテキストの部分を取得します。 コントロール メッセージを使用すると、ダイアログ プロシージャは標準関数よりもコントロールに対してより柔軟にアクセスできるため、ダイアログ ボックスでユーザーとの複雑な操作が必要な場合によく使用されます。

ダイアログ ボックス プロシージャは、コントロール識別子を指定し、 SendDlgItemMessage 関数を使用してコントロールにメッセージを送信できます。 SendMessage 関数と同じですが、メッセージを受信するコントロールを識別するためにウィンドウ ハンドルの代わりにコントロール識別子を使用します。 指定されたメッセージでは、ダイアログ プロシージャがメッセージと共にパラメーターを送信する必要があり、メッセージに対応する戻り値が含まれている場合があります。 各コントロール メッセージの操作と要件は、メッセージの目的と、メッセージを処理するコントロールによって異なります。

コントロール メッセージの詳細については、「 Windows コントロール」を参照してください。

カスタム ダイアログ ボックス

アプリケーションは、定義済みのダイアログ ボックス クラスを使用する代わりに、ダイアログ ボックスのアプリケーション定義ウィンドウ クラスを使用してカスタム ダイアログ ボックスを作成できます。 通常、アプリケーションは、ダイアログ ボックスがメイン ウィンドウである場合にこのメソッドを使用しますが、標準の重なり合うウィンドウを持つアプリケーションのモーダル ダイアログ ボックスとモードレス ダイアログ ボックスを作成する場合にも役立ちます。

アプリケーション定義のウィンドウ クラスを使用すると、アプリケーションはダイアログ ボックスのウィンドウ プロシージャを定義し、メッセージをダイアログ ボックス プロシージャに送信する前に処理できます。 また、アプリケーションでは、ダイアログ ボックスのクラス アイコン、クラスの背景ブラシ、およびクラス メニューを定義することもできます。 アプリケーションは、ダイアログ ボックスを作成する前にウィンドウ クラスを登録する必要があり、ダイアログ ボックス テンプレートにウィンドウ クラスの atom 値または名前を指定する必要があります。

多くのアプリケーションでは、最初に定義済みのダイアログ ボックス クラスのクラス情報を取得し、それを GetClassInfo 関数に渡すことで、新しいダイアログ ボックス クラスを作成します。これにより、 WNDCLASS 構造体に情報が格納されます。 アプリケーションは、クラス名、ブラシ、アイコンなどの構造体の個々のメンバーを変更し、 RegisterClass 関数を使用して新しいクラスを登録します。 アプリケーションが WNDCLASS 構造体をそれ自体で満たす場合、 cbWndExtra メンバーを DLGWINDOWEXTRA に設定する必要があります。これは、システムがダイアログ ボックスごとに必要とする余分なバイト数です。 アプリケーションでダイアログ ボックスごとに余分なバイトも使用する場合は、システムに必要な余分なバイト数を超える必要があります。

カスタム ダイアログ ボックスのウィンドウ プロシージャには、他のウィンドウ プロシージャと同じパラメーターと要件があります。 ただし、他のウィンドウ プロシージャとは異なり、このダイアログ ボックスのウィンドウ プロシージャでは、処理しないメッセージに対して DefWindowProc 関数の代わりに DefDlgProc 関数を 呼び出す必要があります。 DefDlgProc は、ダイアログ ボックス プロシージャの呼び出しを含む、定義済みのダイアログ ボックスのウィンドウ プロシージャと同じ既定のメッセージ処理を実行します。

アプリケーションでは、定義済みのダイアログ ボックスのウィンドウ プロシージャをサブクラス化することで、カスタム ダイアログ ボックスを作成することもできます。 SetWindowLong 関数を使用すると、アプリケーションで指定したウィンドウのウィンドウ プロシージャを指定できます。 また、アプリケーションは SetClassLong 関数を使用してサブクラス化を試みる場合もありますが、アプリケーションに属するダイアログ ボックスだけでなく、システム内のすべてのダイアログ ボックスにも影響します。

カスタム ダイアログ ボックスを作成するアプリケーションでは、ダイアログ ボックス用の代替キーボード インターフェイスが提供される場合があります。 モードレス ダイアログ ボックスの場合、これは、アプリケーションが IsDialogMessage 関数を呼び出さず、代わりにカスタム ウィンドウ プロシージャ内のすべてのキーボード入力を処理しないことを意味する可能性があります。 このような場合、アプリケーションは WM_NEXTDLGCTL メッセージを使用して、入力フォーカスをあるコントロールから別のコントロールに移動するために必要なコードを最小限に抑えることができます。 このメッセージは、 DefDlgProc に渡されると、入力フォーカスを指定されたコントロールに移動し、既定のプッシュ ボタンの境界線の移動や自動ラジオ ボタンの設定など、コントロールの外観を更新します。