在MFC类中各种类的指针的获取和应用

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

理一理MFC的这几个类的关系,可以很容易明白上面的这些乱七八糟的逻辑。

App是应用域,所有的域中的东西都可以通过全局函数访问到它。

MainFrame是主框架,也基本可以用全局函数访问到。

MainFrame下是若干个ChildFrame,ChildFrame中若干个View和Document(可能不成对),ChildFrame管理着View,View和Document进行互操作。

因此整体框架就出来了,一般除了直接应用的关系都可以通过MainFrame-->Active ChildFrame-->Active View-->Document这条线进行访问

关于MFC下的文档和视图以及框架之间的访问, 这些问题已经是老生常谈了,但我觉得还是都没有详细的说明,特别是对于英语较差的人,我查看了一些blog,总结了一下!希望对和我一样的人有点帮助!

一:

1: 因为对于SDI程序,主框架窗口就是文档框窗(如果这个也不知道,就要查看一下MFC下的单文档的构成原理了).

下面所说的是关于单文档的.

例子: 在CMainFrame框架中如何得到视图类的指针.

可以先得到框架指针,然后调用GetActiveView 函数指向当前活动视.

C **View * pView;

pView=(C**View*)((CFrameWnd*)AfxGetApp()->m_pMainWnd)->GetActiveView();

当然这些也许都知道是这么用的,但真正的m_pMainWnd和AfxGetApp()是什么意思也许有的人不明白.

大家也许都知道如何在App中获得MainFrame指针(框架类): CWinApp 中的m_pMainWnd变量就是CMainFrame的指针.

所以在别的类下也可以先得到m_pMainWnd,就得到了MainFrame的指针. 所以得到视图类的指针,必先得到CFrameWnd的指针m_pMainWnd,然后在调用FrameWnd下的GetActiveView 就指向当前活动视.

m_pMainWnd的由来:

每一个MFC应用程序都有一个CWinApp派生类的对象。这个对象对应着程序的主线程。而CWinApp 类中有一个CWnd * m_pMainWnd 成员变量。这个成员变量记录了应用程序的主窗口。

当你新建一个MFC应用程序的时候,在InitInstance虚函数里都会出现对m_pMainWnd 赋值的语句.唯一的例外是单文档界面的MFC应用程序,你无法在InitInstance 函数里看到这段代码,因为它已经被隐藏在ProcessShellCommand 这个函数里了。由此你就可以下结论了:只要创建自己的窗口类,就要把这个类的对象赋值给m_pMainWnd .而这个成员只能在C**APP类中才可以使用,所以怎样使用这个CWinApp类里的CWnd 类型的变量来得到主框架窗口的指针呢??

AfxGetApp函数才可以, 因为AfxGetApp()得到的是CWinApp类的对象,且AfxGetApp 返回值为CWinApp对象指针,就是MFC生成的C**App.cpp中定义的那个对象(对象theApp 的指针)。

因为你是在自己创建的项目中得到CWndApp成员函数或者成员变量,所以你必须强制转换为你自己的项目中的类,才能找到成员函数或者变量.

注: 在单文档中,获得视指针的最简单的方法还是

((C**View *)CFrameWnd::GetActiveView())

2: 当然在FrameWnd中也可以得到文档类的指针:

CMyDocument* pDoc;

pDoc=(CMyDocument*)((CFrameWnd*)AfxGetApp()->m_pMainWnd)->GetActiveDocu ment();

3:由上面可以知道:在View中怎样获得MainFrame指针

CMainFrame *pMain=(CMainFrame *)AfxGetApp()->m_pMainWnd;

注: 从视图类中获得主帧窗口类指针:用函数:CWnd::GetParentFrame()或AfxGetMainWnd()也可达到目的。GetParentFrame()的工作原理是在父窗口链中搜索,直到找到CFrameWnd或其派生类为止,并返回其指针。

((CMainFrame *)CWnd::GetParentFrame())或者((CMainFrame *)AfxGetMainWnd())

二:当然对于MDI程序,由于子窗口才是文档框窗,因此首先要用GetActiveFrame()取得活动子框架窗口,然后通过该子窗口获取活动视图和文档:

CMDIChildWnd* pChild=(CMDIChildWnd*)((CFrameWnd*)AfxGetApp()->

m_pMainWnd)- >GetActiveFrame();

取得活动视图:

CMyView* pView=(CMyView*)pChild->GetActiveView();

取得活动文档:

CMyDocument* pDoc=pChild->GetActiveDocument();

注: 也可以用这种方法来得到多文档中的视指针

//获得活动子框架窗口

CMDIChildWnd* pChild=(CMDIChildWnd*)GetActiveFrame();

//或:

CMDIChildWnd* pChild=MDIGetActive();

//获得活动子帧窗口的活动视图

CMyView* pView=(CMyView*)pChild->GetActiveView();

三:

1.从视图类获得文档类的指针

在视图类中需要引用文档类的地方之前,使用以下语句:

C*Doc *pDoc=(C*Doc*)GetDocument();

以后便可使用pDoc指针访问文档类。

2.从文档类取得视图类的指针CDocument类提供了两个函数用于视图类的定位:

GetFirstViewPosition()和GetNextView()

注意:GetNextView()括号中的参数用的是引用方式,因此执行后值可能改变.GetFirstViewPosition()用于返回第一个视图位置(返回的并非视图类指针,而是一个POSITION类型值),GetNextView()有两个功能:返回下一个视图类的指针以及用引用调动的方式来改变传入的POSITION类型参数的值。很明显,在Test程序中,只有一个视图类,因此只需将这两个函数调用一次即可得到CTestView的指针如下(需定义一个POSITION 结构变量来辅助操作):

C*View* pView;

POSITION pos=GetFirstViewPosition();

pView=GetNextView(pos);

相关文档
最新文档