質問: true; // m_moving_flag is member variable of View class CView::OnMouseMove(nFlags, point); return; } CView::OnMouseMove(nFlags, point); } ```
回答: TODOコメントにある通り、特に処理を追加しないのであれば、 ``` CView::OnMouseMove(nFlags, point); ``` を呼ばなければなりません。 MFCは基本的にはWindowsのGUIを構成するWindow Proceduresをラップしたものですので、Window Proceduresの仕様に従う必要があります。Using Window Procedures.aspx#designing_proc)で > > For messages that it does not process, the window procedure calls the **DefWindowProc** function. > > > と説明されているようにメッセージを処理しない場合はDefWindowProc().aspx)を呼び出す必要があります。MFCではCWnd::Default()にてその処理が実装されており、またCWnd::OnMouseMove()は`CWnd::Default()`ひいては`DefWindowProc()`を呼び出すように設計されています。 ですので、特に処理を追加しないのであればこの呼び出しを省略することはできません。 > > 「特に処理をする」というのは CDC* pDC = GetDC() を呼んで後にデバイスコンテキストを関係させるような処理なのでしょうか。 > > > この点、あいまいでした。一概に回答できません。 Window Proceduresをラップしたものですので、`CView::OnMouseMove()`はそれに対応するWM_MOUSEMOVE message.aspx)に説明されている処理を行う必要があります。といってもこの例に関していえば特にすべき処理は言及されていないため、処理したと考えてもいいのかもしれません。処理した場合は > > it should return zero. > > > を実現すればいいところですが...`CView::OnMouseMove()`ハンドラーは戻り値が`void`であり簡単にはいきませんので、やはり`CView::OnMouseMove(nFlags, point)`を呼ぶことでしょうか。 厳密な話をすると`wincore.cpp`に実装されている`CWnd::OnDndMsg()`は最初の行に ``` LRESULT lResult = 0; ``` とあり、その後、特に値を変更していないのでこの値が返されるようです。ここまで把握していれば`CView::OnMouseMove(nFlags, point)`を呼ばなくてもいいかもしれません。(私も回答するにあたって調べただけで普段は深く考えずに呼び出しています。)