我先实现一个自定义的Tab View控件,继承自CTabViewImpl,重绘其Tab标签。发现CTabViewImpl的CTabCtrl m_tab成员变量就是其tab标签,但是我用自定义的TabCtrl类SubclassWindow(m_tab),实现tab的重绘,发现不会调用自定义类的绘制函数,还是调用了CTabCtrl中的绘制函数。

解决方案 »

  1.   

    目前只能收到Destroy消息,其他WM_PAINT等消息收不到
      

  2.   

    父窗口有这个  宏吗?
    REFLECT_NOTIFICATIONS()
      

  3.   

    3楼说的对,要在BEGIN_MSG_MAP中加入REFLECT_NOTIFICATIONS(),否则子控件收不到消息。
      

  4.   

    BEGIN_MSG_MAP(CZyTabCtrl)
    REFLECT_NOTIFICATIONS()
    MESSAGE_HANDLER(WM_PAINT, OnPaint)
    MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
    MESSAGE_HANDLER(WM_DRAWITEM, OnDrawItem)
    MESSAGE_HANDLER(WM_SIZE, OnSize)
    END_MSG_MAP()
    是不是这样加,还是没反应。我在上面下了断点,如果有消息的话不管有没有自定义处理函数都会运行到该断点,但是现在只在控件Destroy时候才有消息
      

  5.   

    在的地方不对吧,应该这样:
    比如你有一个窗体,窗体上面有一个子控件,需要子控件处理消息,要在窗体的消息映射里加
    REFLECT_NOTIFICATIONS(),然后子控件的消息可以被处理:
    例如:
     BEGIN_MSG_MAP(CCaptionWnd)
      MESSAGE_HANDLER(WM_PAINT, OnPaint)
      MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBkgnd)
      MESSAGE_HANDLER(WM_SYSCOLORCHANGE, OnSysColorChange)
      MESSAGE_HANDLER(WM_SIZE, OnSize)
      COMMAND_ID_HANDLER(IDC_FLAT_BUTTON, OnFlatButton)
      REFLECT_NOTIFICATIONS() // required by owner drawn buttons
      MESSAGE_HANDLER(WM_COMMAND, OnCommand)
     END_MSG_MAP()CCaptionWnd 是一个窗口,IDC_FLAT_BUTTON是上面的一个自绘的按钮子控件。
      

  6.   

    我是重载了一个tab控件,想响应他的WM_PAINT消息进行重绘。我用subclasswindow方法子类化那个控件,但是没有办法响应他的绘制消息,只响应到销毁的消息。我使用wtl
      

  7.   

    找到原因了,程序里面有两个View类,一个是CTabView,另一个是自定义的view类,继承自CTabViewImpl。CTabView管理所有的自定义view对象。之前是子类化了自定义view类的tab控件,实际界面上的tab控件是属于CTabView的。低级的错误。
    谢谢各位的帮助