您的位置:首页 > 移动开发

如何实现CAPP、CMainFrame、CViEW和CDOC之间相互调用?

2012-04-08 13:30 441 查看
例如:我在CMainFrame中写代码,要访问CVIEW类中的数据,该怎么写代码?[/code]
在CMainFrame中,要访问CDOC类中的数据,该怎么写代码?
CVIEW类要访问CDOC类中的数据,该怎么写代码?
假设你是单文档单个VIEW的程序。那么:
1)CMainFrame:
GetActiveView()可得到View指针。例如:CyourView*pView=(CyourView*)this‐>GetActiveView();//this即当前CMainFrame,可省略
GetActiveDocument()可得到Document指针。例如:
CyourView*pView=(CyourView*)this‐>GetActiveView();//this即当前CMainFrame,可省略
CYourSDIDoc*pDoc=pView->GetDocument();
GetMenu()获得菜单指针。例如CMenu*pMenu=this->GetMenu();
2)CDoc:
POSITIONpos=GetFirstViewPosition();
CView*pView=GetNextView(pos);//得到View指针具体解释见最下方
或者
CMainFrame*pMain=(CmaimFrame*)AfxGetApp()‐>m_pMainWnd;
CyourView*pView=(CyourView*)pMain‐>GetActiveView();
3)CView:
GetDocument()可得到CDoc指针。例如:CYourSDIDoc*pDoc=this->GetDocument();//一个视只能有一个文档,this即CView,可省略
AfxGetMainWnd()可得到MainFrame指针。例如:CMainFrame*pframe=(CMainFrame*)AfxGetMainWnd();或者CMainFrame*pframe=(CMainFrame*)AfxGetApp()->m_pMainWnd;
4)CApp:
成员变量m_pMainWnd变量就是MainFrame的指针或者
CMainFrame*pMainFrame=(CMainFrame*)AfxGetMainWnd();或者
CMainFrame*pMainframe=(CMainFrame*)AfxGetApp();
5)在任何类中获得应用程序类
用MFC全局函数AfxGetApp()获得
6)获得状态栏与工具栏指针
CStatusBar*pStatusBar=(CStatusBar*)AfxGetMainWnd()‐>GetDescendantWindow(AFX_IDW_STATUS_BAR);
CToolBar*pToolBar=(CtoolBar*)AfxGetMainWnd()‐>GetDescendantWindow(AFX_IDW_TOOLBAR);
如果框架中加入工具栏和状态栏变量还可以这样(CMainFrame*)GetParent()‐>m_wndToolBar;(CMainFrame*)GetParent()‐>m_wndStatusBar;


POSITIONpos=GetFirstViewPosition();
CView*pView=GetNextView(pos);的具体解释:

从文档获得视图类指针目的一般为了控制同一文档的多个视图的定位问题,我的体会特别是文字处理CEditView当产生多个视图类时,这个功能是非常需要的。CDocument类提供了两个函数用于视图类的定位:GetFirstViewPosition()和GetNextView()virtualPOSITIONGetFirstViewPosition()const;virtualCView*GetNextView(POSITION&rPosition)const;注意:GetNextView()括号中的参数用的是引用方式,因此执行后值可能改变。GetFirstViewPosition()用于返回第一个视图位置(返回的并非视图类指针,而是一个POSITION类型值),GetNextView()有两个功能:返回下一个视图类的指针以及用引用调用的方式来改变传入的POSITION类型参数的值。很明显,在Test程序中,只有一个视图类,因此只需将这两个函数调用一次即可得到CTestView的指针如下(需定义一个POSITION结构变量来辅助操作):CTestView*pTestView;POSITIONpos=GetFirstViewPosition();pTestView=GetNextView(pos);这样,便可到了CTestView类的指针pTestView.执行完几句后,变量pos=NULL,因为没有下一个视图类,自然也没有下一个视图类的POSITION.但是这几条语句太简单,不具有太强的通用性和安全特征;当象前面说的那样,当要在多个视图为中返回某个指定类的指针时,我们需要遍历所有视图类,直到找到指定类为止。判断一个类指针指向的是否某个类的实例时,可用IsKindOf()成员函数时行检查,如:pView‐>IsKindOf(RUNTIME_CLASS(CTestView));即可检查pView所指是否是CTestView类。有了以上基础,我们已经可以从文档类取得任何类的指针。为了方便,我们将其作为一个文档类的成员函数,它有一个参数,表示要获得哪个类的指针。实现如下:其中用了两次视图类的成员函数IsKindOf()来判断,是因为退出while循环有三种可能:1.pos为NULL,即已经不存在下一个视图类供操作;2.pView已符合要求。1和2同是满足。这是因为GetNextView()的功能是将当前视图指针改变成一个视图的位置同时返回当前视图指针,因此pos是pView的下一个视图类的POSITION,完全有可能既是pos==NULL又是pView符合需要。当所需的视图是最后一个视图是最后一个视图类时就如引。因此需采用两次判断。使用该函数应遵循如下格式(以取得CTestView指针为例):CTestView*pTestView=(CTestView*)GetView(RUNTIME_CLASS(CTestView));RUNTIME_CLASS是一个宏,可以简单地理解它的作用:将类的名字转化为CRuntimeClass为指针。至于强制类型转换也是为了安全特性考虑的,因为从同一个基类之间的指针类型是互相兼容的。这种强制类型转换也许并不必要,但能避免一些可能出现的麻烦。

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: