mfc創建文檔視圖過程
一、如何創建文檔視圖界面:
創建新的文檔視圖界面,只需要調用CDocTemplate::OpenDocumentFile(strpath)即可。(strpath為要打開的文檔路徑,如果是NULL,則生成新的文檔)。
二、上面這個函數為何能夠生成文檔視圖對象?
因為
1.它調用了CDocTemplate::CreateNewDocument()函數生成了CDocument對象;
2.它調用了CDocTemplate::CreateNewFrame()函數生成了CFrameWnd對象;
3.在生成文檔框架的過程中又創建了CView對象。(因為文檔框架是文檔視圖的父窗口,它們之間存在包含與被包含關系
最終它生成了界面。
三、為何我在打開多文檔軟件時,系統自動給我生成了一個空白文檔?如何不讓它自動生成,我自己生成?
系統在開啟時會默認調用CWinAPP:OnFileNew()這個響應函數(且這個函數是個虛函數),這個事件響應函數默認會調用CDocTemplate::OpenDocumentFile(strpath)函數生成一個空白文檔。如果要取消默認,重載這個OnFileNew()函數,並且什麽也不做即可。
如果你要自己生成,你得獲取CWinApp內保存的文檔模板對象,然後調用它的OpenDocumentFile(strpath)即可。
四、如何獲取文檔模板對象呢?
文檔模板對象列表保存在CWinApp裏的一個CDocManage的一個成員變量中。通過遍歷這個成員遍歷即可獲取文檔模板對象。
遍歷由CWinApp::GetFirstDocTemplatePosition()和CWinApp::GetNextDocTemplate()函數得到。
五、CWinAPP和CDocTemplate都有OpenDocumentFile()函數,到底怎麽回事?
前者實質是調用後者實現文檔視圖界面的創建。
CView、CDocument、CMDIChildFrame、CMDIDocTemplate、CDocManager、CWinApp之間的關系:
CView:
CDocument* GetDocument();//獲取與視圖相關的文檔對象
CFrameWnd* GetParentFrame();//獲取視圖的框架(文檔框架)
CDocument:
CDocTemplate* GetDocTemplate()//獲取文檔的文檔模板
POSITION GetFirstViewPosition();
CView* GetNextView(position);//遍歷文檔相關的視圖
參考文獻:1.https://www.cnblogs.com/stevengerrard/p/3925422.html
2.https://blog.csdn.net/zhanghefu/article/details/2546601
mfc創建文檔視圖過程