2009年05月26日

第0x02回 対話をするWindows・メッセージ

前回では、ウィンドウの表示を行いました。
しかし、一部説明していない部分がありました。
それが『メッセージ』です。

Windowsからアプリケーションに対するアクションは、
全てメッセージで行われます。
アプリケーションでは、そのメッセージを受け取り
実際の処理を決定します。
Windowsから通知されるメッセージは膨大で、

「ウィンドウがドラックされた」
「ウィンドウがクリックされた」
「キーが入力された」
「ファイルがドロップされた」
「スクリーンセイバーを起動しようとしている」
「シャットダウンに入る」
など、ウィンドウに関することからシステムに関することまで、
様々な事象がメッセージによって通知されます。
例えば、「スクリーンセイバーを起動しようとしている」という
メッセージを受け取った場合に、アプリケーションでそれを阻止する
といったことも可能になります。

また、アプリケーションからメッセージを発行することも可能です。
これにより、他のウィンドウの動作を制御したり、
直接Windowsに対して処理を促すことができます。


メッセージは、その膨大な量があるため
全てをリアルタイムに処理することが困難です。
そのため、各アプリケーションは、メッセージキューと言われる
メッセージを一時的に保存しておく場所が提供されています。
Windowsは、メッセージキューにメッセージを送ります。
アプリケーション側では、定期的にメッセージキューの中身を参照し、
処理に余裕がある場合に、メッセージを処理していきます。

この処理は、前回のサンプルの中にあった以下の部分がそれにあたります。

MSG stMsg;
while( GetMessage( &stMsg , NULL , 0 , 0 ) != 0 )
{
TranslateMessage( &stMsg );
DispatchMessage( &stMsg );
}


GetMessage()関数で、メッセージキューからメッセージを取り出し、
同時にそのメッセージをキューから削除します。
TranslateMessage()関数で、メッセージを適切に変換し、
DispatchMessage()関数で、メッセージをアプリケーション側で
処理します。

このとき、この中で直接メッセージ処理を書かず、
一度Windowsに処理を渡し、コールバックしてもらうというのが
ミソです。
Windowsでは、1つのアプリケーションで、複数のウィンドウを
持つことが可能です。
DispatchMessage()関数は、メッセージの内容によって
どのウィンドウに送られたものなのか判断し、
適切な場所へコールバックします。
これにより、プログラマは複数のウィンドウを
素直に管理することが可能になります。

コールバック関数は次のフォーマットで定義します。

LRESULT CALLBACK WndProc( HWND hWnd , UINT uMsg , WPARAM wParam , LPARAM lParam )
{
// 処理を行う
return 0;
}

ここではWndProc()というコールバック関数を定義しています。
ちなみに関数の名前は任意のものです。
引数について説明します。

第1引数
どのウィンドウからメッセージが送られたのかを示す
ウィンドウハンドルです。
例えば、クリックされたときの応答として、
Windowを非表示にする、などといったときにこのHWNDを使用します。

第2引数
メッセージの種類が入ります。
メッセージは実際には4バイトの符号なし整数値で、
switch文などで分岐させ、メッセージ処理を行います。
メッセージの一例として次のものがあります。
WM_LBUTTONDOWN : マウスの左ボタンが押し下げられたWM_LBUTTONUP : マウスの左ボタンが押し上げられたWM_RBUTTONDOWN : マウスの右ボタンが押し下げられたWM_RBUTTONUP : マウスの右ボタンが押し上げられた
WM_KEYDOWN : キーボタンが押し下げられた
WM_KEYUP : キーボタンが押し上げられた
WM_ACTIVATE : ウィンドウのアクティブ状態が変更されたことを通知
WM_PAINT : ウィンドウの内容を再描画するよう通知

第3引数
メッセージの内容を補足するパラメータが渡されます。
この内容はメッセージによって異なります。
例えばWM_KEYDOWNでは、入力されたキーの種類が入ります。

第4引数
メッセージの内容を補足するパラメータが渡されます。
この内容はメッセージによって異なります。
例えばWM_LBUTTONDOWNでは、マウスの座標が入ります。

ここまでが、Windowsのプログラムを行う上での作法になります。
これらはどのプログラムにも何かしらの形ででてきますので、
定型文として覚えてしまってもよいと思います。

試しに、前回のサンプルにマウスをクリックしたときのメッセージ処理を
追加してみましょう。
次のようになります。

sample002.cpp(ソースコードのみ)
sample002.zip(VS.NET 2008プロジェクト)



MessageBox( hWnd , szMessage , TEXT("確認") , MB_OK | MB_ICONINFORMATION );


これは、メッセージボックスを表示する関数です。
第1引数は、メッセージボックスの親ウィンドウハンドルを指定します。
第2引数は、メッセージボックスの本文を指定します。
第3引数は、メッセージボックスのタイトルを指定します。
第4引数は、メッセージボックスのタイプを指定します。

サンプルでは、WM_LBUTTONDOWNメッセージの処理を追加しています。
これにより、ウィンドウをクリックしたことにより
メッセージボックスを表示するプログラムが記述できました。


次回はウィンドウに線などを描画するプログラムについて
解説したいと思います。


ラベル:ふわ猫
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。