MFC多文档应用程序同时显示两个视图
本文是對(duì)網(wǎng)絡(luò)上各種資料進(jìn)行了梳理,并在VisualC++6.0下進(jìn)行了實(shí)驗(yàn)測(cè)試。
需要解決的問(wèn)題如下:1. 在MFC多文檔應(yīng)用程序中同時(shí)顯示兩個(gè)視圖,其中一個(gè)視圖顯示電路原理圖,另外一個(gè)顯示仿真結(jié)果。
2. 兩個(gè)視圖需要同時(shí)顯示,但是并非分割顯示,而是通過(guò)切換(切換功能尚未實(shí)現(xiàn))
在多文檔應(yīng)用程序中,視圖類是由CMultiDocTemplate來(lái)負(fù)責(zé)管理的。自動(dòng)生成的MFC框架中在C**App類的InitInstance()函數(shù)中,有以下的語(yǔ)句: 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
由于有兩個(gè)視圖需要顯示,所以需要?jiǎng)?chuàng)建兩個(gè)CMultiDocTemplate對(duì)象來(lái)管理,其中每個(gè)對(duì)象管理不同的View對(duì)象
為了方便在其他類中引用,我在C**App類中增 1public:
2????CMultiDocTemplate*?m_pTemplateDataView;
3????CMultiDocTemplate*?m_pTemplateSchematicView;
然后在InitInstance()函數(shù)替換原有創(chuàng)建CMultiDocTemplate對(duì)象指針的語(yǔ)句,這里我的代碼是:
?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);
而此時(shí)就有了兩個(gè)視圖,而MFC應(yīng)用程序默認(rèn)是只打開(kāi)一個(gè)視圖的,所以這時(shí)運(yùn)行程序就會(huì)出現(xiàn)一個(gè)要求選擇顯示哪個(gè)視圖的對(duì)話框
為了自動(dòng)顯示,我們需要重寫C**App類的OnFileNew()函數(shù)
1void?CTR_UWBApp::OnFileNew()
2{
3????m_pTemplateSchematicView->OpenDocumentFile(NULL);
4} 注意:該函數(shù)無(wú)法用classwizard添加,只能使用member function添加
根據(jù)MSDN2001,需要在C**App類的消息響應(yīng)中添加一句話才能使該函數(shù)被響應(yīng)
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 紅色的是添加的那個(gè)句子。
注: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.
到目前為止,程序還只能顯示一個(gè)view,另外一個(gè)view還沒(méi)有被顯示出來(lái)。
我們需要在C**Doc類中添加一些東西
在OnNewDocument()函數(shù)中我們添加如下
2CreateNewWindow(p_app->m_pTemplateDataView,?this);?
然后添加成員函數(shù):
?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}
?
此時(shí)再運(yùn)行則可以一下子顯示兩個(gè)view了,不是重疊的。但是原理圖view顯示不完整,因?yàn)椴皇侨翱诖笮?。我把它設(shè)置了一下
在CChildFrame類中改寫虛函數(shù)ActivateFrame(int nCmdShow) ,nCmdShow默認(rèn)值就是-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}
這樣顯示的窗口就最大化了
后面會(huì)繼續(xù)更新,補(bǔ)充用tab鍵或其它方法在兩個(gè)視圖之間切換
本文參考的網(wǎng)址和文檔:
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
總結(jié)
以上是生活随笔為你收集整理的MFC多文档应用程序同时显示两个视图的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: [转载]流行视频格式讲解
- 下一篇: 15条常用的视频音频编辑脚本命令(men