你可以因為現任不好而分手,但千萬不要認為別人更好,永遠有人更好,眼下便是更好。。。
---- 網易雲熱評
一、 多文件檢視架構程式
1、特點: 可以管理多個文件。(可以有多個文件類物件)
2、相關類
CWinApp / CMDIFrameWnd / CMDIChildWnd / CView / CDocument-文件類
CDocManager - 文件管理類
CDocTemplate - 文件模板類
CMultiDocTemplate - 多文件模板類
3、關係圖
theApp
|->m_pDocManager //文件管理類物件地址
|->m_templateList
|->CMultiDocTemplate* pTemplate
|->m_docList //文件類物件地址
|->m_pDocClass
//文件類的靜態變數的地址 RUNTIME_CLASS(CMyDoc)
|->m_pFrameClass
//子框架類的靜態變數的地址 RUNTIME_CLASS(CMyChild)
|->m_pViewClass
//檢視類的靜態變數的地址 RUNTIME_CLASS(CMyView)
4 OnFileNew函式的執行過程
透過theApp獲取文件管理類物件地址(m_pDocManager)
透過文件管理類物件地址(m_pDocManager)獲取一個連結串列成員(m_templateList)並從連結串列中獲取單文件模板類物件(pTemplate)
利用單文件模板類物件(pTemplate)獲取文件類的靜態變數地址,並呼叫物件加工廠函式,動態建立文件類物件,並返回物件地址。
利用單文件模板類物件(pTemplate)獲取框架類的靜態變數地址,並呼叫物件加工廠函式,動態建立子框架類物件,並返回物件地址。
利用框架類物件呼叫LoadFrame函式,建立主框架視窗.
在處理框架視窗的WM_CREATE訊息時,動態建立檢視類物件並建立檢視視窗。
在處理檢視視窗的WM_CREATE訊息時,將檢視類物件和文件類物件建立繫結關係。
二、新建win32多文件
1、新建windows桌面嚮導
2、設為啟動項並配置相關屬性
3、新增選單資源,選單項必須兩個,否則報錯
4、新建原始檔建立主視窗框架
#include <afxwin.h>#include <afxext.h>#include "resource.h"//文件類、檢視類、自文件類都支援動態建立機制class CMyDoc : public CDocument { DECLARE_DYNCREATE(CMyDoc)};IMPLEMENT_DYNCREATE(CMyDoc, CDocument)class CMyView : public CEditView { DECLARE_DYNCREATE(CMyView)};IMPLEMENT_DYNCREATE(CMyView, CEditView)class CMyChild : public CMDIChildWnd { DECLARE_DYNCREATE(CMyChild)};IMPLEMENT_DYNCREATE(CMyChild, CMDIChildWnd)//主框架類class CMyFrameWnd : public CMDIFrameWnd {};//應用程式類class CMyWinApp : public CWinApp {public: virtual BOOL InitInstance();};CMyWinApp theApp;BOOL CMyWinApp::InitInstance() { //建立主框架視窗 CMyFrameWnd* pFrame = new CMyFrameWnd; pFrame->LoadFrame(IDR_MENU1); m_pMainWnd = pFrame; pFrame->ShowWindow(SW_SHOW); pFrame->UpdateWindow(); return TRUE;}
執行結果:
5、新增子視窗
//多文件模板 CMultiDocTemplate* pTemplate = new CMultiDocTemplate( IDR_MENU2, RUNTIME_CLASS(CMyDoc), RUNTIME_CLASS(CMyChild), RUNTIME_CLASS(CMyView)); AddDocTemplate(pTemplate); OnFileNew();
報錯:
6、處理報錯,新增string table
7、有幾個OnFileNew();就有幾個自框架愛,執行結果:
三、在多文件中控制某單文件
1、在文件類中宣告一個變數
class CMyDoc : public CDocument { DECLARE_DYNCREATE(CMyDoc) //點選選單項就賦一個值public: CString str;};
2、在應用程式中實現
class CMyWinApp : public CWinApp { DECLARE_MESSAGE_MAP()public: virtual BOOL InitInstance(); afx_msg void OnNew();};BEGIN_MESSAGE_MAP(CMyWinApp, CWinApp) ON_COMMAND(ID_xinjian, OnNew)END_MESSAGE_MAP()void CMyWinApp::OnNew() { //給文件類成員str賦值 CDocManager* pDocManager = this->m_pDocManager; POSITION pos = pDocManager->GetFirstDocTemplatePosition(); //返回第一個節點 CMultiDocTemplate* pTemplate = (CMultiDocTemplate*)pDocManager->GetNextDocTemplate(pos); pos = pTemplate->GetFirstDocPosition(); CMyDoc* pDoc = (CMyDoc*)pTemplate->GetNextDoc(pos); pDoc = (CMyDoc*)pTemplate->GetNextDoc(pos); pDoc->str = "hello world"; //重新整理和第二個文件類物件關聯的所有檢視視窗 pDoc->UpdateAllViews(NULL);}
3、重寫OnUpdate函式
class CMyView : public CEditView { DECLARE_DYNCREATE(CMyView)public: virtual void OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint);};IMPLEMENT_DYNCREATE(CMyView, CEditView)void CMyView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint){ CMyDoc* pDoc = (CMyDoc*)this->m_pDocument; SetWindowText(pDoc->str);}
4、執行結果,點選選單新建