MFC文档视图(四):类之间的调用

我们前面有讲到4个关键的类CWinApp,CFrameWnd,CView,CDocument是互相关联,那自然会涉及到互相调用.这里为了方便还继承用这个类名字来说明(实际上应该是用继承自它们的子类的)

下面有2个全局函数可以得到CWinApp与CFrameWnd.全局函数嘛就是随便哪里都能调用的了.

1.CWinApp* pApp = AfxGetApp();

2.CMainFrame* pMain=(CMainFrame*) AfxGetMainWnd();

//你也可以先得到CWinApp然后间接得到CMainFrame* pMain=(CMainFrame*)pApp->m_pMainWnd;

 

 

CWinApp中显式调用其他类

1.CWinApp调用CDocument

方法1:

CWinApp中有一个CSingleDocTemplate的指针,而CSingleDocTemplate中又有指向CDocument的指针.于是乎通过指针一路找下去自然就找着了.

POSITION pos = m_pDocTemplate->GetFirstDocPosition();

CDocument *pDoc = m_pDocTemplate->GetNextDoc(pos);

//其中m_pDocTemplate就是CSingleDocTemplate的指针.这里的POSITION有点类似STL中的iterator(迭代器).

方法2:

CFrameWnd* pMain=(CFrameWnd*)CWinThread::m_pMainWnd;

CDocument* pDoc = (CDocument*)pMain->CFrameWnd::GetActiveDocument(); //通过CFrame间接调用

2.CWinApp调用CView

CFrameWnd* pMain=(CFrameWnd*)CWinThread::m_pMainWnd;

CView* pView = (CView*)pMain->CFrameWnd::GetActiveView(); //通过CFrame间接调用

 

CFrameWnd调用其他类

CView* pView = (CView*)CFrameWnd::GetActiveView();

CDocument* pDoc = (CDocument*)CFrameWnd::GetActiveDocument();

 

CView调用其它类

CMyDocument* pDoc = (CMyDocument*)GetDocument();

 

CDocument调用其它类

POSITION pos=CDocument::GetFirstViewPosition();  //一个文档类可以对应多个CView,但一个CView只对对应一个文档类
while(pos != NULL) { 
CView *pView=CDocument::GetNextView(pos);

}

 

CWinApp中隐式调用CDocument

以命令消息的路由例.本来正常的路由顺序是CView --> CDocument -->CFrameWnd --> CWinApp.

仍为菜单File-->Open发出的消息为例.假如你让类CWinApp来处理这相消息,那么前面3个类就不能处理它了.那假如你只想CWinApp处理一部分.另一部分要其他类处理该咋整呢.

先在CMyWinApp中定义宏

ON_COMMAND(ID_FILE_OPEN, OnFileOpen)

void CMyWinApp:OnFileOpen(){

//做一些部分处理

CString szPath = _T("D:\\Test.txt");

CWinApp::OpenDocumentFile(szPath); //调用父类方法

}

假如类CMyDocument中有重写父类的虚函数BOOL CSessionEditorDoc::OnOpenDocument(LPCTSTR lpszPathName) { }

则在前面调用CWinApp::OpenDocumentFile(szPath)之后,会接着调用OnOpenDocument.(MFC中很多地方就是这样封装起来的啊,所以你看着定义了一函数,但不知道是在哪儿被调用的,那就叫一个郁闷憋屈啊).

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值