在单文档程序中动态切换多个窗体(2)
(六)添加两个菜单相对应的命令响应函数和更新函数如下:
void CMainFrame::OnFirstform()
{
file://通过IsKindOf函数确定当前活动窗口是否是第一个窗口,如是,则无须切换,
file://否则将通过SwitchToForm函数将当前活动窗口切换到"IDD_SWITCHFORM_FORM"
file://标识的第二个窗体。
if (GetActiveView()->IsKindOf(RUNTIME_CLASS(CSwitchFormView)))
return;
SwitchToForm(IDD_SWITCHFORM_FORM);
}
void CMainFrame::OnUpdateFirstform(CCmdUI* pCmdUI)
{
file://通过IsKindOf函数判断当前活动窗口是否是第一个窗体,如是则将其选中。
pCmdUI->SetCheck(GetActiveView()->IsKindOf(RUNTIME_CLASS(CSwitchFormView)));
}
void CMainFrame::OnSecondform()
{
if (GetActiveView()->IsKindOf(RUNTIME_CLASS(CNextFormView)))
return;
SwitchToForm(IDD_NEXTFORM);
}
void CMainFrame::OnUpdateSecondform(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(GetActiveView()->IsKindOf(RUNTIME_CLASS(CNextFormView)));
}
然后再在该文件开始处添加对两个视图类的引用:
#include "SwitchFormDoc.h"
#include "SwitchFormView.h"
#include "NextFormView.h"
在此须注意:应在两个视类的引用之前添加对文档类的引用,否则会引起编译错误。另外,由于视类的构造函数在声明时都确省的声明为保护型的,在框架类中无法引用,所以还要将两个视类的类声明改动如下:
class CNextFormView : public CFormView
{
public: file://将protected 改为public.
CNextFormView();
……
};
class CSwitchFormView : public CFormView
{
public: file://将protected 改为public.
CSwitchFormView();
……
};
三、 编译运行
编译运行程序,开始时的窗体上有"这是第一个窗体的字样",菜单也只有"第一个窗体"是被选中的,当前的活动窗体是第一个窗体;点击菜单"第二个窗体",视图中的窗体上的字样变成了"这是第二 个窗体",同时选中的菜单也由"第一个窗体"变成了"第二个窗体",实现了通过菜单将窗体进行动态切换。
总结:此程序中关键的是SwitchToView函数,在此函数中,程序搜索所有当前文档的显示窗口来查找与CruntimeClass变量匹的视图类。如果找到,该窗口被激活。通过与之类似的方法,还可以实现在多文档模式下的单档(文档)多视(视图),通过不同的视图以不同的方式显示来自同一份文档的数据,以更好的满足程序的需要。