基於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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- VS2019/MFC程式設計入門之(如何利用MFC嚮導生成單文件應用程式框架)C程式程式設計框架
- 搭建通用 GUI 測試框架步驟,適用於 MFC/JAVA 應用程式GUI框架Java
- MFC下CSocket程式設計詳解(轉)程式設計
- MFC框架軟體逆向研究框架
- 新手不能忽視的MFC程式設計之CStringC程式程式設計
- 轉轉基於MQ的分散式重試框架設計方案MQ分散式框架
- MFC介面開發類庫BCG Pro for MFC幫助文件:CBCGPEditCtrl的XML格式XML
- MFC---ActiveX控制元件程式設計基礎控制元件程式設計
- 基於vs2012開發activex(MFC)控制元件控制元件
- 視窗程式框架框架
- MFC程式設計(六)C程式程式設計
- MFC程式設計(一)C程式程式設計
- MFC程式設計(二)C程式程式設計
- MFC程式設計(三)C程式程式設計
- MFC程式設計(四)C程式程式設計
- MFC程式設計(五)C程式程式設計
- MFC 程式基本介面配置
- [原始碼和文件分享]基於VC++的MFC類庫的飛機大戰遊戲的設計與實現原始碼C++遊戲
- 視窗程式的框架框架
- 用 vue 寫小程式,基於 mpvue 框架重寫 weuiVue框架UI
- RPA+低程式碼為何是加速財務數字化轉型之利器?
- 基於Matlab Coder將matlab程式碼轉換成c程式碼MatlabC程式
- 視窗程式框架示例程式碼框架
- 基於SkyEye執行Qt:著名應用程式開發框架QT框架
- 【eBPF-02】入門:基於 BCC 框架的程式進階eBPF框架
- 基於mpvue框架搭建微信小程式開發環境Vue框架微信小程式開發環境
- Flutter狀態管理Provider(三)基於Provider的程式碼框架FlutterIDE框架
- 基於小程式技術棧的跨端框架有哪些?跨端框架
- Netty 框架學習 —— 基於 Netty 的 HTTP/HTTPS 應用程式Netty框架HTTP
- 基於graphql的微服務基礎框架微服務框架
- 基於slate構建文件編輯器
- 基於單機的DataGuard切換文件
- 基於香橙派AIpro將開源框架模型轉換為昇騰模型AI框架模型
- 基於netty手寫RPC框架NettyRPC框架
- 基於react + redux的Bone框架ReactRedux框架
- 基於Cucumber框架的學習框架
- 基於 GitHub Discussions 的 Blog 框架Github框架
- MFC 捕獲按鈕 按下和抬起 (轉)
- 基於Xml 的IOC 容器-準備文件物件XML物件