これまでの作業で、以下の様に、WM_PAINTとWM_RBUTTONDOWNというメッセージに対応する2つの関数OnPaintとOnRButtonDownができていると思います。
void CMainFrame::OnPaint() { CPaintDC dc(this); dc.TextOut(0, 0, "Hello World!"); } void CMainFrame::OnRButtonDown(UINT nFlags, CPoint point) { CClientDC dc(this); dc.TextOut(0,20, "マウスが押下されました"); CFrameWnd::OnRButtonDown(nFlags, point); }
このようなメッセージに対応する関数は、メッセージ ハンドラ関数と呼ばれています。以下では、簡単にハンドラ関数と呼ぶことにしましょう。
プログラミング時には間違いがつきものです。上の例では右クリックをしたときに、クライアント領域に文字を表示させるように関数OnRButtonDownを追加しました。ところが、これは間違いで、"本当は右クリックでなく左クリックにしたかった"ということが起こり得ます。このような場合、まずウィンドウがメッセージWM_RBUTTONDOWNを受け取らないようにし、その後、関数OnRButtonDownを削除する必要があります。具体的には以下のようにします。
1. メニューから表示->ClassWizardを選択して、MFC ClassWizardというダイアログを出します。
2. "クラス名"というコンボボックスのなかが、CMainFramになっていることを確かめます。もし、そうでなければ、右側の、黒い下向きの三角を押すと、CMainFramが現れるので、それをマウスで選択します。
3.メンバー関数というリストボックスに、OnRButtonDown ON_WM_RBUTTONDOWNなる項目がありますので、これをマウスでクリックして選択します(文字の色が反転します)。そして、"関数の削除"ボタンを押すと、"このハンドラを削除すると....."というダイアログボックスが現れるので、"はい"ボタンをクリックします。 これで、ウィンドウはWM_RBUTTONDOWNというメッセージ受け取らなくなりました。
4. 次に、test.cppの中の以下の部分を、すべて削除します。
void CMainFrame::OnRButtonDown(UINT nFlags, CPoint point) { CClientDC dc(this); dc.TextOut(0,20, "マウスが押下されました"); CFrameWnd::OnRButtonDown(nFlags, point); }
これで、ハンドラ関数OnRButtonDownの削除ができました。(注)
それでは、左クリックをしたときに、クライアント領域に文字を表示させるには、どうしましょう。そうです、MFC ClassWizardでメッセージWM_LBUTTONDOWNに対応するハンドラ関数OnLButtonDownを追加するだけです。もちろん、関数の中にはCClientDC dc(this);とdc.TextOut(...);が必要です。プログラムを実行して、思い通りになっていることを確かめましょう。
注意:削除と書きましたが、以下のようにコメントにしても結構です。
/* void CMainFrame::OnRButtonDown(UINT nFlags, CPoint point) { CClientDC dc(this); dc.TextOut(0,20, "マウスが押下されました"); CFrameWnd::OnRButtonDown(nFlags, point); } */あるいは、
//void CMainFrame::OnRButtonDown(UINT nFlags, CPoint point) //{ // CClientDC dc(this); // // dc.TextOut(0,20, "マウスが押下されました"); // CFrameWnd::OnRButtonDown(nFlags, point); //}
とします。ここで、/*と*/に囲まれた部分は、プログラム上、無いものとして(コメントcomment:注釈)扱われます。また、//は1行だけをコメントにすることを意味しています。コメントにした文は、文字の色が緑になるので、視覚的に確認できます。