Windows API - GUI プログラミング編 第1回 〜ボタンコントロール〜

ボタンコントロール

続いて、WIN32 標準コントロールとして定義済みのウィンドウクラスの中から、

TEXT("BUTTON");

を紹介します。

これまで、WM_CREATE と WM_DESTROY という2つのメッセージしか 説明してきませんでしたが、ボタンコントロールを用いることで、 プログラムの開始と終了以外の任意のタイミングでメッセージを通知することができます。

ボタンコントロールハンドルの発行

エディットコントロールと同様、CreateWindow() API 関数でハンドルを 発行します。

まず、エディットコントロールでは NULL とした第9引数ですが、

(HMENU)IDC_BUTTON1

などと子ウィンドウに対して固有の ID を振ることが出来ます。 もちろん、IDC_BUTTON1 は、これ以前のどこかで定義された定数となります。

なお、第2引数はボタンに表示される文字列となります。

ボタンコントロールのスタイル

第3引数に指定するボタンコントロールのスタイルですが、 ごく普通のクリックするとへっこむボタンは、

WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON	

などと指定します。

BS_DEFPUSHBUTTON

と指定すると、ボタンの周りが黒いふちで囲われます。

この他、TEXT("BUTTON") では、次のようなボタンを作ることが出来ます。

BS_AUTOCHECKBOX    チェックボックス
BS_AUTO3STATE      トライステートボックス
BS_AUTORADIOBUTTON ラジオボタン
BS_GROUPBOX        グループボックス
WS_GROUP           ラジオボタンのグループ開始点

ボタンコントロールとメッセージ

WM_COMMAND メッセージ

実際にボタンをクリックすると、親ウィンドウに WM_COMMAND というメッセージが通知されます。

WPARAM と LPARAM の2つのパラメータが送られてくるのですが、 まず、LPARAM には、ボタンコントロールのハンドルが入っています。 必要ならば、HWND 型にキャストして利用します。

WPARAM ですが、上位と下位で意味が変わります。

WORD wNotifyCode=HIWORD(wParam);
WORD wID=LOWORD(wParam);

HIWORD() と LOWORD() マクロというものが出てきましたが、 32ビット列である DWORD 型の値から、上位の 16 ビット列である WORD 型の 値を取り出すものが、HIWORD() マクロ、下位の WORD 型の値を取り出すものが LOWORD() マクロとなります。

変数名を見てもらうと分かるように、先程第9引数に指定した ID が下位に入ります。 上位には、通知コードというものが入ります。 通常、BN_CLICKED が入るので、switch を使って分岐する必要は特にありません。

以上のことから、WM_COMMAND が通知された場合、次のような処理を行います。

case WM_COMMAND:
 switch(LOWORD(wParam)){
 case IDC_BUTTON1:
  ...
  break;
 case IDC_BUTTON2:
  ...
  break;
 ...
 }
 break;

BM_CLICK メッセージ

エディットコントロールと同様、ボタンにも SendMessage() で メッセージを通知することが出来ます。

BM_CLICK メッセージを BS_PUSHBUTTON を指定しているボタンコントロールに通知することで、 そのボタンをアプリケーション側からクリックします。

SendMessage(hPushButton, BM_CLICK, 0, 0);

BM_GETCHECK メッセージ と BM_SETCHECK メッセージ

BS_AUTOCHECKBOX などを指定している場合、この2つのメッセージを用いて、 ボタンの状態を参照したり、変更します。

BM_GETCHECK は、WPARAM/LPARAM ともに 0 とすると、LRESULT として、 BST_UNCHECKED/BST_CHECKED/BST_INDETERMINATE のいずれかが返ります。

BM_SETCHECK では、LPARAM を 0 とし、WPARAM にこのいずれかを指定します。


文章作成 : yukki-ts (-+-twilight serenade-+- [stage])