基於MFC文件/視/框架程式之利劍

njustcxy發表於2003-09-05

在我的同事當中,有不少人在用VC/MFC,但許多人總是容易被MFC的文件視這種框架弄得暈頭轉向,儘管在他們的桌子旁堆了很多有關VC的資料。在我的學習過程中我發現下面的理解以及一些呼叫函式是最為關鍵的,每當有人問我有關與此的問題,我給他(她)共享了下面的文件後就不用重複解釋很多東西了。儘管這些都能從MSDN中最終找到答案,但有些人就是懼怕MSDN;希望您擁有這份資料後,可以大大減少你的懼怕。

l         預備<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

1.         文件類通常與資料的存取以及其它處理過程有關,而視主要用來表現文件資料的,但每個視必須依附於一個框架(在SDI中依附於MainFrame,在MDI中依附於ChildFrame),框架上可以放置工具欄、選單等;

2.         某種型別的文件、框架、視共同關聯構成一個文件模板類(基類是CDocTemplate,其子類CSingleDocTemplateCMutiDocTemplate分對應於SDIMDI),文件模板類在WinApp的初始化時構造;

3.         一個APP可以有N個文件模板,但SDIMDI框架嚮導預設生成的都只有一種模板(若需要更多則可以模仿新增);一個文件模板在程式中可多次生成多個文件例項,此所謂多文件介面MDI(多文件不僅可以是多個同型別的文件還可以是多個不同型別的文件);一種資料可以有N種表現形式,所以一個文件可以有N個視與之關聯;

4.         在某一時刻只可能有一個活動的文件、視、和框架。即當前文件、視、和框架。

理解了這些再加上下面的操作就可以令你處理這類問題時得心應手了。

l         MDI物件之間的互動函式

函式

返回值

Global

AfxGetApp

CWinApp *(指向當前程式)

Global

AfxGetMainWnd

CWnd *(指向程式主視窗框架)

CMDIFrameWnd

MDIGetActive

CMDIChild Wnd *(指向當前活動的MDI子視窗)

CWnd

GetParentFrame

CFrameWnd *(指向父視窗框架)

CFrameWnd

GetActiveView

CView*(指向當前活動視)

CFrameWnd

GetActiveDocument

CDocument *(指向當前活動文件)

CView

GetDocument

CDocument* (同該檢視類相聯絡)

CDocument

GetFirstViewPosition

同文件相關的檢視列表中的第一個檢視類位置

CDocument

GetNextView

同文件相關的檢視列表中的下一個檢視類位置

e.g.        CMainFrame* mfrm=(CMainFrame *)AfxGetMainWnd();

e.g.:得到當前視:

        CFrameWnd* pMain = (CFrameWnd*) AfxGetMainWnd();

       CFrameWnd *pChild = (CFrameWnd *) pMain->GetActiveFrame();

       CView* m_pAgentView = (CView *)pChild->GetActiveView();

l         訪問當前活動檢視和活動文件

1.         對於SDI程式,主框架視窗就是文件框窗,可以採用以下方法取得當前文件和檢視:

u       取得活動文件:

CMyDocument* pDoc;

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

pDoc=(CMyDocument*)((CFrameWnd*)AfxGetMainWnd())

這兩者是等效的。

u       取得活動檢視:

CMyView* pView;

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

2.  對於MDI程式,由於子視窗才是文件框窗,因此首先要用GetActiveFrame()取得活動子框架視窗,然後通過該子視窗獲取活動文件和檢視:

CMDIChildWnd* pChild=(CMDIChildWnd*)((CFrameWnd*)AfxGetApp()->m_pMainWnd)->GetActiveFrame();

u     取得活動文件:

CMyDocument* pDoc=pChild->GetActiveDocument();

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

可以把上述函式片段做成靜態成員函式,比如:

static CMyDocument::GetCurrentDoc()

{

CMDIChildWnd* pChild=(CMDIChildWnd*)((CFrameWnd*)AfxGetApp()- >m_pMainWnd)->GetActiveFrame();

CMyDocument* pDoc=pChild->GetActiveDocument();

}

這樣就可以通過以下方式取得活動文件(或檢視):

CMyDocument::GetCurrentDoc();

注:靜態成員函式呼叫時不需要一個具體的物件與之相關聯。

l         文件模板中找文件

例:

       CMultiDocTemplate* pDocTmpl;

       pDocTmpl  = ((CImpApp*)AfxGetApp())->m_pDocTemplate;

       POSITION posDoc= pDocTmpl->GetFirstDocPosition();

       while(NULL!=posDoc)

       {

              pFrmDoc = (CFrmDoc*) pDocTmpl->GetNextDoc(posDoc);

              nDocOrder++;

       }

願這些能成為您操作MDISDI類程式的利劍,歡迎補充和提意見!

相關文章