CToolBar有这样的一个函数
_AFXEXT_INLINE CToolBarCtrl& CToolBar::GetToolBarCtrl() const
{ return *(CToolBarCtrl*)this; }
得到其内隐藏的CToolBarCtrl的引用,怎么this的内容就可以直接变成CToolBarCtrl的引用呢? 真是不可思议阿!

解决方案 »

  1.   

    CToolBar应该重载了CToolBarCtrl*操作符吧?
      

  2.   

    为什么不可以?
    怎么不配套了?
    class CControlBar : public CWnd
    class CToolBar : public CControlBarclass CToolBarCtrl : public CWnd很匹配啊,都是CWnd中的数据成员!
    仅仅是对这些数据的操作不一样!!
      

  3.   

    如果仅仅是指的是CWnd里面的数据成员,那当然是安全的,也是配套的,但是要知道CToolBarCtrl里面有自己的成员阿,CToolBar也有自己的数据成员,转过去的时候,不丢失么?
       照piaorenqian说,CEdit也可以转成CButton阿,都是CWnd派生类阿!
    ft
      

  4.   

    不知道你有没有看CToolBarCtrl的实现,它里面并没有自己另加的数据,只有另加的成员函数!!!!!!!
    成员函数并不在对象的内存空间中!!!
    该函数的目的就是要得到一个CToolBarCtrl对象,CToolBar转过去是要丢失一些数据,但你要明白这些丢掉的数据对CToolBarCtrl来说并不重要,它不需要这些数据!!!
      

  5.   

    这么和你解释吧:
    Class CWnd
    {
       int a;
       int b;
    }
    Class CToolBarCtr : public CWnd
    {
       //加了几个操作函数,没加自己的另外的数据成员
       int Opreate();
    }
    class CToolBarCtrl : public CWnd
    {
       int c;
       int d;
    }
    class CToolBar : public CControlBar
    {
       int e;
       int f;
    }
    现在CToolBar的对象中的数据成员有
    (a,b,c,d,e,f)
    CToolBarCtr的对象中的数据成员有(a,b)
    当CToolBar的对象向CToolBarCtr类型转换时,数据成员(c,d,e,f)
    被转换掉了,现在只能取(a,b)两个数据成员,而该两个成员正是
    CToolBarCtl所需要的,你说现在有问题吗!!!不知道这样解释,你还有问题吗????
      

  6.   

    楼上说的有一定道理,我想,当初微软设计CToolBar和CToolBarCtrl可能没有考虑得过分成熟其实_AFXEXT_INLINE CToolBarCtrl& CToolBar::GetToolBarCtrl() const
    { return *(CToolBarCtrl*)this; }
    主要要的是this的m_hWnd,有了这个东西,就可以和这个窗口发消息了!
    所以阿CToolBarCtrl里面的很多成员函数,都是发消息的方式实现的。
    这样,从CToolBar得到的CToolBarCtrl,只要其句柄可用,就可以了。