我现在重绘了窗口的标题栏,可是代码实在太多太乱,我想将它另做为一个类,直接调用就可以了,怎么做?尤其是里面还有各种消息映射,OnNcPaint(),OnSize(),OnPaint()如此种种,这样的消息映射又如何映射到我的子类中,具体怎么做?最好给一下示例源码,本人新手,谢谢。界面对象重绘WTL

解决方案 »

  1.   

    这样的消息映射又如何映射到我的子类中。
    wtl有个很大的优点:消息嵌入
    CHAIN_MSG_MAP(BaseClass)
      

  2.   

    我就是做wtl的。例子的话,我写个最简单的吧
    class Base : public CWindowImpl<Base>
    {
    public:
    BEGIN_MSG_MAP(Base)
      MSG_WM_LBUTTONDOWN(OnLButtonDown)
    END_MSG_MAP()
    private:
      void OnLButtonDown(UINT,CPoint){}
    };
    class Label : public Base
    {
    BEGIN_MSG_MAP(Label)
      CHAIN_MSG_MAP(Base)  你转到源代码可以看实现代码,其实就是switch。这么做之后,Label也可以响应OnLButtonDown
      MSG_WM_PAINT(OnPaint)
    END_MSG_MAP()
    private:
      void OnPaint(CDCHandle){}
    };
      

  3.   

    BEGIN_MSG_MAP(Label)
      CHAIN_MSG_MAP(Base)  你转到源代码可以看实现代码,其实就是switch。这么做之后,Label也可以响应OnLButtonDown --> 这是什么意思
      MSG_WM_PAINT(OnPaint)
    END_MSG_MAP()
      

  4.   

    实际上是这样的:我在CMainDlg里面声明了一个CMyUI m_uiDlg;属性,我想在CMyUI这个类里面实现对CMainDlg界面的控制,这就需要将CMainDlg里面的消息映射到CMyUI中去,对吧,怎么做,我也是做WTL的,刚从MFC转过来,感觉好别扭
      

  5.   

    你的意思就是让CMyUI来处理CMainDlg的消息?
    这不就是我上面说的,要通过继承和嵌入来完成,而不是成员变量。
      

  6.   

    类的属性就是成员变量的意思,大家懂的吧,就是我想通过在类CMyUI里面就实现重绘CMainDlg的功能,怎么做,能用的话果断加分,谢谢
    class CMainDlg
    {
    ...
    CMyUI m_uiDlg;
    ...
    };class CMyUI
    {
    /* 怎么做? */
    }
      

  7.   

    不说了,你自己去尝试。
    template <class T>
    class PaintImpl
    {
    public:
    BEGIN_MSG_MAP(PaintImpl)
      MESSAGE_HANDLE(WM_PAINT,OnPaint)
    END_MSG_MAP()
    private:
      LRESULT OnPaint(UINT,WPARAM,LPARAM,BOOL&)
    {
    T* t = (T*) this;
    CPaintDC dc(t->m_hWnd);
    dc.TextOut(10,10,"Just try");
    }
    };
    class CMainDlg: public CDialogImpl<CMainDlg>, public PaintImpl<CMainDlg>
    {
    public:
    BEGIN_MSG_MAP(CMainDlg)
      CHAIN_MSG_MAP(PaintImpl<CMainDlg>)  
    END_MSG_MAP()
    };
    ok。