MFC多文档应用程序同时显示两个视图
2018-03-21 20:15
309 查看
本文是对网络上各种资料进行了梳理,并在VisualC++6.0下进行了实验测试。
需要解决的问题如下:
1. 在MFC多文档应用程序中同时显示两个视图,其中一个视图显示电路原理图,另外一个显示仿真结果。
2. 两个视图需要同时显示,但是并非分割显示,而是通过切换(切换功能尚未实现)
在多文档应用程序中,视图类是由CMultiDocTemplate来负责管理的。自动生成的MFC框架中在C**App类的InitInstance()函数中,有以下的语句:1
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
CMultiDocTemplate* pDocTemplate;
2
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
pDocTemplate= new CMultiDocTemplate(
3
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
IDR_**TYPE,
4
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
RUNTIME_CLASS(C**Doc),
5
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
6
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
RUNTIME_CLASS(C**View));
7
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
AddDocTemplate(pDocTemplate);
8
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
由于有两个视图需要显示,所以需要创建两个CMultiDocTemplate对象来管理,其中每个对象管理不同的View对象
为了方便在其他类中引用,我在C**App类中增1
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
public:
2
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
CMultiDocTemplate* m_pTemplateDataView;
3
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
CMultiDocTemplate* m_pTemplateSchematicView;
然后在InitInstance()函数替换原有创建CMultiDocTemplate对象指针的语句,这里我的代码是:
1
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
m_pTemplateSchematicView = new CMultiDocTemplate(
2
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
IDR_TR_UWBTYPE,
3
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
RUNTIME_CLASS(CTR_UWBDoc),
4
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
5
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
RUNTIME_CLASS(CTR_UWBView));
6
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
AddDocTemplate(m_pTemplateSchematicView);
7
![](http://www.cppblog.com/Images/OutliningIndicators/<br/>4000<br/>None.gif)
8
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
m_pTemplateDataView = new CMultiDocTemplate(
9
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
IDR_TR_UWBTYPE,
10
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
RUNTIME_CLASS(CTR_UWBDoc),
11
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
12
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
RUNTIME_CLASS(CDataView));
13
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
AddDocTemplate(m_pTemplateDataView);
而此时就有了两个视图,而MFC应用程序默认是只打开一个视图的,所以这时运行程序就会出现一个要求选择显示哪个视图的对话框
为了自动显示,我们需要重写C**App类的OnFileNew()函数
1
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
void CTR_UWBApp::OnFileNew()
2
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
3
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
m_pTemplateSchematicView->OpenDocumentFile(NULL);
4
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}注意:该函数无法用classwizard添加,只能使用member function添加
根据MSDN2001,需要在C**App类的消息响应中添加一句话才能使该函数被响应
1
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
BEGIN_MESSAGE_MAP(CTR_UWBApp, CWinApp)
2
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
//{{AFX_MSG_MAP(CTR_UWBApp)
3
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
4
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
ON_COMMAND(ID_FILE_NEW, OnFileNew)
5
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
// NOTE - the ClassWizard will add and remove mapping macros here.
6
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
// DO NOT EDIT what you see in these blocks of generated code!
7
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
//}}AFX_MSG_MAP红色的是添加的那个句子。
注:MSDN2001:
CWinApp::OnFileNewYou must add an
到目前为止,程序还只能显示一个view,另外一个view还没有被显示出来。
我们需要在C**Doc类中添加一些东西
在OnNewDocument()函数中我们添加如下1
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
CTR_UWBApp* p_app = (CTR_UWBApp*)AfxGetApp();
2
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
CreateNewWindow(p_app->m_pTemplateDataView, this);
然后添加成员函数: 1
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
CFrameWnd* CTR_UWBDoc::CreateNewWindow(CDocTemplate *pTemplate, CDocument *pDocument)
2
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
3
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
ASSERT_VALID( pTemplate );
4
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
ASSERT_VALID( pDocument );
5
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
CFrameWnd* pFrame = pTemplate->CreateNewFrame(pDocument, NULL);
6
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
if( pFrame == NULL )
7
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
8
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
TRACE0( "Warning: failed to create new frame.\n" );
9
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
return NULL;
10
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
11
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
CRect rect;
12
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
GetClientRect(pFrame->m_hWnd,&rect);
13
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
pFrame->MoveWindow(0,0,rect.Width(),rect.Height());
14
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
ASSERT_KINDOF( CFrameWnd, pFrame );
15
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
pTemplate->InitialUpdateFrame( pFrame, pDocument );
16
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
17
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
return pFrame;
18
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
} 此时再运行则可以一下子显示两个view了,不是重叠的。但是原理图view显示不完整,因为不是全窗口大小。我把它设置了一下
在CChildFrame类中改写虚函数ActivateFrame(int nCmdShow) ,nCmdShow默认值就是-11
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
void CChildFrame::ActivateFrame(int nCmdShow)
2
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
3
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
// TODO: Add your specialized code here and/or call the base class
4
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if (nCmdShow == -1) {
5
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
nCmdShow = SW_SHOWMAXIMIZED;
6
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
7
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
8
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
CMDIChildWnd::ActivateFrame(nCmdShow);
9
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}这样显示的窗口就最大化了
后面会继续更新,补充用tab键或其它方法在两个视图之间切换
本文参考的网址和文档:http://topic.csdn.net/u/20111019/09/b54b0574-162d-4f80-8209-660070ac3feb.htmlhttp://hi.baidu.com/liyy011/blog/item/150ce08080b449d2bd3e1e19.htmlhttp://topic.okbase.net/200612/2006122710/2831427.htmlhttp://blog.csdn.net/zhuimengzh/article/details/6976011MSDN2001
侯捷著,《深入浅出MFC》
转:http://www.cppblog.com/cs-xiaolee/archive/2011/12/01/161292.html
需要解决的问题如下:
1. 在MFC多文档应用程序中同时显示两个视图,其中一个视图显示电路原理图,另外一个显示仿真结果。
2. 两个视图需要同时显示,但是并非分割显示,而是通过切换(切换功能尚未实现)
在多文档应用程序中,视图类是由CMultiDocTemplate来负责管理的。自动生成的MFC框架中在C**App类的InitInstance()函数中,有以下的语句:1
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
CMultiDocTemplate* pDocTemplate;
2
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
pDocTemplate= new CMultiDocTemplate(
3
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
IDR_**TYPE,
4
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
RUNTIME_CLASS(C**Doc),
5
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
6
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
RUNTIME_CLASS(C**View));
7
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
AddDocTemplate(pDocTemplate);
8
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
由于有两个视图需要显示,所以需要创建两个CMultiDocTemplate对象来管理,其中每个对象管理不同的View对象
为了方便在其他类中引用,我在C**App类中增1
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
public:
2
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
CMultiDocTemplate* m_pTemplateDataView;
3
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
CMultiDocTemplate* m_pTemplateSchematicView;
然后在InitInstance()函数替换原有创建CMultiDocTemplate对象指针的语句,这里我的代码是:
1
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
m_pTemplateSchematicView = new CMultiDocTemplate(
2
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
IDR_TR_UWBTYPE,
3
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
RUNTIME_CLASS(CTR_UWBDoc),
4
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
5
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
RUNTIME_CLASS(CTR_UWBView));
6
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
AddDocTemplate(m_pTemplateSchematicView);
7
![](http://www.cppblog.com/Images/OutliningIndicators/<br/>4000<br/>None.gif)
8
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
m_pTemplateDataView = new CMultiDocTemplate(
9
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
IDR_TR_UWBTYPE,
10
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
RUNTIME_CLASS(CTR_UWBDoc),
11
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
12
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
RUNTIME_CLASS(CDataView));
13
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
AddDocTemplate(m_pTemplateDataView);
而此时就有了两个视图,而MFC应用程序默认是只打开一个视图的,所以这时运行程序就会出现一个要求选择显示哪个视图的对话框
为了自动显示,我们需要重写C**App类的OnFileNew()函数
1
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
void CTR_UWBApp::OnFileNew()
2
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
3
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
m_pTemplateSchematicView->OpenDocumentFile(NULL);
4
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}注意:该函数无法用classwizard添加,只能使用member function添加
根据MSDN2001,需要在C**App类的消息响应中添加一句话才能使该函数被响应
1
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
BEGIN_MESSAGE_MAP(CTR_UWBApp, CWinApp)
2
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
//{{AFX_MSG_MAP(CTR_UWBApp)
3
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
4
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
ON_COMMAND(ID_FILE_NEW, OnFileNew)
5
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
// NOTE - the ClassWizard will add and remove mapping macros here.
6
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
// DO NOT EDIT what you see in these blocks of generated code!
7
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
//}}AFX_MSG_MAP红色的是添加的那个句子。
注:MSDN2001:
CWinApp::OnFileNewYou 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()函数中我们添加如下1
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
CTR_UWBApp* p_app = (CTR_UWBApp*)AfxGetApp();
2
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
CreateNewWindow(p_app->m_pTemplateDataView, this);
然后添加成员函数: 1
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
CFrameWnd* CTR_UWBDoc::CreateNewWindow(CDocTemplate *pTemplate, CDocument *pDocument)
2
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
3
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
ASSERT_VALID( pTemplate );
4
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
ASSERT_VALID( pDocument );
5
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
CFrameWnd* pFrame = pTemplate->CreateNewFrame(pDocument, NULL);
6
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
if( pFrame == NULL )
7
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
8
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
TRACE0( "Warning: failed to create new frame.\n" );
9
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
return NULL;
10
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
11
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
CRect rect;
12
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
GetClientRect(pFrame->m_hWnd,&rect);
13
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
pFrame->MoveWindow(0,0,rect.Width(),rect.Height());
14
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
ASSERT_KINDOF( CFrameWnd, pFrame );
15
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
pTemplate->InitialUpdateFrame( pFrame, pDocument );
16
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
17
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
return pFrame;
18
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
} 此时再运行则可以一下子显示两个view了,不是重叠的。但是原理图view显示不完整,因为不是全窗口大小。我把它设置了一下
在CChildFrame类中改写虚函数ActivateFrame(int nCmdShow) ,nCmdShow默认值就是-11
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
void CChildFrame::ActivateFrame(int nCmdShow)
2
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
3
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
// TODO: Add your specialized code here and/or call the base class
4
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if (nCmdShow == -1) {
5
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
nCmdShow = SW_SHOWMAXIMIZED;
6
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
7
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
8
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
CMDIChildWnd::ActivateFrame(nCmdShow);
9
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}这样显示的窗口就最大化了
后面会继续更新,补充用tab键或其它方法在两个视图之间切换
本文参考的网址和文档:http://topic.csdn.net/u/20111019/09/b54b0574-162d-4f80-8209-660070ac3feb.htmlhttp://hi.baidu.com/liyy011/blog/item/150ce08080b449d2bd3e1e19.htmlhttp://topic.okbase.net/200612/2006122710/2831427.htmlhttp://blog.csdn.net/zhuimengzh/article/details/6976011MSDN2001
侯捷著,《深入浅出MFC》
转:http://www.cppblog.com/cs-xiaolee/archive/2011/12/01/161292.html
相关文章推荐
- MFC多文档应用程序同时显示两个视图
- MFC多文档应用程序同时显示两个视图
- MFC多文档应用程序同时显示两个视图
- MFC应用程序之视图、文档、框架、应用程序类对象间的相互引用及调用
- MFC单文档多视图显示bmp工作小记
- 文档-视图结构下MFC程序的全屏显示
- MFC中获取各种类(文档、视图、框架、应用程序)指针的方法
- MFC文档应用程序实现文件拖拽到应用程序中显示
- MFC文档应用程序CToolBar:设置两个工具条并列停靠到同一条边上
- MFC文档应用程序CToolBar:设置两个工具条并列停靠到同一条边上 转
- MFC 单文档 ADO 链接ACCESS数据库,并在视图上显示
- MFC 单文档应用程序如何在状态栏显示时间
- MFC中获取各种类(文档、视图、框架、应用程序)指针的方法
- 新建一个mfc多文档应用程序不显示默认文档
- MFC文档视图不显示导航栏
- MFC单文档应用程序显示图像
- MFC MDI项目如何一个文档显示多个不同视图类(比如文字和图表,各自拥有单独的框架窗口)
- MFC多文档程序启动时一个文档创建两个视图
- MFC中获取各种类(文档、视图、框架、应用程序)指针的方法 .
- MFC应用程序中指针的使用 视图 框架 文档 状态栏 菜单栏