MFC多文档应用程序同时显示两个视图
本文是對網絡上各種資料進行了梳理,并在VisualC++6.0下進行了實驗測試。
需要解決的問題如下:1. 在MFC多文檔應用程序中同時顯示兩個視圖,其中一個視圖顯示電路原理圖,另外一個顯示仿真結果。
2. 兩個視圖需要同時顯示,但是并非分割顯示,而是通過切換(切換功能尚未實現)
在多文檔應用程序中,視圖類是由CMultiDocTemplate來負責管理的。自動生成的MFC框架中在C**App類的InitInstance()函數中,有以下的語句: 1CMultiDocTemplate*?pDocTemplate;
2pDocTemplate=?new?CMultiDocTemplate(
3??IDR_**TYPE,
4??RUNTIME_CLASS(C**Doc),
5??RUNTIME_CLASS(CChildFrame),?//?custom?MDI?child?frame
6??RUNTIME_CLASS(C**View));
7?AddDocTemplate(pDocTemplate);
8
由于有兩個視圖需要顯示,所以需要創建兩個CMultiDocTemplate對象來管理,其中每個對象管理不同的View對象
為了方便在其他類中引用,我在C**App類中增 1public:
2????CMultiDocTemplate*?m_pTemplateDataView;
3????CMultiDocTemplate*?m_pTemplateSchematicView;
然后在InitInstance()函數替換原有創建CMultiDocTemplate對象指針的語句,這里我的代碼是:
?1m_pTemplateSchematicView?=?new?CMultiDocTemplate(
?2????????IDR_TR_UWBTYPE,
?3????????RUNTIME_CLASS(CTR_UWBDoc),
?4????????RUNTIME_CLASS(CChildFrame),?//?custom?MDI?child?frame
?5????????RUNTIME_CLASS(CTR_UWBView));
?6????AddDocTemplate(m_pTemplateSchematicView);
?7
?8????m_pTemplateDataView?=?new?CMultiDocTemplate(
?9????????IDR_TR_UWBTYPE,
10????????RUNTIME_CLASS(CTR_UWBDoc),
11????????RUNTIME_CLASS(CChildFrame),?//?custom?MDI?child?frame
12????????RUNTIME_CLASS(CDataView));
13????AddDocTemplate(m_pTemplateDataView);
而此時就有了兩個視圖,而MFC應用程序默認是只打開一個視圖的,所以這時運行程序就會出現一個要求選擇顯示哪個視圖的對話框
為了自動顯示,我們需要重寫C**App類的OnFileNew()函數
1void?CTR_UWBApp::OnFileNew()
2{
3????m_pTemplateSchematicView->OpenDocumentFile(NULL);
4} 注意:該函數無法用classwizard添加,只能使用member function添加
根據MSDN2001,需要在C**App類的消息響應中添加一句話才能使該函數被響應
1BEGIN_MESSAGE_MAP(CTR_UWBApp,?CWinApp)
2????//{{AFX_MSG_MAP(CTR_UWBApp)
3????ON_COMMAND(ID_APP_ABOUT,?OnAppAbout)
4????ON_COMMAND(ID_FILE_NEW,?OnFileNew)
5????????//?NOTE?-?the?ClassWizard?will?add?and?remove?mapping?macros?here.
6????????//????DO?NOT?EDIT?what?you?see?in?these?blocks?of?generated?code!
7????//}}AFX_MSG_MAP 紅色的是添加的那個句子。
注:MSDN2001:
CWinApp::OnFileNew
You must add an?
ON_COMMAND( ID_FILE_NEW, OnFileNew )?
statement to your?CWinApp?class message map to enable this member function.
到目前為止,程序還只能顯示一個view,另外一個view還沒有被顯示出來。
我們需要在C**Doc類中添加一些東西
在OnNewDocument()函數中我們添加如下
2CreateNewWindow(p_app->m_pTemplateDataView,?this);?
然后添加成員函數:
?2{
?3????ASSERT_VALID(?pTemplate?);???
?4????ASSERT_VALID(?pDocument?);???
?5????CFrameWnd*?pFrame?=?pTemplate->CreateNewFrame(pDocument,?NULL);
?6????if(?pFrame?==?NULL?)???
?7????{
?8????????TRACE0(?"Warning:?failed?to?create?new?frame.\n"?);???
?9????????return?NULL;???
10????}???
11????CRect?rect;
12????GetClientRect(pFrame->m_hWnd,&rect);
13????pFrame->MoveWindow(0,0,rect.Width(),rect.Height());
14????ASSERT_KINDOF(?CFrameWnd,?pFrame?);???
15????pTemplate->InitialUpdateFrame(?pFrame,?pDocument?);???
16????
17????return?pFrame;??
18}
?
此時再運行則可以一下子顯示兩個view了,不是重疊的。但是原理圖view顯示不完整,因為不是全窗口大小。我把它設置了一下
在CChildFrame類中改寫虛函數ActivateFrame(int nCmdShow) ,nCmdShow默認值就是-1
2{
3????//?TODO:?Add?your?specialized?code?here?and/or?call?the?base?class
4????if?(nCmdShow?==?-1)?{
5????????nCmdShow?=?SW_SHOWMAXIMIZED;
6????}
7
8????CMDIChildWnd::ActivateFrame(nCmdShow);
9}
這樣顯示的窗口就最大化了
后面會繼續更新,補充用tab鍵或其它方法在兩個視圖之間切換
本文參考的網址和文檔:
http://topic.csdn.net/u/20111019/09/b54b0574-162d-4f80-8209-660070ac3feb.html
http://hi.baidu.com/liyy011/blog/item/150ce08080b449d2bd3e1e19.html
http://topic.okbase.net/200612/2006122710/2831427.html
http://blog.csdn.net/zhuimengzh/article/details/6976011
MSDN2001
侯捷著,《深入淺出MFC》
http://www.cppblog.com/cs-xiaolee/archive/2011/12/01/161292.html
總結
以上是生活随笔為你收集整理的MFC多文档应用程序同时显示两个视图的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [转载]流行视频格式讲解
- 下一篇: 15条常用的视频音频编辑脚本命令(men