[Visual C++シリーズ]1.2 Windowsメッセージメカニズムの理解



1.2 Windowsメッセージメカニズムの理解
Windowsシステムはメッセージ駆動のOSですが、メッセージとは何ですか?私ははっきり言えないし、次の定義も難しいです(誰が私を嘘をついているのか)、私は次のいくつかの面から説明します.皆さんが見てから少し理解してほしいです.
1、メッセージの構成:一つのメッセージは一つのメッセージ名(UINT)と二つのパラメータ(WPARAM、LPARAM)からなる.ユーザーが入力したか、ウィンドウのステータスが変更されると、システムはウィンドウにメッセージを送信します.例えばメニューが回ったらWM_COMMANDメッセージ送信、WPARAMのハイフン中(HIWORD(wParam))はコマンドのID番号であり、メニューにとってはメニューIDである.もちろん、ユーザは独自のメッセージ名を定義したり、カスタムメッセージを利用して通知や転送データを送信したりすることもできます.
2、誰がメッセージを受け取るか:メッセージはウィンドウで受信する必要があります.ウィンドウのプロセス(WNDPROC)では、メッセージを分析し、自分の興味のあるメッセージを処理することができます.例えば、メニュー選択を処理したい場合は、WM_を定義できます.COMMANDで処理するコードは、ウィンドウでグラフィック出力を行うにはWM_PAINTは処理を行う.
3、未処理のメッセージはそこに行きました:M$はウィンドウのためにデフォルトのウィンドウプロセスを編纂して、このウィンドウプロセスはあなたがメッセージを処理しないことを処理する責任を負います.このデフォルトのウィンドウプロセスがあるからこそ、ウィンドウの様々なメッセージの処理にあまり注目する必要がなく、Windowsのウィンドウを利用して開発することができます.たとえば、ウィンドウがドラッグされると多くのメッセージが送信され、システムが自分で処理するのを相手にしないことができます.
4、ウィンドウハンドル:メッセージといえばウィンドウハンドルを言わざるを得ない.システムはウィンドウハンドルを通じてシステム全体で唯一1つのウィンドウを識別し、1つのメッセージを送信する時、1つのウィンドウハンドルを指定してそのメッセージがそのウィンドウによって受信されたことを示す必要がある.各ウィンドウには独自のウィンドウプロシージャがあるため,ユーザの入力は正しく処理される.たとえば、2つのウィンドウが1つのウィンドウプロシージャコードを共有している場合、ウィンドウをマウスで押すと、ウィンドウ1のハンドルを通じてウィンドウ2ではなくウィンドウ1にメッセージが送信されます.
5、例:以下の疑似コードはウィンドウの過程でメッセージを処理する方法を示している
LONG yourWndProc(HWND hWnd,UINT uMessageType,WPARAM wP,LPARAM)
{
	switch(uMessageType)
	{//  SWITCH         
		case(WM_PAINT):
			doYourWindow(...);//              
		break;
		case(WM_LBUTTONDOWN):
			doYourWork(...);//             
		break;
		default:
			callDefaultWndProc(...);//              
		break;
	}
}

次に、メッセージ・メカニズムとは何かについて説明します.システムは1つ以上のメッセージ・キューを維持し、生成されたすべてのメッセージがキューに戻されるか、挿入されます.システムは、各メッセージをキューから取り出し、メッセージの受信ハンドルに基づいてウィンドウを持つプログラムにメッセージループを送信します.各実行プログラムには独自のメッセージループがあり、ループで独自のメッセージを取得し、受信ウィンドウのハンドルに基づいて対応するウィンドウプロシージャを呼び出す.メッセージがない場合はメッセージループが制御権をシステムに渡すので、Windowsでは複数のタスクを同時に行うことができます.次の疑似コードは、メッセージ・ループの使用方法を示しています.
while(1)
{
	id=getMessage(...);
	if(id == quit)
		break;
	translateMessage(...);
}


プログラムにメッセージ通知がない場合getMessageは返されず、システムのCPU時間も消費されません.次の図はメッセージ配信モードです
16ビットのシステムにはメッセージキューが1つしかないため、現在のタスクがメッセージを処理するのを待ってから、次のメッセージを対応するプログラムに送信する必要があります.プログラムがデッドサイクルや時間のかかる操作に陥ると、システムは制御権を得ることができません.このようなマルチタスクシステムは、協同型のマルチタスクシステムとも呼ばれる.Windows3.Xはこのシステムです.
32ビットのシステムでは、実行されるプログラムごとにメッセージキューが1つあるため、現在のプログラムがメッセージ処理を完了するのを待つことなく、複数のメッセージキューで変換することができ、制御権を得ることができます.このマルチタスクシステムをプリエンプト型マルチタスクシステムと呼ぶ.Windows 95/NTはこのシステムです.