基於MFC文件/視/框架程式之利劍 (轉)
在我的同事當中,有不少人在用VC/MFC,但許多人總是容易被MFC的文件視這種弄得暈頭轉向,儘管在他們的桌子旁堆了很多有關VC的資料。在我的學習過程中我發現下面的理解以及一些是最為關鍵的,每當有人問我有關與此的問題,我給他(她)共享了下面的文件後就不用重複解釋很多東西了。儘管這些都能從MSDN中最終找到答案,但有些人就是懼怕MSDN;希望您擁有這份資料後,可以大大減少你的懼怕。
l 預備:namespace prefix = o ns = "urn:schemas--com::office" />
1. 文件類通常與資料的存取以及其它處理過程有關,而視主要用來表現文件資料的,但每個視必須依附於一個框架(在SDI中依附於MainFrame,在MDI中依附於ChildFrame),框架上可以放置工具欄、選單等;
2. 某種型別的文件、框架、視共同關聯構成一個文件模板類(基類是CDocTemplate,其子類CSingleDocTemplate與CMutiDocTemplate分對應於SDI和MDI),文件模板類在WinApp的初始化時構造;
3. 一個APP可以有N個文件模板,但SDI及MDI框架嚮導預設生成的都只有一種模板(若需要更多則可以模仿新增);一個文件模板在中可多次生成多個文件例項,此所謂多文件介面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++;
}
願這些能成為您操作MDI、SDI類程式的利劍,歡迎補充和提意見!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-982662/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 基於MFC文件/視/框架程式之利劍框架
- MFC中文件檢視框架和文件模板之間的關係框架
- mfc程式流程 (轉)C程式
- VS2019/MFC程式設計入門之(如何利用MFC嚮導生成單文件應用程式框架)C程式程式設計框架
- MFC框架框架
- 基於C++程式放大區域性圖形(mfc)C++
- 基於MFC的大型資料檔案處理方法 (轉)
- 基於MFC的編寫執行緒快速入門 (轉)執行緒
- 用MFC構造DirectX應用框架 (轉)框架
- 搭建通用 GUI 測試框架步驟,適用於 MFC/JAVA 應用程式GUI框架Java
- NO MFC - 使用 .log 除錯程式 (轉)除錯
- 在VC 5.0中實現基於MFC的元件的本地化 (轉)元件
- 簡述MFC程式生與死 (轉)C程式
- 文件 檢視 框架視窗間的關係和訊息傳送規律 (轉)框架
- MFC框架軟體逆向研究框架
- MFC下CSocket程式設計詳解(轉)程式設計
- 基於PHP與XML的PDF文件生成技術(摘要) (轉)PHPXML
- 視窗程式框架框架
- 轉轉基於MQ的分散式重試框架設計方案MQ分散式框架
- No MFC,Only API (轉)API
- 關於程式設計師寫文件(網路轉載)程式設計師
- Linux 文件與視窗(轉)Linux
- MFC檔案複製的函式程式程式碼 (轉)函式
- 使用MFC編寫internet查詢程式 (轉)
- Scrapy框架之利用ImagesPipeline下載圖片框架
- 基於MPI的文件分類並行程式設計(C)並行行程程式設計
- MFC介面開發類庫BCG Pro for MFC幫助文件:CBCGPEditCtrl的XML格式XML
- 新手不能忽視的MFC程式設計之CStringC程式程式設計
- 視窗程式的框架框架
- [原始碼和文件分享]基於VC++的MFC類庫的飛機大戰遊戲的設計與實現原始碼C++遊戲
- 初學MFC(2) (轉)
- 初學MFC(1) (轉)
- 用 vue 寫小程式,基於 mpvue 框架重寫 weuiVue框架UI
- 基於mpvue框架搭建微信小程式開發環境Vue框架微信小程式開發環境
- 玩轉iOS開發:iOS 11 新特性《基於文件管理的App》iOSAPP
- MFC---ActiveX控制元件程式設計基礎控制元件程式設計
- 檢視mfc原始碼的一個很好的導航工具 (轉)原始碼
- No MFC 程式設計01 - 最精簡的 win32 程式 (轉)程式設計Win32