起因是该CPropertySheet在一个SDI的VIEW里,而我想在某个CPropertyPage里用DOCUMENT的数据,直接用GetDocument()不行,而在CPropertySheet里可以用GetDocument(),所以我想在CPropertyPage里调用CPropertySheet的指针。===============================
或者还有什么其他的方法没?

解决方案 »

  1.   

    好像不行。你可以在初始化时,将当前CPropertySheet的指针传递给每一个属性页。
      

  2.   

    还有一个办法,就是在CPropertySheet中先GetDocument,将获得的文档指针传递给每一个属性页。
      

  3.   

    CPropertyPage加个CPropertySheet或者CView的指针作为成员变量即可
    在CPropertyPage::AddPage()之前,将指针传给CPropertyPage
      

  4.   

    更正一下:是在CPropertySheet::AddPage()之前,将指针传给CPropertyPage
      

  5.   

    哇,一下子有这么多回复呀!感谢大家的帮助!!!我试了一下gufengduyu(聪明的呆呆龙)的方法,发现出现了循环引用的问题,结构如下:
    //////////////////////////////////////////////////
    #include "Page1.h"
    class CMonitor // 这是CPropertySheet的类
    {
        public:
             CPage1 page1;
    }///////////////////////////////////////////////////
    #include "Monitor.h"
    class CPage1  //  这是CPropertyPage的类
    {
        public:
             CMonitor *pMonitor;
    }这怎么处理?
      

  6.   

    在CPage1中,可以将#include "Monitor.h"改为class CMonitor;然后在CPage1的cpp文件中再#include "Monitor.h"就没问题了。
      

  7.   

    问一下:happyparrot(快乐鹦鹉)“还有一个办法,就是在CPropertySheet中先GetDocument,将获得的文档指针传递给每一个属性页。”我一开始也是这么想的,但是怎么能把参数传给属性页?在属性页内因为无法得到指针,所以不能呀!暂用全局变量保存文档类的指针变量,但传过去说类型有问题
      

  8.   

    你在CPage1类中包含你的文档类型,定义指针变量。然后在CPropertySheet中获得文档指针,传递给CPage1中的这些指针变量就可以了啊。
      

  9.   

    谢谢happyparrot(快乐鹦鹉)的帮助!我发现了最简单的方式——用greensofter(MC.CN)说的GetParent()函数,可以在CPropertyPage里得到CPropertySheet的指针。(只要强制转换成CMonitor)就行了。但是现在发现问题:
    // 以下是在属性页的.cpp文件里
    CMonitor* pMonitor = (CMonitor *)GetParent();
    int nItem = m_ServerList.GetNextSelectedItem(pos);
    CMyDoc* pDoc = (CMyDoc*)pMonitor->GetDocument();
    pDoc->strSwitch = m_List.GetItemText(nItem, 0);// 执行这句时出错,直接转到了CString类的MFC的“=”重载那里了。怎么回事呀?
      

  10.   

    SORRY,错了,修改如下:CMonitor* pMonitor = (CMonitor *)GetParent();
    int nItem = m_List.GetNextSelectedItem(pos);
    CMyDoc* pDoc = (CMyDoc*)pMonitor->GetDocument();
    pDoc->strSwitch = m_List.GetItemText(nItem, 0);
      

  11.   

    这个是加了注释的,代码部分和上面一样:CMonitor* pMonitor = (CMonitor *)GetParent(); // CMonitor是CPropertySheet的派生类
    int nItem = m_ServerList.GetNextSelectedItem(pos);
    CMyDoc* pDoc = (CMyDoc*)pMonitor->GetDocument();
    pDoc->strSwitch = m_List.GetItemText(nItem, 0);// strSwitch是文档类里的一个变量,要修改的就是它。
      

  12.   

    不可以,问题同样出现!我跟踪到
    pDoc->strSwitch = m_List.GetItemText(nItem, 0);
    出现问题。而且“=”右边没问题,问题是pDoc->strSwitch不能被赋值,奇怪?!
      

  13.   

    我怎么看不到CPropertySheet类可以调用GetDocument函数呢?这个函数应该只有View这样的类才可以调用的啊???
      

  14.   

    pDoc->strSwitch是什么类型,不是常量吧
      

  15.   

    已经搞定了。就是用的happyparrot(快乐鹦鹉)的方法:
    =========================================================
    你在CPage1类中包含你的文档类型,定义指针变量。然后在CPropertySheet中获得文档指针,传递给CPage1中的这些指针变量就可以了啊。
    =========================================================我发现用GetParent()得到的是一个新的对象,不是原先的那个,不知道为什么。另外,happyparrot(快乐鹦鹉)的这个方法:
    =========================================================
    在CPage1中,可以将#include "Monitor.h"改为class CMonitor;然后在CPage1的cpp文件中再#include "Monitor.h"就没问题了。
    =========================================================
    我没有具体试试,但我想知道其原理是啥?这类循环引用的问题都可以用这种方式解决吗?
      

  16.   

    在头文件中用class CMonitor是一个预定义的方法。然后在头文件中,只可以定义CMonitor类型的指针,不能直接定义实例。因为这种方法表示CMonitor将在cpp中才真正引入,而在头文件中只是一个申明。这样可以避免一些循环引用的问题。
      

  17.   

    哦,似乎明白些了,干脆问到底吧。1、其实我一直就不太明白 “#include...” 的语句在.h文件和.cpp文件有什么区别?2、而别人想要使用我写的一个类,只需要在他的.h文件里加上“#include MyClass.h”这样的一句,编译器就能知道是要引用我的类了。而既不是在他的.cpp里引用,也不是引用我的.cpp文件。这些问题比较糊涂,希望给解释一下,谢谢!!!
      

  18.   

    你就想着,头文件就是用来做索引的。而cpp就相当于详细的内容。索引当然要唯一了。对不对?不然它就不知道定位到哪里去。