メッセージ(message)

マウスを扱います。クライアント領域(ウィンドウの白地の領域)の適当なところをクリックをしたときに、クライアント領域に文字を表示させるようにします。なお、OnPaintは

void CMainFrame::OnPaint()
{
	CPaintDC dc(this);

	dc.TextOut(0, 0, "Hello World!");
}

と元にもどしておきます。

次の作業を行ってください。

1. メニューから表示->ClassWizardを選択すると、次のようなMFC ClassWizardというダイアログが現れます

2. このダイアログの右上に"クラス名"というコンボボックスを見つけて、そのなかがCMainFramになっていることを確かめましょう。もし、そうでなければ、コンボボックスの右にある、黒い下向きの三角を押すと、CMainFramが現れるので、それをマウスで選択します。

3.ダイアログの右の中程にあるメッセージというリストボックスを見つけ、その右にあるスクロールバーをマウスで移動させて、WM_RBUTTONDOWN(これがメッセージです)という項目を見つけ、それをクリックして選択してください(上図のように文字の色が反転します)。

4.ここで、関数の追加ボタンをクリックするか、あるいはリストボックスのなかのWM_RBUTTONDOWNをダブルクリックすると、ダイアログの左下にあるメンバー関数というリストボックスに、OnRButtonDown ON_WM_RBUTTONDOWNが追加されます。これを確認した後に、OKボタンを押すと、ダイアログが消えます。

5. もとのプログラム(test.cpp)に戻り、OnPaint() の後に、

void CMainFrame::OnRButtonDown(UINT nFlags, CPoint point)
{
	// TODO: この位置にメッセージ ハンドラ用の
	コードを追加するかまたはデフォルトの処理を呼び出してください 

	CFrameWnd::OnRButtonDown(nFlags, point);
} 

なる関数が追加されていることを確認してください。

6. この関数の// TODO:から始まる1行を消して、次のようにCClientDC dc(this);とdc.TextOut(20, 0, "マウスが押下されました");なる2行を追加します。

void CMainFrame::OnRButtonDown(UINT nFlags, CPoint point)
{
	CClientDC dc(this);

	dc.TextOut(0,20, "マウスが押下されました");
	CFrameWnd::OnRButtonDown(nFlags, point);
}

7. ここで、プログラムを実行します。すると、クライアント領域に、文字列"Hello World!"が現れているウィンドウが現れます。このとき、クライアント領域内部でマウスで右クリックすると、文字列"マウスが押下されました"が現れるはずです。

以上のようなプログラミングの仕方が、ウィンドウ プログラミングの基礎となります。

マウスの右ボタンを押すとか、メニューを選択するなど、各種のイベント(event:出来事)を我々が引き起こした時に、その情報はWindows(OSです。ウィンドウとは別物です。)が把握します。Windowsは適当なときに、我々が作ったウィンドウに(本当はウィンドウに対応するクラスの実体に)対して、メッセージという形でイベントが起こったことを知らせてきます。例えば、マウスの右ボタンを押したときには、WindowsOSは適当なときに、我々が作ったウィンドウにWM_RBUTTONDOWNというメッセージを送ってきます。 ウィンドウがこのメッセージを受け取ると、それに対応した関数が実行されるように仕掛けられています。今の場合、ClassWizardで、WM_RBUTTONDOWNに対応するような関数OnRButtonDownを追加したことにより、この仕掛が働くようになりました。だんだん分かってくると思いますが、このような関数の中身を適当にプログラミングすれば、思うような働きをするプログラムを作ってゆけます。

メッセージは数多くあります。しかし、それらすべてのメッセージに対応する関数を追加する必要はありません。メッセージに対応した関数を追加しない限り、ウィンドウは、そのメッセージを無視するからです。結局、必要なメッセージに対してだけ、関数を書いておけばよいわけです。

ところで、関数OnRButtonDownで、CClientDC dc(this);という1行があります。これは、関数OnPaintでのCPaintDC dc(this);に対応するものです。専門家が違います(dcは同じだと思われるかもしれませんが、違う関数内では、違うと認識されます)。CPaintDC dc(this);は関数OnPaintの中だけで、それ以外の関数の中ではCClientDC dc(this);を使います。


戻る