持之以恒
分类:
2009-09-20 10:24:54
CYouSDIDoc *pDoc=GetDocument();一个视图只能有一个文档。
2)
在App中获得MainFrame指针CMainFrame *pMain =(CMainFrame *)AfxGetMainWnd();3) 在View中获得MainFrame指针
CMainFrame *pMain=(CmaimFrame *)AfxGetApp()->m_pMainWnd;4) 获得View(已建立)指针
CMainFrame *pMain=(CmaimFrame *)AfxGetApp()->m_pMainWnd;5) 获得当前文档指针
CyouView *pView=(CyouView *)pMain->GetActiveView();
CDocument * pCurrentDoc =(CFrameWnd *)m_pMainWnd->GetActiveDocument();6) 获得状态栏与工具栏指针
CStatusBar * pStatusBar=(CStatusBar *)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_STATUS_BAR);7) 如果框架中加入工具栏和状态栏变量还可以这样
CToolBar * pToolBar=(CtoolBar *)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_TOOLBAR);
(CMainFrame *)GetParent()->m_wndToolBar;8) 在Mainframe获得菜单指针
(CMainFrame *)GetParent()->m_wndStatusBar;
CMenu *pMenu=m_pMainWnd->GetMenu();9) 在任何类中获得应用程序类
virtual POSITION GetFirstViewPosition() const;注意:GetNextView()括号中的参数用的是引用方式,因此执行后值可能改变。GetFirstViewPosition()用于返回第一个视图位置(返回的并非视图类指针,而是一个POSITION类型值),GetNextView()有两个功能:(下面是MSDN上的解释:)
virtual CView* GetNextView(POSITION& rPosition) const;
The function returns the view identified by rPosition and then sets rPosition to the POSITION value of the next view in the list. If the retrieved view is the last in the list, then rPosition is set to NULL.
翻译:这个函数返回由rPosition位置所指定的View的指针,然后将rPosition变成下一个视图的位置。如果,下一个视图是列表中的最后一个的话,rPosition将被置空。
很明显,在Test程序中,只有一个视图类,因此只需将这两个函数调用一次即可得到CTestView的指针如下(需定义一个POSITION结构变量来辅助操作):CTestView* pTestView;这样,便可到了CTestView类的指针pTestView.执行完几句后,变量pos=NULL,因为没有下一个视图类,自然也没有下一个视图类的POSITION.但是这几条语句太简单,不具有太强的通用性和安全特征;当象前面说的那样,当要在多个视图为中返回某个指定类的指针时,我们需要遍历所有视图类,直到找到指定类为止。判断一个类指针指向的是否某个类的实例时,可用IsKindOf()成员函数时行检查,如:
POSITION pos=GetFirstViewPosition();
pTestView=GetNextView(pos);
pView->IsKindOf(RUNTIME_CLASS(CTestView));
即可检查pView所指是否是CTestView类。CView* CTestDoc::GetView(CRuntimeClass* pClass)其中用了两次视图类的成员函数IsKindOf()来判断,是因为退出while循环有三种可能:
{
CView* pView;
POSITION pos=GetFirstViewPosition();
while(pos!=NULL)
{
pView=GetNextView(pos);
if(pView->IsKindOf(pClass))
break;
}
if(!pView->IsKindOf(pClass)){
AfxMessageBox("Connt Locate the View.\r\n");
return NULL;
}
return pView;
}
CTestView* pTestView=(CTestView*)GetView(RUNTIME_CLASS(CTestView));RUNTIME_CLASS是一个宏,可以简单地理解它的作用:将类的名字转化为CRuntimeClass为指针。至于强制类型转换也是为了安全特性考虑的,因为从同一个基类之间的指针类型是互相兼容的。这种强制类型转换也许并不必要,但能避免一些可能出现的麻烦。
CView* CTestAView::GetView(CRuntimeClass* pClass)这个函数和2中的GetView()相比,一是多了第一句以取得文档类指针,二是在GetFirstViewPosition()和GetNextView()前加上了文档类指针,以表示它们是文档类成员函数。有了此函数;当要从CTestAView中取得CTestBView的指针时,只需如下:
{
CTestDoc* pDoc=(CTestDoc*)GetDocument();
CView* pView;
POSITION pos=pDoc->GetFirstViewPosition();
while(pos!=NULL){
pView=pDoc->GetNextView(pos);
if(!pView->IsKindOf(pClass))
break;
}
if(!pView->IsKindOf(pClass)){
AfxMessageBox("Connt Locate the View.");
return NULL;
}
return pView;
}
CTestBView* pTestbView=(CTestView*)GetView(RUNTIME_CLASS(CTestBView));11)对于单文档中也可以加入多个文档模板,但是一般的开发就使用MDI方式开发多文档模板,其方法与上述视图的获取方法很接近,这里稍做解释,如果不清楚,请查阅MSDN,(以下四个内容(11、12、13、14)来源:)
POSITION GetFirstDocTemplate( ) const;第二个函数返回由pos 标识的文档模板。POSITION是MFC定义的一个用于迭代或对象指针检索的值。通过这两个函数,应用程序可以遍历整个文档模板列表。如果被检索的文档模板是模板列表中的最后一个,则pos参数被置为NULL。
CDocTemplate *GetNextDocTemplate( POSITION & pos ) const;
viaual POSITION GetFirstDocPosition( ) const = 0;如果列表为空,则rPos被置为NULL.
visual CDocument *GetNextDoc(POSITION & rPos) const = 0;
CDocTemplate * GetDocTemplate ( ) const;如果该文档不属于文档模板管理,则返回值为NULL。
Virtual POSITION GetFirstViewPosition( ) const;应用程序可以调用CDocument::GetFirstViewPosition返回与调用文档相联系的视的列表中的第一个视图的位置,并调用CDocument::GetNextView返回指定位置的视图,并将rPositon的值置为列表中下一个视的POSITION值。如果找到的视为列表中的最后一个视,则将rPosition置为NULL.
Virtual CView * GetNextView( POSITION &rPosition) cosnt;
RTTI.h
|
|
CRTTI::Init();
这样下面系统中就可以使用了!
在其他的文件中(比如A.cpp)调用的
方法
是这样的
CMFCView * pView = (CMFCView *)CRTTI::GetCurView();
当然调用该函数的文件(A.cpp)要加上对CRTTI对应文件的引用
#include "stdafx.h"
#include "A.h"
#include "CRTTI.h"
注意这样一个次序,
#include "CRTTI.h"
要放在
#include "A.h"
的后面!否则极易产生循环引用!