20528


MFCでプログラミングをしていますが、クラスウィザードでハンドラーを追加すると以下のようなコードが追加されると思います。

[code]

        void CSampleView::OnMouseMove(UINT nFlags, CPoint point)
        {
          // TODO: ここにメッセージ ハンドラ コードを追加するか、既定の処理を呼び出します。
          CView::OnMouseMove(nFlags, point);
        }
    
[/code]

例えばこれを

[code]

        void CSampleView::OnMouseMove(UINT nFlags, CPoint point)
        {
          // TODO: ここにメッセージ ハンドラ コードを追加するか、既定の処理を呼び出します。
          return;
          CView::OnMouseMove(nFlags, point);
        }
    
[/code]

などとした場合、何か不具合があるのでしょうか。これはTODOで書かれている「既定の処理」であり自分の処理をする場合、無視してもよいものでしょうか。  
CViewのメンバ関数をF12でたどってもインラインのよくわからない記述しかなく、余計な関数であれば呼びたくないのですが。あまり経験がないのでよくわからないというところです。

* * *

コメントのMarkdownが機能しないので、ここに書いておきます。

[code]

    void CSampleView::OnMouseMove(UINT nFlags, CPoint point)  
    {  
      // TODO: ここにメッセージ ハンドラ コードを追加するか、既定の処理を呼び出します。  
      if(point.x>0)
      {
        m_moving_flag = true;    // m_moving_flag is member variable of View class
        CView::OnMouseMove(nFlags, point);
        return;
      }
      CView::OnMouseMove(nFlags, point);
    }
    
[/code]


CC BY-SA 3.0
2016-01-02T02:33:15.550
20527
2016-01-02T12:33:55.777
2016-01-02T08:33:45.217
8000
5835
question
c++ windows mfc
MFCで自動生成されるCViewのメンバ関数を呼ばないとどうなるか


TODOコメントにある通り、特に処理を追加しないのであれば、

[code]

    CView::OnMouseMove(nFlags, point);
    
[/code]

を呼ばなければなりません。

MFCは基本的にはWindowsのGUIを構成するWindow Proceduresをラップしたものですので、Window
Proceduresの仕様に従う必要があります。[Using Window
Procedures](https://msdn.microsoft.com/en-
us/library/ms633570\(v=vs.85\).aspx#designing_proc)で

> For messages that it does not process, the window procedure calls the
> **DefWindowProc** function.

と説明されているようにメッセージを処理しない場合は[DefWindowProc()](https://msdn.microsoft.com/en-
us/library/ms633572\(v=vs.85\).aspx)を呼び出す必要があります。MFCでは[CWnd::Default()](https://msdn.microsoft.com/ja-
jp/library/ww9f7hst.aspx)にてその処理が実装されており、また[CWnd::OnMouseMove()](https://msdn.microsoft.com/ja-
jp/library/3158baat.aspx)は`CWnd::Default()`ひいては`DefWindowProc()`を呼び出すように設計されています。  
ですので、特に処理を追加しないのであればこの呼び出しを省略することはできません。

* * *

> 「特に処理をする」というのは CDC* pDC = GetDC() を呼んで後にデバイスコンテキストを関係させるような処理なのでしょうか。

この点、あいまいでした。一概に回答できません。  
Window Proceduresをラップしたものですので、`CView::OnMouseMove()`はそれに対応する[WM_MOUSEMOVE
message](https://msdn.microsoft.com/en-
us/library/ms645616\(v=vs.85\).aspx)に説明されている処理を行う必要があります。といってもこの例に関していえば特にすべき処理は言及されていないため、処理したと考えてもいいのかもしれません。処理した場合は

> it should return zero.

を実現すればいいところですが…`CView::OnMouseMove()`ハンドラーは戻り値が`void`であり簡単にはいきませんので、やはり`CView::OnMouseMove(nFlags,
point)`を呼ぶことでしょうか。

厳密な話をすると`wincore.cpp`に実装されている`CWnd::OnDndMsg()`は最初の行に

[code]

    LRESULT lResult = 0;
    
[/code]

とあり、その後、特に値を変更していないのでこの値が返されるようです。ここまで把握していれば`CView::OnMouseMove(nFlags,
point)`を呼ばなくてもいいかもしれません。（私も回答するにあたって調べただけで普段は深く考えずに呼び出しています。）


CC BY-SA 3.0
2016-01-02T03:33:20.770
20528
2016-01-02T12:33:55.777
2016-01-02T12:33:55.777
4236
4236
20527
answer