对于MFC的单文档应用程序,在其他的类中我们经常要获取View类的指针,以此来访问View下的public成员。
一般的方法:
1
CMainFrame
*
pMainFrm
=
(CMainFrame
*
)AfxGetMainWnd();
2 CMapGISView * pMapView = (CMapGISView * )pMainFrm -> GetActiveView();
2 CMapGISView * pMapView = (CMapGISView * )pMainFrm -> GetActiveView();
有时用这种方法会存在问题,程序会断言失败。我们来看看GetActiveView()的实现代码:
1
CView
*
CFrameWnd::GetActiveView()
const
2 {
3 ASSERT(m_pViewActive == NULL ||
4 m_pViewActive -> IsKindOf(RUNTIME_CLASS(CView)));
5 return m_pViewActive;
6 }
2 {
3 ASSERT(m_pViewActive == NULL ||
4 m_pViewActive -> IsKindOf(RUNTIME_CLASS(CView)));
5 return m_pViewActive;
6 }
我们会发现在界面没有显示出来之前,m_pViewActive始终为NULL。
有时候,我们需要在界面没有出来之前,需要访问View类中的成员。这个时候,我们仅仅是需要一个View类的指针!
通过下列方法可以达到我们的目的:
1
CView
*
CMapGISApp::GetView()
2 {
3 POSITION p = GetFirstDocTemplatePosition();
4 CDocTemplate * pDocTemplate = GetNextDocTemplate(p);
5 POSITION p1 = pDocTemplate -> GetFirstDocPosition();
6 CDocument * pDoc = pDocTemplate -> GetNextDoc(p1);
7 POSITION p2 = pDoc -> GetFirstViewPosition();
8 return pDoc -> GetNextView(p2);
9 }
2 {
3 POSITION p = GetFirstDocTemplatePosition();
4 CDocTemplate * pDocTemplate = GetNextDocTemplate(p);
5 POSITION p1 = pDocTemplate -> GetFirstDocPosition();
6 CDocument * pDoc = pDocTemplate -> GetNextDoc(p1);
7 POSITION p2 = pDoc -> GetFirstViewPosition();
8 return pDoc -> GetNextView(p2);
9 }