Windows API - GUI プログラミング編 第2回 〜マウスメッセージとウィンドウ操作〜

マウスメッセージ

移動メッセージ

マウスカーソルをウィンドウ上で移動すると、WM_MOUSEMOVE というメッセージが送られる。

WPARAM は、キーの状態を表すフラグで、次のようなものを持つ。

MK_LBUTTON  左ボタン
MK_RBUTTON  右ボタン
MK_SHIFT    Shift キー
MK_CONTROL  Ctrl キー

LPARAM は、マウスカーソルの座標を表す。上位ワードが Y 座標、下位ワードが X 座標を 表す。

WORD y=HIWORD(lParam);
WORD x=LOWORD(lParam);

クリックメッセージ

マウスボタンをクリックすると、状況に応じて次のようなメッセージが送られる。

WM_LBUTTONDOWN   左ボタンを押す
WM_LBUTTONUP     左ボタンを離す
WM_LBUTTONDBLCLK 左ボタンをダブルクリック
WM_RBUTTONDOWN   右ボタンを押す
WM_RBUTTONUP     右ボタンを離す
WM_RBUTTONDBLCLK 右ボタンをダブルクリック

WPARAM や LPARAM は WM_MOUSEMOVE と同様である。

マウスキャプチャ

ウィンドウ操作

ウィンドウサイズメッセージ

ウィンドウの大きさを変更すると、WM_SIZE メッセージが送られる。 WPARAM は、サイズ変更の次のようなフラグが入る。

SIZE_RESTORED  サイズが変更された
SIZE_MAXIMIZED 最大化された
SIZE_MINIMIZED 最小化された
SIZE_MAXHIDE   他のウィンドウが元のサイズに戻された
SIZE_MAXSHOW   他のウィンドウが最大化された

LPARAM は上位ワードに横幅、下位ワードに高さが入る。

ウィンドウ移動メッセージ

ウィンドウが移動されると、WM_MOVE メッセージが送られる。 LPARAM の上位ワードには Y 座標、下位ワードには X 座標が入る。

MoveWindow() API 関数

MoveWindow() API 関数は、第1引数で指定したウィンドウハンドルに対して、そのサイズ、位置を 変更する。

BOOL MoveWindow(
 HWND hWnd, int X, int Y, int nWidth, int nHeight, BOOL bRepaint
);

それぞれ、第2引数と第3引数が左上の座標、第4引数と第5引数がウィンドウサイズを表す。 第6引数を TRUE とすると、WM_PAINT メッセージを hWnd に送る。

また、この API 関数を実行すると、WM_MOVE、WM_SIZE の両方のメッセージも送られる。

スクロールバー

CreateWindow() API 関数において、WS_HSCROLL/WS_VSCROLL をスタイルとして指定すると、 スクロールバーが表示される。

SCROLLINFO 構造体

スクロールバーの情報を管理する構造体で、次のようなメンバを持つ。

UINT cbSize;    sizeof(SCROLLINFO)
UINT fMask;     マスク
int  nMin;      スクロール最小値
int  nMax;      スクロール最大値
UINT nPage;     ページサイズ
int  nPos;      ポジション

スクロールバーの状態の設定は、SetScrollInfo() API 関数で行われる。

int SetScrollInfo(
 HWND hWnd, int fnBar, LPSCROLLINFO lpsi, BOOL fRedraw
);

第4引数を TRUE とすると、ウィンドウに WM_PAINT が送られる。

スクロールバーの情報を取得する場合、GetScrollInfo() API 関数を使用する。

BOOL GetScrollInfo(HWND hWnd, int fnBar, LPSCROLLINFO lpsi);

それぞれ、第1引数はウィンドウハンドル、第3引数は SCROLLINFO 構造体へのポインタを表し、 第2引数はどのスクロールバーに対するものかを指定する次のようなフラグを指定する。

SB_HORZ 水平スクロールバー
SB_VERT 垂直スクロールバー

SCROLLINFO 構造体の fMask は、SetScrollInfo() で指定する値の範囲を指定する次のような フラグを指定します。

SIF_DISABLENOSCROLL 無効パラメータに対して使用不能とする
SIF_PAGE            nPage を設定する  
SIF_POS             nPos を設定する
SIF_RANGE           nMin と nMax を設定する
SIF_ALL             SIF_PAGE, SIF_POS, SIF_RANGE 全てを設定する 

スクロールメッセージ

垂直スクロールバーを操作すると WM_VSCORLL メッセージが送られる。

WPARAM の下位ワードには通知コードと呼ばれる次のようなフラグがセットされる。

SB_LINEUP       上へ1単位スクロール
SB_LINEDOWN     下へ1単位スクロール
SB_PAGEUP       上へウィンドウの高さだけスクロール
SB_PAGEDOWN     下へウィンドウの高さだけスクロール
SB_THUMPOSITION スクロールボックスを操作した
SB_THUMTRACK    スクロールボックス操作中
SB_TOP          [HOME] キーが押された
SB_BOTTMOM      [END] キーが押された
SB_ENDSCROLL    スクロールが終了した

水平スクロールバーを操作すると WM_HSCROLL メッセージが送られる。

WPARAM の下位ワードには、次のような通知コードがセットされる。

SB_LINELEFT     左へ1単位スクロール
SB_LINERIGHT    右へ1単位スクロール
SB_PAGELEFT     左へウィンドウの幅だけスクロール
SB_PAGERIGHT    右へウィンドウの幅だけスクロール
SB_THUMPOSITION スクロールボックスを操作した
SB_THUMTRACK    スクロールボックスを操作中
SB_LEFT         左にスクロール
SB_RIGHT        右にスクロール
SB_ENDSCROLL    スクロールを終了

それぞれ、SB_THUMPOSITION/SB_THUMTRACK が下位ワードに入るとき、 WPARAM の上位ワードにはスクロールボックスの位置がセットされる。

スクロールバーコントロール

スクロールバーは、独立したコントロールとして、CreateWindow() API 関数を用いて生成できる。


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