ダイアログアイテムの操作

ダイアログ上に作成したコントロール(アイテムとも呼ぶ)は、基本的に通常のウィンドウ上に配置したコントロールと同じ要領で操作できます。
(ボタンコントロールなどを参照)

コントロールのハンドル

コントロール類に対する操作はウィンドウハンドルが必要なものがありますが(SendMessage関数を使用する場合など)、ダイアログテンプレートを使用する場合、コントロールの作成にCreateWindow関数を使用しないため、作成時にハンドルを得る機会がありません。
ダイアログ上のコントロールのウィンドウハンドルを取得するにはGetDlgItem関数を使用します。

HWND GetDlgItem(
 HWND hDlg,
 int nIDDlgItem
);
ダイアログボックスhDlgから識別子nIDDlgItemで識別されるコントロールのハンドルを取得する。
失敗した場合はNULLを返す。

関数名に「Dlg」が入っていますが、ウィンドウ同士に親子関係があり、子ウィンドウに識別子があればダイアログボックス以外でも使用できます。

ハンドルからIDの取得

反対にコントロールのハンドルからコントロールIDを取得するにはGetDlgCtrlID関数を使用します。

int GetDlgCtrlID(
 HWND hWnd
);
コントロールハンドルhWndの識別子を返す。
失敗した場合は0を返す。

この関数は「子ウィンドウ」にのみ有効です。
(コントロール類は親ウィンドウ上に配置される子ウィンドウです)
子ウィンドウではないウィンドウ(トップレベルウィンドウと言う)に対して使用した場合、0以外を返すこともありますが、有効な値ではありません。

コントロールIDによる操作

ダイアログ上のコントロールは、ウィンドウハンドルを介さずともコントロールIDで直接操作できる方法が用意されています。

メッセージの送信

SendMessage関数と同等の操作はSendDlgItemMessage関数で可能です。

LRESULT SendDlgItemMessageW(
HWND hDlg,
int nIDDlgItem,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);
ダイアログhDlg上のコントロールnIDDlgItemにメッセージMsgを送信する。
追加のデータとしてwParam、lParamを指定できる。
戻り値は送信するメッセージにより異なる。

第一引数にダイアログハンドルを、第二引数にコントロールIDを指定します。
それ以外はSendMessage関数と同じです。

テキストの設定

コントロールのテキスト情報はSetDlgItemText関数で設定できます。
これはSetWindowText関数と同等です。

BOOL SetDlgItemTextW(
 HWND hDlg,
 int nIDDlgItem,
 LPCWSTR lpString
);
ダイアログhDlg上のコントロールnIDDlgItemのテキストを文字列lpStringに設定する。
成功した場合は0以外を、失敗した場合は0を返す。

SetDlgItemInt関数

SetDlgItemInt関数は、コントロールのテキストに整数値(の文字列表現)を設定することができます。
(単純に整数を表示するだけなら整数値→文字列の変換をする必要はない)

BOOL SetDlgItemInt(
 HWND hDlg,
 int nIDDlgItem,
 UINT uValue,
 BOOL bSigned
);
ダイアログhDlg上のコントロールnIDDlgItemのテキストを整数値uValueのテキスト表現に設定する。
bSignedがTRUEの場合は符号あり、FALSEの場合は符号なし整数値となる。
成功した場合は0以外を、失敗した場合は0を返す。

テキストの取得

コントロールのテキストの取得はGetDlgItemText関数を使用します。
これはGetWindowText関数と同等です。

UINT GetDlgItemTextW(
 HWND hDlg,
 int nIDDlgItem,
 LPWSTR lpString,
 int cchMax
);
ダイアログhDlg上のコントロールnIDDlgItemのテキストを取得し、文字列バッファlpStringにcchMax文字数分コピーする。
成功した場合はコピーされた文字列の文字数を返す。
失敗した場合は0を返す。

GetDlgItemInt関数

GetDlgItemInt関数は、コントロールのテキストを整数値に変換して取得することができます。

BOOL GetDlgItemInt(
 HWND hDlg,
 int nIDDlgItem,
 BOOL *lpTranslated,
 BOOL bSigned
);
ダイアログhDlg上のコントロールnIDDlgItemのテキストを整数値に変換して返す。
bSignedがTRUEの場合は符号あり、FALSEの場合は符号なし整数値となる。
変換の成否をBOOL型ポインタ変数lpTranslatedに格納する。
成功した場合は0以外を、失敗した場合は0を返す。

ボタンのチェック状態

チェック状態の設定

チェックボックスのチェック状態を変更するにはCheckDlgButton関数を使用します。

BOOL CheckDlgButton(
 HWND hDlg,
 int nIDButton,
 UINT uCheck
);
ダイアログhDlg上のボタンコントロールnIDDlgItemのチェック状態をuCheckに設定する。
成功した場合は0以外を、失敗した場合は0を返す。

第三引数uCheckは以下の定数のいずれかです。

定数 説明
BST_CHECKED チェックはオン
BST_UNCHECKED チェックはオフ
BST_INDETERMINATE チェックはあいまい
(3状態チェックボックス用)

チェック状態の操作も参照してください。

チェック状態の取得

チェックボックスのチェック状態を取得するにはIsDlgButtonChecked関数を使用します。

UINT IsDlgButtonChecked(
 HWND hDlg,
 int nIDButton
);
ダイアログhDlg上のボタンコントロールnIDDlgItemのチェック状態を返す。

返される値はCheckDlgButton関数で説明した定数のいずれかです。

ラジオボタンのチェック

ラジオボタンのチェック状態もCheckDlgButton関数で設定できますが、CheckRadioButton関数を使用することもできます。

BOOL CheckRadioButton(
 HWND hDlg,
 int nIDFirstButton,
 int nIDLastButton,
 int nIDCheckButton
);
ダイアログhDlg上のラジオボタンコントロールnIDCheckButtonのチェックをオンにする。
ラジオボタンコントロールの範囲はnIDFirstButtonとnIDLastButtonで指定する。
成功した場合は0以外を、失敗した場合は0を返す。

ラジオボタンのグループの指定は第一引数nIDFirstButtonと第二引数nIDLastButtonで指定します。
第三引数nIDCheckButtonは上記の範囲内にあるラジオボタンを指定します。
第三引数に指定したラジオボタンがオンになり、それ以外のラジオボタンはオフになります。

nIDFirstButtonとnIDLastButtonで指定したコントロールIDの範囲をラジオボタングループとみなすわけですが、IDは整数値で管理されています。
つまりグループのラジオボタンのIDは数値が連続している必要があります。

グループ化について

Visual Studioのダイアログエディタでは、コントロールのプロパティの「グループ」を「True」にすることでグループ化が可能です。
(グループ化も参照してください)
コントロールのグループ化

この設定を「True」にしたコントロールから、次に「True」に設定したコントロールが出現するまでをグループ化します。
(グループ内の二番目以降のコントロールは「False」に設定してください)

ここでのグループ化はユーザー操作時には有効ですが、プログラムからチェック状態を変更した場合には有効ではありません。
(グループ内で複数を同時にチェック状態にすることも可能)
CheckRadioButton関数の動作にも影響しません。