VC++ トップページ

Section1.4 ウインドウプロシージャ(コールバック関数)
ウインドウから送られてくるメッセージをキャッチして処理する関数の事.コールバック関数である.
Javaでいうところのイベントリスナーだっけ?
メニュー,キー,マウス,スクロールバー,描画等々,様々なメッセージが送られてくる.
ダイアログ用のコールバック関数は Section7.3 でやってるのでそちらを参照.
MDI関連のプロシージャはまた返さないといけない値とかがちょっと違うのでそのうち.

基本形
LRESULT  CALLBACK  WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){
    
    switch(msg){
    case WM_CREATE:
        return 0L;
        
            .
            .
            .
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0L;
    }
    
    return DefWindowProc(hWnd,msg,wParam,lParam);
}
WndProcがこのコールバック関数の名前.これは適当に決めてよい.
WNDCLASS(EX).lpfnWndProc にその名前を代入するとそのウインドウで発生した イベントをその関数でキャッチできる.

msgに発生したイベントの種類が入っているのでそれで場合わけするのが普通.
"msg == WM_CREATE" ならウインドウが作成された時の処理, "msg == WM_KEYDOWN" ならキーが押された時の処理,といった具合に.

hWnd にはメッセージを発生したウインドウのハンドルが, wParam, lParam には msg の種類に応じたパラメタが渡される.

普通のウインドウではだいたい,自分でメッセージを処理した時は0, システムに処理を任せるときは DefWindowProc( hWnd, msg, wParam, lParam ) を返す.


主なメッセージ一覧(ノーマルウインドウ編)
今後私が新しいものを使ったら増えるかも.

読み方
WM_...(msg(第2引数)の値)
 どんな時にこのメッセージが送られてくるか.
wParam第3引数 wParam はどう使われるか.
lParam第4引数 lParam はどう使われるか
返り値このメッセージが送信されたら自分は何を返したらいいか.
特に記述がない場合は,メッセージを処理する時は0, 処理しないときはDefWindowProc( hWnd, msg, wParam, lParam )を返す.
※この先よく出てくるLOWORD(), HIWORD() はDWORD型の上位WORD,下位WORDを取り出せるマクロです.
lParam, wParam はこのマクロで半分だけ取り出して使う事も多いです.

WM_CREATE
 CreateWindow(Ex)が呼ばれたとき.この処理はCreateWindow(Ex)処理中で行われる.
wParam0
lParam(LPCREATESTRUCT) CREATESTRUCT構造体のポインタ.CreateWindow(Ex)の最後の引数.MDIとかで使われるが,普通使わない.
返り値(int) 0:ウインドウの作成を継続する.-1:ウインドウを破棄する,このときCreateWindow(Ex)からはNULLが返される.

WM_CLOSE
 閉じるボタンとかが押された時.ウインドウまたはアプリケーションの終了を示す.
wParam0
lParam0
システムに処理させると DestroyWindow() などが 呼ばれてウインドウが破棄される. その際 WM_DESTROY メッセージがポストされる.
何もしないで0Lを返すとウインドウは閉じられない.

WM_DESTROY
 ウインドウが画面から削除された後.最初に破棄されようとしているウインドウに送られ, 次にその子ウインドウに送られる.
wParam0
lParam0
メインウインドウが閉じられたときなど,アプリケーションを終了したいときは PostQuitMessage() を呼ぶ.

WM_COMMAND
・メニューコマンドが選択されたとき,
・コントロール(ボタンとか)からその親ウインドウに通知メッセージが送られたとき,
・アクセラレータキー操作が変換されたとき.
LOWORD(wParam)(WORD) メニュー項目,コントロール,アクセラレータの識別子
HIWORD(wParam)(WORD) 通知コード(コントロールの時),1(アクセラレータ),0(メニュー)
lParam(HWND) コントロールのハンドル(コントロールのとき),NULL(それ以外)

WM_PAINT
ウインドウ(の一部)をペイントしないといけない時. UpdateWindow()やRedrawWindow()が呼び出されたときにも送られる. Section2 で少しやってるのでそちらを参照.
wParam(HDC) 一部のコモンコントロールでのみ使われるパラメタ. このデバイスコンテキストでの描画を可能にする. NULLの場合はデフォルトのデバイスコンテキストを使用.
lParam0

WM_MOVE
ウインドウが移動したとき.
wParam0
LOWORD(lParam)(WORD) クライアント領域左上隅のx座標※
HIWORD(lParam)(WORD) クライアント領域左上隅のy座標※
※オーバーラップウインドウとポップアップウインドウではスクリーン座標, 子ウインドウなら親ウインドウにおける相対座標.

WM_SIZE
ウインドウのサイズが変更されたとき.
wParam (WPARAM) ウインドウのサイズ変更タイプ
SIZE_MAXIMIZEDウインドウが最大化された.
SIZE_MINIMIZEDウインドウが最小化された.
SIZE_RESTORED最大化,最小化以外でウインドウサイズが変更された.
SIZE_MAXHIDE他のウインドウのどれかが最大化された(このウインドウがポップアップの時)
SIZE_MAXSHOW他のウインドウのどれかの最大化が解除された(〃)
LOWORD(lParam)(WORD) クライアント領域の新しい幅
HIWORD(lParam)(WORD) クライアント領域の新しい高さ

WM_KEYDOWN 非システムキーが押されたとき
WM_KEYUP 非システムキーが放されたとき
wParam(int) 仮想キーコード.Section3.2参照.
lParamフラグとか. 手元の資料がビット単位で取り出せみたいな勢いなので省略.
LOWORD(lParam)? キー落下中に押されたことになった回数(押しっぱなしにしたら連打したことになるアレ). WM_KEYUPでは常に1.

WM_LBUTTONDOWN マウス左ボタンが押された
WM_MBUTTONDOWN 中が押された
WM_RBUTTONDOWN 右が押された
WM_LBUTTONUP 左が放された
WM_MBUTTONUP 中が放された
WM_RBUTTONUP 右が放された
WM_LBUTTONDBLCLK 左ダブルクリック
WM_MBUTTONDBLCLK 中ダブルクリック
WM_RBUTTONDBLCLK 右ダブルクリック
WM_MOUSEMOVE マウスカーソルが動いた
カーソルがウインドウクライアント領域にあるとき, マウスがキャプチャーされている場合はキャプチャーしたウインドウへ, それ以外はカーソルを含むウインドウへポストされる.
wParam (WPARAM) どの仮想キーが押されてるか.下表を|(OR)で組み合わせた値.
MK_CONTROLCtrlキーが押されている.
MK_LBUTTONマウスの左ボタンが押されている.
MK_MBUTTONマウスの中央ボタンが押されている.
MK_RBUTTONマウスの右ボタンが押されている.
MK_SHIFTShiftキーが押されている.
LOWORD(lParam)(WORD)カーソルのx座標(クライアント領域の左上隅が原点)
HIWORD(lParam)(WORD)カーソルのy座標(クライアント領域の左上隅が原点)
Section3.1で少しやってます.

WM_HSCROLL 水平(横方向)
WM_VSCROLL 垂直(縦方向)
・ウインドウの標準水平(垂直)スクロールバーでイベントが発生したとき,
・そのウインドウの子である水平(垂直)スクロールバーコントロールでイベントが発生したとき.
LOWORD(wParam) (int)
SB_LINELEFT(SB_LINEUP)左(上)へ1単位だけスクロール.左(上)端の三角ボタンが押されたときなど.
SB_LINERIGHT(SB_LINEDOWN)右(下)へ1単位だけスクロール.右(下)端の三角ボタンが押されたときなど.
SB_PAGELEFT(SB_PAGEUP)左(上)へウインドウの幅に応じてスクロール.スクロールボックスの左(上)側が押されたときなど.
SB_PAGERIGHT(SB_PAGEDOWN)右(下)へウインドウの幅に応じてスクロール.スクロールボックスの右(下)側が押されたときなど.
SB_THUMBTRACKスクロールボックスをドラッグした時.HIWORD(wParam)がその位置
SB_THUMBPOSITION絶対位置でスクロール.HIWORD(wParam)が現在位置
SB_TOP左上へスクロール
SB_BOTTOM右下へスクロール
SB_ENDSCROLLスクロールを終了する
HIWORD(wParam)(short int) LOWORD(wParam)がSB_THUMB***の時はスクロールボックスの現在地.
lParam(LPARAM) スクロールバーコントロールから送られてきた場合は,そのハンドル.

WM_TIMER
SetTimer()で指定した時間間隔が経過するたびに, タイマをインストールするようい指定したウインドウのコールバック関数か, 指定したタイマ用コールバック関数に送られる.
wParamタイマの識別子
lParamSetTimer()に渡されたアプリケーション定義のコールバック関数のポインタ


VC++ トップページ