<Previous> <Next> <SDK Top> <Top>
1章.6節.メッセージループ
あのアプリケーションのプログラムでは,どのような関数があったかを思い出してください.
@ATOM MyRegisterClass( HINSTANCE hInstance )
ABOOL InitInstance( HINSTANCE, int )
BLRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM )
CLRESULT CALLBACK About( HWND, UINT, WPARAM, LPARAM )
Dint APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow )
といった感じの5つの関数がありました.
ここで,Bの関数がプロシージャーであり,Dの関数の中にメッセージループがあります.
ちょっと見てみましょう.
Dの関数の中を見てみると,こんなコードがありました.
// メイン メッセージ ループ:
while( GetMessage(&msg, NULL, 0, 0) )
{
if( !TranslateAccelerator (msg.hwnd, hAccelTable, &msg)
)
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
}
ちゃんとコメントでメッセージループって書いてくれてましたね...
ここのコードを解釈すると,
GetMessage関数で,Windowsから送られたメッセージを取得(Get)してきて,
(TranslateAccelerator,TranslateMessage関数は,今あんまり気にする必要ないです.)
DispatchMessage関数で,メッセージをプロシージャ−に送出(Dispatch)します!
それをwhile文でひたすら繰り返しています.
ちゃんとメッセージループとしての役割を果たしていることがコードからわかりました.
次回はプロシージャーについて述べていきたいと思います!!
※補足:TranslateAccelerator,TranslateMessage関数が気になる方へ
!TranslateAccelerator(msg.hwnd,
hAccelTable, &msg):
アクセラレーター(メニューコマンドつまりAlt+Fでメニューバーの[ファイル]が開くなど)に対するメッセージであれば,それに対応する処理を実行して,プロシージャ−にはメッセージを送らないという仕組みになっている.
TranslateMessage( &msg ):
仮想キーメッセージを文字メッセージへ変換します.
詳しいことはわかりませんが,キーボードが押されたというメッセージから文字メッセージを生成してくれる関数みたいです.
------------------------------------------------------------------------------------------------
注)当ページの一部または全部を転載、複写、複製することを禁じます。
Update 04/01/28 By 松本義弘
------------------------------------------------------------------------------------------------