1. 程式人生 > >mfc創建文檔視圖過程

mfc創建文檔視圖過程

eve create 裏的 怎麽 遍歷 成員 nap tails pen

一、如何創建文檔視圖界面:

創建新的文檔視圖界面,只需要調用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創建文檔視圖過程