メッセージ

イベント
イベント:
マウスの操作、キーボードの操作、ファイル操作など
システムやユーザーからの入力・出力のこと
Windowsは、イベントに応じて動作するOS
イベントドリブン
Windowsのアプリケーションもイベントドリブン
メッセージ
• 発生したイベントをWindowsやアプリケーショ
ンに伝える時に、イベントの内容を表すデー
タをメッセージという。
• メッセージには、
– マウスが動かされたことを知らせるメッセージ、
– 窓が閉じられてその部分を描画しなおすことをし
らせるメッセージ
などがある。
メッセージの発生
• キーボードが操作されたりマウスが動作した
ときなどのイベントが発生したとき、そのイベ
ントをあらわすメッセージが発生する。
• アプリケーションの起動や終了、窓の移動な
どもイベントであり、やはりメッセージが発生
する。
• キーボードやマウスの操作に関しては、それ
らの装置を扱うドライバプログラムが、
Windowsに対してメッセージを発生する。
メッセージ処理1
• メッセージはまず、Windowsが受け取る。
• Windowsは受け取ったメッセージの内容を確
認する。
• 内容がシステム関連の場合はそのまま処理
を実行する。
• 内容がアプリケーション向けの場合は、
そのアプリケーションにメッセージを転送する。
メッセージ処理2
• 例:マウスが動作中のアプリケーションのボタン1の
上にあるときにクリックされた場合
1.マウスの座標とクリックされたことを伝えるメッセージ
がマウスドライバから発生
2.Windowsがメッセージをうけとる。
3.Windowsはマウスの座標と自分の管理情報から、
マウスがクリックされたアプリケーションを特定
4.メッセージをアプリケーションに転送する。
5.アプリケーションはメッセージを受けて、ボタン1がク
リックされたことを知る。
6アプリケーションはボタン1がクリックされたときのイ
ベントハンドラを実行する。
アプリケーションでの
メッセージ処理1
• Windowsのアプリケーション
– WinMain関数の内部にメッセージループという
部分を持っている。
– また、メッセージを処理するためのウィンドウプロ
シージャという関数を持っている。
– Windowsからのメッセージは、各アプリケーショ
ンのWinMain関数におくられる。
アプリケーションでの
メッセージ処理2
メッセージループ の例:
while (GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
GetMessage()関数
• アプリケーションは、キューという箱をもっており、この
箱にWindowsからメッセージが送られてくる。メッセー
ジはFIFO(先入れ先だし)で処理される。
• GetMessage()関数は、このキューをのぞいてメッ
セージを確認する。メッセージがなければ、新しいメッ
セージが届くまで待つ。メッセージがある場合や届い
た時は、それをチェックする。
そのメッセージの内容が、アプリケーションの終了であ
れば、このループを抜けてアプリケーションを終わる。
それ以外のメッセージノ場合は、ループを続ける。
TranslateMessage()関数
• TranslateMessage()関数は、受け取った
メッセージの内容におうじて、そのメッセージ
を文字列に変換する。
DispatchMessage()関数
• DispatchMessage()関数は、受け取ったメッ
セージを、メッセージを処理するためのウィン
ドウプロシージャという関数に送る。
ウィンドウプロシージャ
• アプリケーションに届いたメッセージを処理する関数。
窓ごとにある。
• 例:
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam,
LPARAM lParam)
{
switch(msg)
{
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, msg, wParam, lParam);
}
return 0L;
}
ウィンドウプロシージャ
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM
lParam)
{
switch(msg)
{
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, msg, wParam, lParam);
}
return 0L;
}
msgにはDispatchMessage()関数で
メッセージループから送られたメッセージが 入る。
ウィンドウプロシージャ
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM
lParam)
{
switch(msg)
{
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, msg, wParam, lParam);
}
return 0L;
}
msgの内容がWM_DESTROY(終了ボタンを押した
時のメッセージ)の場合、 PostQuitMessage関数をつ
かって、WM_QUITメッセージが発行される。
このメッセージがメッセージループで受け取られて、ア
プリケーションの終了が開始される。
ウィンドウプロシージャ
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM
lParam)
{
switch(msg)
{
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, msg, wParam, lParam);
}
return 0L;
}
その他のメッセージについては、DefWindowProc()関
数で標準的な処理をしている。
ウィンドウプロシージャ
BCBの場合
• BCBではメッセージ処理をユーザーには見せずにカ
プセル化してある。
• BCBにおいては、イベントハンドラとして各イベント
に対応した関数を記述できる。
• イベントハンドラはヘッダーファイルに自動的に登録
される。
• 登録された時に、対応したメッセージとそのメッセー
ジに対する項目が隠されたウィンドウプロシージャ
に自動的に記述される。そして、メッセージループは
Application->Run()関数の中で実装されており、
ユーザーには見えない。
IE
WORD
Windows
キーボードドライバ
マウスドライバ