********关于文档与视图交互数据的疑问*********

zqy1999 2002-05-14 05:27:40
在下有一个问题,功能能够实现,但我不明白为什么能够实现,希望能得到各位朋友的帮助。问题如下:

用VC自动生成一个单文档视图的应用程序后,自己添加了一个视图类,并通过某种方法将其显示出来。然后想在这个视图对象中显示文档类中的数据,我一般是通过下面的方法使该视图得到文档类中的数据:
1 在该视图类的CPP文件中包含该文档类的.h文件。
2 在需要使用文档类中Public的数据或函数的地方,通过 CMyDoc* pDoc =
( CMyDoc* )GetDocument()来获得文档对象的指针(其中CMyDoc为文档类的名字),然后就可以操作文档中的公共接口了。

我知道这样可以实现功能,但是这个GetDocument()到底是怎么实现的呢?框架自己生成的那个视图调用GetDocument()还好理解,通过
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CMySDoc),
RUNTIME_CLASS(CMainFrame),
RUNTIME_CLASS(CMyView));
已经将其与文档联系到了一起,但是我自己加入的视图并没有编写什么特殊的代码,使其与原有的文档相联系,为什么我通过调用GetDocument()也能获得文档的指针呢?
再有,GetDocument()函数中的那个m_pDocument是在哪里定义的?我到类库手册中查了半天也没找到。

望各位朋友指教。
...全文
86 点赞 收藏 9
写回复
9 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
webber84 2002-05-15
上面已经说过一遍了,没看见吗?

你可以看一下,所有能够用来创建View的函数,比如CView::Create,CFrameWnd::CreateView等,都要指定一个CCreateContext对象,这个对象有一个成员CDocument* m_pCurrentDoc,指定了与View关联的Doc对象,m_pDocument就是这样来的。
回复
cityyokel 2002-05-15
up
回复
zqy1999 2002-05-15
视图中的两个GetDocument() 函数:

Release版的GetDocument():
#ifndef _DEBUG // debug version in MulViewView.cpp
inline CMulViewDoc* CMulViewView::GetDocument()
{ return (CMulViewDoc*)m_pDocument; }
#endif

DEBUG版的GetDocument() 函数 :
#ifdef _DEBUG
... ...
CMulViewDoc* CMulViewView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMulViewDoc)));
return (CMulViewDoc*)m_pDocument;
}
#endif //_DEBUG

以上是在原有视图类中的GetDocument()函数,我也知道视图是通过它们两个来访问文档的。但是通过看这两个函数,我还是不明白视图是如何得到文档的指针的,因为GetDocument()函数所返回的m_pDocument不知是在哪定义的,类库中找不到啊?现在关键是这个m_pDocument到底是哪的。
回复
zqy1999 2002-05-15
回娃娃:是一个文档多个视图。
我自己添加视图的过程基本是这样:
用VC的ClassWizard的Add Class/New添加一个或多个以CView为基类的视图类(当然也可以其它的视图类为基类,如CFormView等),然后将其头文件加入到CMainFrame的CPP文件中去,通过在CMainFrame中加一个菜单命令,使自己添加的多个视图,以及原有的视图之间切换显示。基本的过程就是这样,不知我表述清楚没有。
回复
quanxiongwei 2002-05-14
1、
#ifndef _DEBUG // debug version in MyProView.cpp
inline CMyProDoc* CMyProView::GetDocument()
{ return (CMyProDoc*)m_pDocument; }
#endif

2、
CMyProDoc* CMyProView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyProDoc)));
return (CMyProDoc*)m_pDocument;
}
MFC把一些复杂的细节隐藏了,有利有憋。你可以钻进去,也可以完全不管内部只管用。
回复
webber84 2002-05-14
你可以看一下,所有能够用来创建View的函数,比如CView::Create,CFrameWnd::CreateView等,都要指定一个CCreateContext对象,这个对象有一个成员CDocument* m_pCurrentDoc,指定了与View关联的Doc对象,所有GetDocument总能返回正确的doc对象。
回复
meteor_wr 2002-05-14
有两种情况,一个是DEBUG版本,另一个是Non-Debug版本,但是其实一样。
假设项目名为MyPro,则
1、
#ifndef _DEBUG // debug version in MyProView.cpp
inline CMyProDoc* CMyProView::GetDocument()
{ return (CMyProDoc*)m_pDocument; }
#endif

2、
CMyProDoc* CMyProView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyProDoc)));
return (CMyProDoc*)m_pDocument;
}

这些都是在你的MyProView.h中定义的,当然只会出现其中的一种。
你自己仔细看看你的MyProView.h文件的末尾,你就知道了。

你自己加的视图?是不是一个文档多个视图?你是怎么加的呢?一般这些都是自动的。你在说得详细一点吧。等你
回复
prog_st 2002-05-14
....\VC98\MFC\Include\AFXWIN.H(3627)定义!
回复
prog_st 2002-05-14
#ifndef _DEBUG // debug version in TitledPicsWndTestView.cpp
inline CXXXXDoc* CXXXXView::GetDocument()
{ return (CXXXXDoc*)m_pDocument; }
#endif


CXXXXDoc* CXXXXView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CXXXXDoc)));
return (CXXXXDoc*)m_pDocument;
}
回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2002-05-14 05:27
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……