热情软件屋

 

VC中的CMainFrame,CView,CDocument有什么关系


编号:QA004384
建立日期: 2001年9月3日 最后修改日期:2001年9月3日
所属类别:

蒋功:
    操作系统: win98
    编程工具: vc6.0
    问题: 我想请教几个问题:
    1.
    这里有一个小程序:
    #include "iostream.h"
    
    class a
    {
     int i;
    public:
     void seti(int j);
     void testpointer(void *arglist);
     void aprint();
    };
    
    void a::seti(int j)
    {
     i=j;
    }
    
    void a::aprint()
    {
     cout<    }
    
    void a::testpointer(void *arglist)
    {
     a *port=(a *)arglist;
     port->seti(100);
     cout<<"Hello!\n"
    }
    
    void main()
    {
     a mya;
     a *apointer=new a;
     mya.seti(20);
     mya.aprint();
     mya.testpointer(apointer);
     mya.aprint();
    }
    程序的结果:
     20
     Hello!
     20
    为什么没有输出100?我是照着别人的程序写的,但是不明白下列句子:a *port=(a *)arglist;
    这好像是指向自身的指针,不知道具体的用途和方法是什么.
    2.在调用上面的程序中的testpointer()方法时,传递给它的参数应该是什么?感觉应该可以传递给它这个类的一个对象的指针,可以吗?怎样做?
    3.
    VC中的各个类CMainFrame,CView,CDocument,应该不是孤立的,他们有什么关系?我在资源下的菜单项中加入了ID_FILE_SEEVIEW项,并生成消息映射函数:
    void CMainFrame::OnSeeView()
    {
    CMyprojectView *pView=
     (CMyprojectView *)GetActiveView();
    }
    结果编译说:
     CMyprojectView,和pView未定义
    在头文件中加入:#include "MyprojectView.h"
    还是出错,为什么?应该怎样在VC的各类中访问数据?多谢你的回答!
    水平: 刚入门

回答:

    关于第一个问题是这样的:在你的主程序中有两个a类的变量,一个是mya,一个是apointer所指的那个变量。注意这两个变量是不同的。mya.seti(20)设置mya.i的值,而mya.testpointer设置的是apointer->i的值,而mya.i的值没有改变,还是20。mya.aprint()输出的是mya.i的值,而不是apointer->i的值。所以100没有输出。testpointer()方法的参数应该是一个a类的指针,但并不一定就是指向自身的指针。就如同你的例子中,它可以是apointer,但apointer不对于&mya。
    Frame、View、Document的关系,非常重要,它们的确不是孤立的,而是互相联系的。由于没有看到完整的程序,你也没有说错误是什么,所以判断你的程序在加入头文件之后不正确有点困难。但你可以按照下面的叙述来查一下:
    如果是SDI程序,CMainFrame调用GetActiveView获得CView,而CView可以调用GetDocument获得CDocument。如果已知CDocument,可以使用GetFirstViewPosition获得第一个相关的CView,然后使用GetNextView获得下一个的CView。之所以这么做,是因为MFC允许一个CDocument拥有多个CView。你可以使用下面的这段代码来获得一个CDocument拥有的所有CView:
    POSITION pos = GetFirstViewPosition();
    
CView* pFirstView = GetNextView( pos );
    
// This example uses CDocument::GetFirstViewPosition
    
// and GetNextView to repaint each view.
    
void CMyDoc::OnRepaintAllViews()
    
{
    
POSITION pos = GetFirstViewPosition();
    
while (pos != NULL)
    
{
    
CView* pView = GetNextView(pos);
    
pView->UpdateWindow();
    
}
    
}
    

    如果是MDI程序,稍微复杂一些。你不能直接调用GetActiveView,而需要先调用CMainFrame::MDIGetActive获得当前的CMDIChildWnd,而这个CMDIChildWnd相当于SDI中的CMainFrame。

此问题由李海回答。

附加关键字:编程, 源程序, programming, source code, C/C++, MFC, C++ Builder, Borland C++, Turbo C, C, BCB, 窗体与菜单, form, window, tform

 
把这个问题推荐给朋友
   
   
您的意见类别
您的名字
您的电子邮件
您的建议(请尽可能详细)
 
 

版权所有 1997-2008 热情软件屋
如果您有任何建议和意见, 请给我发个电子邮件 askpro@china-askpro.com
Web Designed by ZebraStudio