频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

在单文档程序中动态切换多个窗体

来源:yesky 作者:郎锐 出处:巧巧读书 2006-01-27 进入讨论组
上一页 1 2 

  (五) 在框架类里添加函数SwitchToForm():

void CMainFrame::SwitchToForm(int nForm)
{
file://获取原来的活动窗体的视图句柄
CView* pOldActiveView = GetActiveView();
file://获取由"nForm"标识的窗体所对应的视图句柄
CView* pNewActiveView = (CView*) GetDlgItem(nForm);
file://若视图句柄为空,则创建一新的。
if (pNewActiveView == NULL)
{
if (nForm == IDD_SWITCHFORM_FORM)
pNewActiveView = (CView*)new CSwitchFormView;
if (nForm == IDD_NEXTFORM)
pNewActiveView = (CView*)new CNextFormView;
CCreateContext context;
context.m_pCurrentDoc = pOldActiveView->GetDocument();
pNewActiveView->Create(NULL,NULL,0L,
CFrameWnd::rectDefault,
this,nForm,&context);
pNewActiveView->OnInitialUpdate();
}
file://选择pNewActiveView为活动窗体
SetActiveView(pNewActiveView);
file://显示活动窗体,隐藏非活动窗体
pNewActiveView->ShowWindow(SW_SHOW);
pOldActiveView->ShowWindow(SW_HIDE);
int ID;
if(pOldActiveView->GetRuntimeClass() == RUNTIME_CLASS(CSwitchFormView))
ID=IDD_SWITCHFORM_FORM;
if(pOldActiveView->GetRuntimeClass() == RUNTIME_CLASS(CNextFormView))
ID=IDD_NEXTFORM;
file://设置窗体的ID号
pOldActiveView->SetDlgCtrlID(ID);
pNewActiveView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
RecalcLayout();
}

  (六)添加两个菜单相对应的命令响应函数和更新函数如下:

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变量匹配的视图类。如果找到,该窗口被激活。通过与之类似的方法,还可以实现在多
文档模式下的单档(文档)多视(视图),通过不同的视图以不同的方式显示来自同一份文档的数据,
以更好的满足程序的需要。来自:http://www.qqread.com/vc/e152247200.html进入讨论组讨论。
上一页 1 2 
收藏此文】【 】【打印】【关闭
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
巧巧读书宗旨
相关专题
讨论组问题推荐
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章