ボタン メッセージ

ボタンは親ウィンドウにメッセージを送信でき、親ウィンドウはボタンにメッセージを送信できます。

このセクションでは、次のトピックについて説明します。

ボタンへのメッセージの送信

親ウィンドウは、オーバーラップ ウィンドウ内または子ウィンドウ内のボタンに、SendMessage 関数を使用してメッセージを送信できます。または、ダイアログ ボックス内のボタンに、SendDlgItemMessage 関数、CheckDlgButton 関数、CheckRadioButton 関数、および IsDlgButtonChecked 関数を使用してメッセージを送信できます。

アプリケーションは、BM_GETCHECK メッセージを使用して、チェック ボックスまたはラジオ ボタンのチェック状態を取得できます。 また、アプリケーションは、BM_GETSTATE メッセージを使用して、ボタンの現在の状態 (チェック状態、プッシュ状態、フォーカス状態) を取得することもできます。 特定の状態に関する情報を取得するには、返された状態値に対してビットマスクを使用します。

BM_SETCHECK メッセージは、チェック ボックスまたはラジオ ボタンのチェック状態を設定します。このメッセージは、ゼロを返します。 BM_SETSTATE メッセージはボタンのプッシュ状態を設定します。このメッセージも、ゼロを返します。 BM_SETSTYLE メッセージは、ボタンのスタイルを変更します。 これは、同じ種類の中でボタン スタイルを変更するために設計されています (たとえば、チェック ボックスを自動チェック ボックスに変更するなど)。 種類を変更するためのものではありません (たとえば、チェック ボックスをラジオ ボタンに変更するなど)。 アプリケーションでは、ボタンの種類を変更するべきではありません。

BS_BITMAP スタイルまたは BS_ICON スタイルのボタンでは、テキストの代わりにビットマップまたはアイコンが表示されます。 BM_SETIMAGE メッセージは、ビットマップまたはアイコンのハンドルをボタンに関連付けます。 BM_GETIMAGE メッセージは、ボタンに関連付けられたビットマップまたはアイコンに対するハンドルを取得します。

アプリケーションでは、DM_GETDEFID メッセージを使用して、ダイアログ ボックス内の既定のプッシュ ボタン コントロールの識別子を取得することもできます。 アプリケーションでは、DM_SETDEFID メッセージを使用して、ダイアログ ボックスの既定のプッシュ ボタンを設定することができます。

CheckDlgButton 関数または CheckRadioButton 関数を呼び出すのは、BM_SETCHECK メッセージを送信するのと同じです。 IsDlgButtonChecked 関数を呼び出すのは、BM_GETCHECK メッセージを送信するのと同じです。

ボタンからのメッセージの処理

ボタンからの通知は、WM_COMMAND メッセージまたは WM_NOTIFY メッセージとして送信されます。 どのメッセージが使用されるのかについては、各通知のリファレンス ページで確認できます。

メッセージの処理方法の詳細については、「コントロール メッセージ」を参照してください。 「ボタン メッセージ」も参照してください。

ボタンからの通知メッセージ

ユーザーがボタンをクリックすると、ボタンの状態が変わり、ボタンは通知コードを WM_COMMAND メッセージの形式で親ウィンドウに送信します。 たとえば、プッシュ ボタン コントロールは、ユーザーがこのボタンを選択したときは常に、BN_CLICKED 通知コードを送信します。 BCN_HOTITEMCHANGE を除き、いずれの場合も、wParam パラメーターの下位ワードにはコントロールの識別子が格納され、wParam の上位ワードには通知コードが格納されます。また、lParam パラメーターには、コントロール ウィンドウのハンドルが格納されます。

メッセージと親ウィンドウの応答はどちらも、ボタンの種類、スタイル、現在の状態によって異なります。 以下に、アプリケーションで監視および処理する必要があるボタン通知コードを示します。

通知コード 説明
BCN_HOTITEMCHANGE マウスがボタンのクライアント領域に入ったか、領域を出ました。
BN_CLICKED ユーザーがボタンをクリックしました。
BN_DBLCLK または BN_DOUBLECLICKED ユーザーがボタンをダブルクリックしました。
BN_DISABLE ボタンが無効になりました。
BN_PUSHED または BN_HILITE ユーザーがボタンを押しました。
BN_KILLFOCUS ボタンがキーボード フォーカスを失いました。
BN_PAINT ボタンを描画する必要があります。
BN_SETFOCUS ボタンがキーボード フォーカスを取得しました。
BN_UNPUSHED または BN_UNHILITE ボタンは押された状態ではなくなりました。

 

ボタンが BN_DISABLEBN_PUSHEDBN_KILLFOCUSBN_PAINTBN_SETFOCUS、および BN_UNPUSHED の通知コードを送信するのは、ボタンに BS_NOTIFY スタイルが設定されている場合のみです。 BN_DBLCLK 通知コードは、BS_USERBUTTONBS_RADIOBUTTON、および BS_OWNERDRAW ボタンについては自動的に送信されます。 他の種類のボタンは、BS_NOTIFY スタイルがある 場合にのみ BN_DBLCLK を送信します。 すべてのボタンは、ボタンのスタイルに関係なく、BN_CLICKED 通知コードを送信します。

自動ボタンの場合、システムがプッシュ状態を変更し、ボタンを描画します。 この場合、アプリケーションは通常、BN_CLICKEDBN_DBLCLK の通知コードのみを処理します。 自動ではないボタンの場合、アプリケーションは通常、ボタンの状態を変更するためのメッセージを送信することで、通知コードに応答します。 ボタンへのメッセージの送信については、「ボタンへのメッセージの送信」を参照してください。

ユーザーが所有者描画ボタンを選択すると、そのボタンは、描画するコントロールの識別子と、その寸法と状態に関する情報を含む WM_DRAWITEM メッセージを親ウィンドウに送信します。

ボタンの色に関するメッセージ

ボタンの既定の色値は、システムによって提供されます。 アプリケーションでは、GetSysColor 関数を呼び出すことでこれらの色の既定値を取得するか、SetSysColors 関数を呼び出すことで値を設定することができます。 次の表に、ボタンの色の既定値を示します。

Value 色付きの要素
COLOR_BTNFACE ボタンの面。
COLOR_BTNHIGHLIGHT ボタンの強調表示領域 (上端と左端)。
COLOR_BTNSHADOW ボタンのシャドウ領域 (下端と右端)。
COLOR_BTNTEXT ボタン内の通常の (灰色ではない) テキスト。
COLOR_GRAYTEXT ボタン内の無効な (灰色の) テキスト。 現在のディスプレイ ドライバーが単色の灰色をサポートしていない場合、この色は 0 に設定されます。
COLOR_WINDOW ウィンドウの背景。
COLOR_WINDOWFRAME ウィンドウのフレーム。
COLOR_WINDOWTEXT ウィンドウ内のテキスト。

 

ただし、SetSysColors を呼び出すとすべてのアプリケーションに影響するため、自身のアプリケーションでボタンをカスタマイズするためにこの関数を呼び出すべきではありません。

システムは、ボタンを描画する前に、WM_CTLCOLORBTN メッセージを親ウィンドウに送信します。 このメッセージには、ボタンのデバイス コンテキストのハンドルと、子ウィンドウのハンドルが含まれます。 親ウィンドウでは、これらのハンドルを使用して、ボタンのテキストと背景色を変更できます。 ただし、メッセージを処理する親ウィンドウに応答するのは、所有者描画ボタンのみです。

ボタンの既定のメッセージ処理

ボタン コントロール プロシージャが処理しないすべてのメッセージについては、定義済みのボタン コントロール ウィンドウ クラスのウィンドウ プロシージャが既定の処理を実行します。 ボタン コントロール プロシージャがいずれかのメッセージについて FALSE を返すと、定義済みのウィンドウ プロシージャがメッセージをチェックし、次の表に一覧で示した既定のアクションを実行します。

メッセージ 既定の動作
BM_CLICK ボタンに WM_LBUTTONDOWN メッセージと WM_LBUTTONUP メッセージを送信し、親ウィンドウに BN_CLICKED 通知コードを送信します。
BM_GETCHECK ボタンのチェック状態を返します。
BM_GETIMAGE ボタンに関連付けられたビットマップまたはアイコンのハンドルを返すか、ボタンにビットマップもアイコンもない場合は NULL を返します。
BM_GETSTATE ボタンの現在のチェック状態、プッシュ状態、フォーカス状態を返します。
BM_SETCHECK ラジオ ボタンとチェック ボックスのすべてのスタイルのチェック状態を設定します。 ラジオ ボタンについて、wParam パラメーターがゼロより大きい場合は、ボタンに WS_TABSTOP スタイルが設定されます。
BM_SETIMAGE 指定されたビットマップまたはアイコンのハンドルをボタンに関連付けて、以前のビットマップまたはアイコンのハンドルを返します。
BM_SETSTATE ボタンのプッシュ状態を設定します。 所有者描画ボタンの場合、ボタンの状態が変化すると、WM_DRAWITEM メッセージが親ウィンドウに送信されます。
BM_SETSTYLE ボタンのスタイルを設定します。 lParam パラメーターの下位ワードが TRUE である場合、ボタンは再描画されます。
WM_CHAR ユーザーがプラス (+) キーまたは等号 (=) キーを押したときに、チェック ボックスまたは自動チェック ボックスをオンにします。 ユーザーがマイナス (–) キーを押したときに、チェック ボックスまたは自動チェック ボックスをクリアします。
WM_ENABLE ボタンを描画します。
WM_ERASEBKGND 所有者描画ボタンの背景を消去します。 その他のボタンの背景は、WM_PAINT および WM_ENABLE の処理の一部として消去されます。
WM_GETDLGCODE 次の表に示すように、既定のボタン プロシージャによって処理された入力の種類を示す値を返します。
ボタン スタイル 返品
BS_AUTOCHECKBOX DLGC_WANTCHARS | DLGC_BUTTON
BS_AUTORADIOBUTTON DLGC_RADIOBUTTON | DLGC_BUTTON
BS_CHECKBOX DLGC_WANTCHARS | DLGC_BUTTON
BS_DEFPUSHBUTTON DLGC_DEFPUSHBUTTON | DLGC_BUTTON
BS_GROUPBOX DLGC_STATIC
BS_PUSHBUTTON DLGC_UNDEFPUSHBUTTON | DLGC_BUTTON
BS_RADIOBUTTON DLGC_RADIOBUTTON | DLGC_BUTTON

 

WM_GETFONT 現在のフォントのハンドルを返します。
WM_KEYDOWN ユーザーが Space キーを押した場合、ボタンを押します。
WM_KEYUP Tab キーを除くすべての場合に、マウス キャプチャを解放します。
WM_KILLFOCUS ボタンからフォーカスの四角形を削除します。 プッシュ ボタンと既定のプッシュ ボタンの場合、フォーカスの四角形は無効になります。 ボタンにマウス キャプチャがある場合、キャプチャは解放され、ボタンはクリックされず、プッシュ状態はすべて削除されます。
WM_LBUTTONDBLCLK ラジオ ボタンと所有者描画ボタンについては、BN_DBLCLK 通知コードを親ウィンドウに送信します。 その他のボタンについては、ダブルクリックは WM_LBUTTONDOWN メッセージとして処理されます。
WM_LBUTTONDOWN マウス カーソルの位置がボタンのクライアント四角形の中にある場合は、ボタンを強調表示します。
WM_LBUTTONUP ボタンにマウス キャプチャがある場合は、マウス キャプチャを解放します。
WM_MOUSEMOVE ボタンにマウス キャプチャがある場合、WM_LBUTTONDOWN と同じアクションを実行します。 それ以外の場合はアクションは実行されません。
WM_NCCREATE BS_OWNERDRAW ボタンがある場合は、それを BS_PUSHBUTTON ボタンに変換します。
WM_NCHITTEST ボタン コントロールがグループ ボックスである場合は HTTRANSPARENT を返します。
WM_PAINT スタイルと現在の状態に従ってボタンを描画します。
WM_SETFOCUS フォーカスを取得するボタンの上にフォーカスの四角形を描画します。 ラジオ ボタンと自動ラジオ ボタンの場合、親ウィンドウに BN_CLICKED 通知コードが送信されます。
WM_SETFONT 新しいフォントを設定し、必要に応じてウィンドウを更新します。
WM_SETTEXT ボタンのテキストを設定します。 グループ ボックスの場合、このメッセージは、既存のテキストを塗りつぶしてから、新しいテキストでグループ ボックスを再描画します。
WM_SYSKEYUP Tab キーを除くすべての場合に、マウス キャプチャを解放します。

 

定義済みのウィンドウ プロシージャは、既定の処理を行えるように、その他のすべてのメッセージを DefWindowProc 関数に渡します。

コントロール メッセージ