<Previous> <Next> <SDK Top> <Top>
1章.7節.プロシージャー
次にプロシージャーについて見ていきましょう.
前節の@〜Dの関数のうち,プロシージャーに対応するものは,,,
BLRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM )
でしたね.
ここで,Bの関数を覗いてみましょう.
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM
lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
TCHAR szHello[MAX_LOADSTRING];
LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);
switch( message )
{
case WM_COMMAND:wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// メニュー選択の解析:
switch( wmId )
{
case IDM_ABOUT:
DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
break;
case IDM_EXIT:
DestroyWindow( hWnd );
break;
default:
return DefWindowProc( hWnd, message, wParam, lParam );}
break;case WM_PAINT:
hdc = BeginPaint (hWnd, &ps);
// TODO: この位置に描画用のコードを追加してください...
RECT rt;
GetClientRect( hWnd, &rt );
DrawText( hdc, szHello, strlen(szHello), &rt, DT_CENTER );
EndPaint( hWnd, &ps );
break;case WM_DESTROY:
PostQuitMessage( 0 );
break;default:
return DefWindowProc( hWnd, message, wParam, lParam );
}
return 0;
}
なんか長いコードがずらりと表示されました.しかし,焦ることはありません.
プロシージャーの意味を思い出してください.
メッセージループから送出されたメッセージを受け取り,そのメッセージに対応した処理をするんでしたよね!
じゃあ順番に見ていきましょう.
上のコードで色づけしたところが要点であります.
はじめに,
LRESULT CALLBACK WndProc(HWND
hWnd, UINT message, WPARAM wParam, LPARAM lParam)
ですが,
これは関数の戻り値と関数名と引数が書かれているんですよね.C言語を学んでいるならわかると思います.
ここで,引数のUINT messageってのが,メッセージループから受け取ったメッセージなんです!!
あとは,そのメッセージをどう処理するかだけです.
つぎに,
switch( message )
ですが,スイッチ文はわかりますよね?この場合,messageによって,処理を切り替えているわけです.
すなわち,ここでメッセージによって処理を変えることをしています.
最後に,
case WM_COMMAND:
case WM_PAINT:
case WM_DESTROY:
default:
ですが,これらはさきほどのスイッチ文からmessageが WM_COMMAND,WM_PAINT,WM_DESTROY なら各々の処理をしなさいっていう文ですよね.
しかし,,WM_COMMANDとかWM_PAINTって一体なんなんだ??と思うでしょう.
その説明は次節にしましょう.
------------------------------------------------------------------------------------------------
注)当ページの一部または全部を転載、複写、複製することを禁じます。
Update 04/01/29 By 松本義弘
------------------------------------------------------------------------------------------------