C:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\include\afxrich.inl_AFXRICH_INLINE CRichEditCtrl& CRichEditView::GetRichEditCtrl() const
{ return *(CRichEditCtrl*)this; }这是CRichEditView类的成员函数,返回CRichEditView类对象包含的CRichEditCtrl对象的引用。本来没什么稀奇,但是函数代码怎么也看不懂。1,CRichEditCtrl* ,这个星星是什么意思?
2,return *(CRichEditCtrl*)this,函数要求返回CRichEditCtrl&,而this是CRichEditView对象的地址。CRichEditCtrl不是一个CRichEditView的基类,它们倒是有共同的基类CWnd,但毕竟是2个分支,也不是一回事啊,怎能强制转换呢?

解决方案 »

  1.   

    1.指针
    2.看看你的这个类是不是继承了CRichEditCtrl类,自己实现的一个富文本控件类。
      

  2.   

    先谢谢两位,第1个问题我明白了。
    关键是第2个问题,CRichEditView是MFC的类,他当然不是继承CRichEditCtrl(也是MFC的类)类。CObject->CCmdThread->CWnd
                             ->CView->CCtrlView->CRichEditView
                             ->CRichEditCtrl这是这两个类的继承图谱。CRichEditCtrl特有的函数,比如GetLine,这个在CRichEditCtrl对象(就是代码中的this的地址指向的对象)的内存的代码区中是不存在的。如果把它们强制转换,我觉得调用GetLine这样样的函数一定会有问题的。但是代码运行的很好,这让我很不解。
      

  3.   

    刚才写错了一点:
    比如GetLine,这个在CRichEditView对象(就是代码中的this的地址指向的对象)的内存的代码区中是不存在的
      

  4.   


    看看这个CRichEditView有没有重载(CRichEditCtrl*)运算符?如果它重载了这个运算符,重载函数中简单地返回了CRichEditCtrl也是说得过去的。
      

  5.   

    (CRichEditCtrl*)this这个是类型转换
    *(CRichEditCtrl*)this这个是取地址
      

  6.   

    // CRichEditView
    // NOTE: The cast in GetRichEditCtrl is ugly, but must be preserved for compatibility.
    // CRichEditCtrl is not related to CRichEditView by inheritance so we must be careful to ensure 
    // that CRichEditCtrl remains a binary compatible subset of CRichEditView.我找到了这个函数的注释。函数的作者也认为这个转换比较难看,要小心保证他们兼容才行。但要怎么小心,怎么保持兼容,他就没说了。
      

  7.   

    MFC的代码太专业了,看不懂,顶~~~
      

  8.   


    我想仿照它的做法,放到自己的代码里。然后把CRichEditCtrl的window控件窗口子类化,就是把它的窗口过程勾到自己的窗口过程中。
    唉,说了这么多,其实就像在在文档视图结构中中处理richedit2.0控件的消息;而且还想用CRichEditView 提供的各种便利功能。除了这么做,还有别的思路么?