基於MFC文件/視/框架程式之利劍
在我的同事當中,有不少人在用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,其子類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類程式的利劍,歡迎補充和提意見!
相關文章
- 基於MFC文件/視/框架程式之利劍 (轉)框架
- MFC中文件檢視框架和文件模板之間的關係框架
- VS2019/MFC程式設計入門之(如何利用MFC嚮導生成單文件應用程式框架)C程式程式設計框架
- MFC框架框架
- 基於C++程式放大區域性圖形(mfc)C++
- 搭建通用 GUI 測試框架步驟,適用於 MFC/JAVA 應用程式GUI框架Java
- MFC框架軟體逆向研究框架
- 視窗程式框架框架
- Scrapy框架之利用ImagesPipeline下載圖片框架
- 基於MPI的文件分類並行程式設計(C)並行行程程式設計
- MFC介面開發類庫BCG Pro for MFC幫助文件:CBCGPEditCtrl的XML格式XML
- 新手不能忽視的MFC程式設計之CStringC程式程式設計
- 基於MFC的大型資料檔案處理方法 (轉)
- 基於MFC的編寫執行緒快速入門 (轉)執行緒
- 視窗程式的框架框架
- mfc程式流程 (轉)C程式
- [原始碼和文件分享]基於VC++的MFC類庫的飛機大戰遊戲的設計與實現原始碼C++遊戲
- 用 vue 寫小程式,基於 mpvue 框架重寫 weuiVue框架UI
- 基於mpvue框架搭建微信小程式開發環境Vue框架微信小程式開發環境
- MFC---ActiveX控制元件程式設計基礎控制元件程式設計
- 基於graphql的微服務基礎框架微服務框架
- [Web框架]Spray基於Scala的REST框架SprayWeb框架REST
- 基於小程式技術棧的跨端框架有哪些?跨端框架
- 【eBPF-02】入門:基於 BCC 框架的程式進階eBPF框架
- 視窗程式框架示例程式碼框架
- MFC程式設計(五)C程式程式設計
- MFC程式設計(四)C程式程式設計
- MFC程式設計(二)C程式程式設計
- MFC程式設計(一)C程式程式設計
- MFC程式設計(六)C程式程式設計
- MFC程式設計(三)C程式程式設計
- MFC 程式基本介面配置
- 用MFC構造DirectX應用框架 (轉)框架
- 基於react + redux的Bone框架ReactRedux框架
- datastack - 基於koa的RESTful框架ASTREST框架
- 基於Cucumber框架的學習框架
- 基於Annotation註解整合SSH框架和基於XML檔案配置Bean整合SSH框架框架XMLBean
- 談,前端框架的『御劍之道』前端框架