ハンドラ関数の削除

これまでの作業で、以下の様に、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行だけをコメントにすることを意味しています。コメントにした文は、文字の色が緑になるので、視覚的に確認できます。


戻る