我建立了一个基于FormView的单文档视图(CWatchView),然后在这个上面放了一个tab控件(m_tab),然后我又建了一个对话框CMyDlg类,然后在CWatchView生成两个基于CMyDlg类的对象m_dlg1,m_dlg2.然后把对话框贴到m_tab控件的两个标签上。
我现在想在CMyDlg类里面绘图,但是数据是在文档类CWatchDoc中,我该怎么做才能调用到这些数据呢?
我现在是在CMyDlg类的OnPaint()加了一句CWatcher1Doc* pDoc = GetDocument();(文件头也加了#include "Watcher1Doc.h"),但是我发现对话框类里面没有GetDocument()函数,所以无法实现,该怎么办呢????
是不是还要修改CWatcher1App类中的CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CWatcher1Doc),
RUNTIME_CLASS(CMainFrame),       // main SDI frame window
RUNTIME_CLASS(CWatcher1View));这里是不是要改成RUNTIME_CLASS(CMyDlg));????
AddDocTemplate(pDocTemplate);

解决方案 »

  1.   

    在CMyDlg中传递CMainFrame* 等进去,然后GetActiveView()->GetDocument()
      

  2.   

    CMyDlg的构造函数中定义个参数等来传递pMainFrame
    CMyDlg dlg(pMainFrame);
      

  3.   

    是不是把对话框看作是一个View?即相当于一个单文档多视图程序,对话框和视图都是它的一个视图?那传递路径不考虑tab控件啦?
      

  4.   

    对话框相当于另一个东西啊,tab控件还是属于你的view,只不过你把view传递给对话框,好让它们来进行view的一些操作等...
      

  5.   

    那怎么把view传递给对话框?不好意思,初学者
      

  6.   

    还是前面类似的方式,view传递给tab的构造函数,tab增加CMyDialog的时候,传递view给对话框,也可以用构造函数..
    这就等于就是一步步传递过去 view -> tab -> Dialog
      

  7.   

    我在CMyDlg类中添加了一个成员变量:CMainFrame* p_Frame;头文件也加上了#include "MainFrame.h",为什么老是报错呢?
      

  8.   

    利用父子关系,对话框GetParent获得Tab指针,再GetParent获得视图指针,再GetDocument获得文档指针;
    或者AfxGetMainWnd获得框架类指针,再GetActiveView获得视图指针,再GetDocument获得文档指针。
      

  9.   

    但是还是不会写这点程序,你看看这样对不对:
    在CMyDialog类中定义
    CMyTabCtrl *m_tab;//定义一个指向tab控件的指针
    m_tab=GetParent(this);
    CWatchView *m_view;//定义一个指向view的指针
    m_view=GetParent(m_tab);
    CWatchDoc *m_Doc;//定义一个指向Doc的指针
    m_view=GetDocument(m_Doc);不知道这样写对不对呢?麻烦帮忙修改一下,好吗?谢谢
      

  10.   

    我看了看MSDN,里面定义的GetParent()函数的参数是HWND,GetParent(this);这样写肯定是错的吧?
      

  11.   

    CWatchDoc* m_Doc = (CWatchDoc*)((CView*)GetParent()->GetParent())->GetDocument();
      

  12.   

    或者:
    CWatchDoc* m_Doc = (CWatchDoc*)((CFrameWnd*)AfxGetMainWnd())->GetActiveView()->GetDocument();
      

  13.   

    这样为什么也不行呢?
    在CMyDialog类中定义 
    HWND pwnd=GetSafeHwnd();//获取对话框的句柄
    HWND pwnd1=GetParent(pwnd);//获取tab控件的句柄,这里老有错误error C2660: 'GetParent' : function does not take 1 parameters,可是GetParent却是只有一个参数啊?
    HWND pwnd2=GetParent(pwnd);//获取视图控件的句柄CWatchDoc *m_Doc;//定义一个指向Doc的指针
    m_view=GetDocument(pwnd2);//获得文档指针
      

  14.   

    还有点问题不太明白我觉得应该是这样吧,但是编译不了
     CWatcher1Doc* m_Doc = (CWatcher1Doc*)(CView*)(GetParent()->GetParent())->GetDocument();
    你看第一个GetParent()是对话框取得其父tab控件的指针(这个地方有些不明白GetParent()返回值应该是句柄啊,怎么成了指针了呢?)
    第二个GetParent()是tab控件取得其父视图的指针,(CView*)(GetParent()->GetParent())应该是这样吧?帮忙解析一下,省得以后再遇到类似问题还要向您讨教,谢谢
      

  15.   

    CWnd类重载了GetParent函数,在CWnd的派生类(你的对话框类)中写GetParent实际调用的就是CWnd类的GetParent函数。
    注意:->操作符优先与强制类型转换。
      

  16.   

    第二个问题理解了,谢谢!^_^
    第一个问题是不是这个意思:GetParent()函数在CWnd类中被重载以后,就无需参数了,返回的是其父的指针。而我说的那个指的是在SDK中,GetParent()函数需要一个HWND类型的参数,返回值也是其父的HWND句柄
      

  17.   

        HWND GetParent(      
            HWND hWnd
        );CWnd 中的GetParent()作为成员函数了,CWnd 作为hWnd 这个参数
      

  18.   

    这个是CWnd类中的函数:
    CWnd* GetParent();这个是系统API:
    HWND GetParent(HWND hWnd);
      

  19.   

    codeCWatcher1Doc* m_Doc = (CWatcher1Doc*)((CYourView*)(GetParent()->GetParent()))->GetDocument();