家紡 網(wǎng)站建設(shè) 中企動(dòng)力百度旗下有哪些app
MFC文檔
之前我們在寫字符雨的時(shí)候,將數(shù)據(jù)都存儲(chǔ)到了視圖類中,這是不合理的,視圖類只負(fù)責(zé)顯示,不應(yīng)該存儲(chǔ)任何數(shù)據(jù)
文檔:專門存儲(chǔ)數(shù)據(jù)用的
CDocument
文檔與視圖的關(guān)系:
創(chuàng)建一個(gè)文檔類
單文檔四個(gè)類都集齊了
通過LoadFrame函數(shù)來創(chuàng)建
我們在應(yīng)用程序類中InitInstance函數(shù)中,刪除掉原來的Create方法:
class MyDoc:public CDocument{}
CCreateContext pContext;
pContext.m_pNewViewClass = RUNTIME_CLASS(MyView);
pContext.m_pCurrentDoc = new myDoc;
pFrame.LoadFrame(IDR_MENU,WS_OVERLAPPEDWINDOW,NULL,&pContext);
這樣寫出來之后,我們發(fā)現(xiàn)窗口也能夠運(yùn)行
LoadFrame{Create/注冊,修改回調(diào)函數(shù)地址
}
視圖類是什么時(shí)候創(chuàng)建的?
視圖和文檔的關(guān)系綁定在什么時(shí)候?
Create注冊窗口,埋了鉤子,修改了回調(diào)函數(shù)
WM_CREATE消息
出發(fā)鉤子函數(shù)
去消息數(shù)組里遍歷有沒有WM_CREATE消息,如果有的話,處理
在WM_CREATE消息中,創(chuàng)建了視圖
視圖.Create也會(huì)觸發(fā)WM_CREATE消息,我們在視圖類中處理:
如果視圖類和文檔類沒有綁定,會(huì)崩潰(這里交給視圖類處理WM_CREATE消息)就省略了綁定的過程,所以就沒有綁定
CCreateContext pContext;
pContext.m_pNewViewClass = RUNTIME_CLASS(MyView);//視圖靜態(tài)結(jié)構(gòu)體類信息
pContext.m_pCurrentDoc = new myDoc;//文檔對象地址
//內(nèi)部this指針:框架
pFrame->LoadFrame(.....,&pContext);
{Create(...pContext){CreateEx(......pContext){CREATESTRUCT cs;cs.lpCreateParams = lpParam;CreateWindowEx(cs結(jié)構(gòu)體成員)}}
}
框架類WM_CREATE消息處理:
CFrameWnd::OnCreate(cs);{//取出pContextCCreateContext* pContext = (CCreateContext*)lpcs->lpCreateParams;//參數(shù)為pContextOnCreateHelper(lpcs, pContext);{OnCreateClient(lpcs, pContext){//第一個(gè)參數(shù)context結(jié)構(gòu)體CreateView(pContext, AFX_IDW_PANE_FIRST){//動(dòng)態(tài)創(chuàng)建視圖CWnd* pView = (CWnd*)pContext->m_pNewViewClass->CreateObject();pView->Create(.....pContext){//this指針視圖對象CreateEx(.....pContext);{CREATESTRUCT cs;cs.lpCreateParams = pContext;CreateWindowEx(cs結(jié)構(gòu)體)//....又觸發(fā)了WM_CREATE消息}}}}}}
視圖類又處理WM_CREATE消息:
CEditView::OnCreate(cs);
{CCtrlView::OnCreate(lpcs) {//又取出了ContextCCreateContext* pContext = (CCreateContext*)lpcs->lpCreateParams;pContext->m_pCurrentDoc->AddView(視圖對象);//this{//this指針 是不是文檔類this->m_viewList.AddTail(pView);//視圖類對象成員 保存文檔pView->m_pDocument = this; }}
}
一個(gè)文檔可以綁定多個(gè)視圖(多個(gè)視圖可以綁定同一個(gè)文檔)
afxGetApp(); MFC全局變量 --獲取到應(yīng)用程序類 theapp
theapp 有個(gè)變量 存儲(chǔ)著框架類對象
m_pMainWnd 有個(gè)變量 活動(dòng)視圖 拿到視圖類對象
- WM_COMMAND消息處理順序的問題
文檔和視圖如何交互:
文檔類::UpdateAllViews 通知所有視圖文檔已被修改的消息
視圖類::OnUpdate----如果文檔類數(shù)據(jù)發(fā)生改變 你怎么繪制
GetDocument 返回與視圖相連接的文檔 返回文檔類對象
MFC單文檔架構(gòu):
只有一個(gè)文檔類
//單文檔架構(gòu)的模板類
CSingleDocTemplate* pDocTemplate;pDocTemplate = new CSingleDocTemplate(IDR_MAINFRAME,RUNTIME_CLASS(CMFCApplication8Doc), //文檔類 類信息 RUNTIME_CLASS(CMainFrame), //框架類 類信息RUNTIME_CLASS(CMFCApplication8View)); //視圖類類信息
{this->m_pOnlyDoc = NULL;this->m_pDocClass = pDocClass;this->m_pFrameClass = pFrameClass;this->m_pViewClass = pViewClass;
}//內(nèi)部this指針應(yīng)用程序類
//參數(shù)單文檔模板類
this->AddDocTemplate(pDocTemplate);
{//微軟未公開:文檔管理//應(yīng)用程序類-->有個(gè)成員是文檔管理this->m_pDocManager = new CDocManager;//內(nèi)部this指針文檔管理m_pDocManager->AddDocTemplate(pTemplate);{//文檔管理類 鏈表成員保存了 單文檔模板地址m_templateList.AddTail(pTemplate);}
}m_nShellCommand = FileNew;ProcessShellCommand(cmdInfo)
{OnFileNew(){m_pDocManager->OnFileNew(){//多態(tài) 文檔模板類 ----->單文檔模板類CDocTemplate* pTemplate = (CDocTemplate*)m_templateList.GetHead();//內(nèi)部this指針單文檔模板類pTemplate->OpenDocumentFile(NULL){OpenDocumentFile(lpszPathName, TRUE, bMakeVisible);{CDocument* pDocument = NULL;CFrameWnd* pFrame = NULL;//動(dòng)態(tài)創(chuàng)建文檔類CDocument* pDocument = (CDocument*)m_pDocClass->CreateObject();m_pOnlyDoc = pDoc;}pFrame = CreateNewFrame(pDocument, NULL);CCreateContext context;context.m_pCurrentFrame = pOther;context.m_pCurrentDoc = pDoc;//動(dòng)態(tài)創(chuàng)建框架類對象CFrameWnd* pFrame = (CFrameWnd*)m_pFrameClass->CreateObject();}}}
}