NitroBake2动力学转换关键帧C4D插件V2.07版下载
NitroBake2动力学转换关键帧C4D插件V2.07版下载
程序员面试宝典 PDF电子书 高清版
程序员面试宝典 PDF电子书 高清版
凯立德最新2012电子眼文件(高清版) 红绿灯 测速 预警
凯立德最新2012电子眼文件(高清版) 红绿灯 测速 预警
极速FLV合并器 亲测好用的FLV合并工具软件
极速FLV 合并器 亲测好用 FLV合并工具 软件
300多条MTK工作笔记为你的工作节省一半时间.pdf
300多条MTK工作笔记为你的工作节省一半时间.pdf
RAMDISK 4G, 详细教程版。不会的请来看
RAMDISK 4G 内存 详细教程版 RAMDISK 4G 内存 详细教程版
最好的自动整理内存的小软件 很实用
最好的自动整理内存的小软件 很实用最好的自动整理内存的小软件 很实用
MTK_MMI函数手册
MTK_MMI函数手册 MTK MMI 函数 宝典 说明书 API
QQ号码分析工具2.1.1 整理qq号的工具
QQ号码分析工具2.1.1 整理qq号的工具
深入BREW开发.rar 深入BREW开发.doc 深入BREW开发.pdf
深入BREW开发.rar 深入BREW开发.doc 深入BREW开发.pdf
VMware-workstation-6.5汉化补丁VMware6.5汉化补丁 VMware6.5中文 VMware6.5简体中文
VMware-workstation-6.5汉化补丁VMware6.5汉化补丁 VMware6.5中文 VMware6.5简体中文
金山词霸2009牛津版激活程序(支持sp2更新-内附属使用说明)
金山词霸2009牛津版激活程序(支持sp2更新-内附属使用说明)
百度笔试题 百度 笔试题
百度笔试题 百度 笔试题 百度 笔试题
计算机网络(第4版)中文版PDF完美版part1(All 4 Parts)
清华大学出版社 / 2004-8-1 / (美)特南鲍姆(Tanenbaum,A.S.)著,潘爱民 译 / 60 元
ISBN:7302089773
计算机网络(第4版)中文版PDF完美版part2(All 4 Parts)
清华大学出版社 / 2004-8-1 / (美)特南鲍姆(Tanenbaum,A.S.)著,潘爱民 译 / 60 元
ISBN:7302089773
计算机网络(第4版)中文版PDF完美版part3(All 4 Parts)
清华大学出版社 / 2004-8-1 / (美)特南鲍姆(Tanenbaum,A.S.)著,潘爱民 译 / 60 元
ISBN:7302089773
计算机网络(第4版)中文版PDF完美版part4(All 4 Parts)
清华大学出版社 / 2004-8-1 / (美)特南鲍姆(Tanenbaum,A.S.)著,潘爱民 译 / 60 元
ISBN:7302089773
PDG转PDF万能工具
PDG转PDF万能工具 PDG转PDF万能工具 PDG转PDF万能工具
C++之父Bjarne Stroustrup 的C++ Style and Technique FAQ
C++之父Bjarne Stroustrup 的C++ Style and Technique FAQ
西北工业大学C++全套课件
西北工业大学 C++ 全套课件西北工业大学c++全套课件,绝对好的课件
BCGControlBar.专业版.v9.4.Full.Source 完整版Part1
BCGControlBar.专业版.v9.4.Full.Source 完整版Part1
BCGControlBar.专业版.v9.4.Full.Source 完整版Part2
BCGControlBar.专业版.v9.4.Full.Source 完整版Part2
Mycolor 我的取色器2007 很强大的取色软件
Mycolor 我的取色器2007 很强大的取色软件
200个XP系统图标 很好很强大
200个XP系统图标 很好很强大
很好的FileDialog控件 类似IE的选项对话框以及超链接类源码
很好的FileDialog控件 类似IE的选项对话框以及超链接类源码
VC6.0透明背景的对话框示例代码
VC6.0 透明背景 对话框 示例代码
last_order fantastic_dream Slicer系列精美图标下载
last_order fantastic_dream Slicer 系列 精美图标
Adobe奥多比注册机全集 35合1 史上最强大
Adobe 奥多比 注册机全集 35合1 史上最强大
北京大学信息学院数理逻辑经典教程
北京大学信息学院数理逻辑经典教程 共333页教程 计算机逻辑的经典教材
利用多线程在程序繁忙时显示进度条源代码
利用多线程在程序繁忙时显示进度条源代码 很好的了解学习多线程的源代码
MFC多线程编程源代码和说明文档(二)
MFC多线程编程源代码和说明文档(二)
MFC多线程编程源代码和说明文档
MFC多线程编程源代码和说明文档
ubuntu实用教程
ubuntu实用教程<br>
在单文档程序中动态切换多个窗体的源码程序
摘要:本文通过一个程序实例描述了在VC++6.0下如何在单文档程序中通过菜单动态控制多 个窗体的切换。 一、 引言 我们在编制程序中根据需求的不同会在程序风格上选择多文档、单文档或是对话框模式 ,对于单文档模式可能是我们使用比较多的,但有时我们想采用单文档的形式显示多个不同 的窗体,如作为数据库前台应用程序就会遇到此类问题,数据库由大量的表单组成,而同常 一个窗体内只用来显示一个表单,所以要显示其他的表单时就要用到切换窗体的技术了,下 面就通过一个程序说明该技术的实现方法。 二、 实现技术 新建一个基于CFormView的单文档应用程序,再添加一个窗体和与之对应的基于 CFormView的新视类,然后通过在主框架类里添加控制代码和菜单控制实现这两个窗体的动态 切换,下面就是具体的实现过程: (一) 用"MFC AppWizard(exe)"建立一个新项目"SwitchForm",并在第二步的创建类型上选 择为"Single documnet"单文档模式,第三、四、五、六步均取确省状态,最后一步选择 "CFormView"作为视类的基类。点按"完成"按钮,生成了初始工程"SwitchForm"。 (二) 点选菜单"Insert"、"Resource…",在弹出的"Insert Resource"对话框中"Dialog"树 里的"IDD_FORMVIEW",点击"New"按钮,生成了一个新的窗体,将其ID号改为"IDD_NEXTFORM"。 在原有的窗体上加一个静态框"这是第一个窗体";在新建的窗体上也添加一个静态框"这是第二 个窗体"。 (三) 在菜单资源的"IDR_MAINFRAME"上添加一级菜单"窗体切换",及其二级菜单"第一个窗 体"、"第二个窗体",其标识号分别为"ID_FIRSTFORM"和"ID_SECONDFORM"。修该"第一个窗体" 的属性为"Checked",表明程序初始时显示的是第一个窗体。 (四) 在"ClassView"属性页里的"SwitchForm classes"上右键,在弹出菜单上选择 "New Class…",弹出"New Class"对话框,选择"Dialog ID:"为我们刚添加的新窗体 "IDD_NEXTFORM",选择"Base class:"为"CFormView",类名取为"CNextFormView",这样就把第 二个窗体对应的视图类添加到了工程。 (五) 在框架类里添加函数SwitchToForm(): void CMainFrame::SwitchToForm(int nForm) { file://获取原来的活动窗体的视图句柄 CView* pOldActiveView = GetActiveView(); file://获取由"nForm"标识的窗体所对应的视图句柄 CView* pNewActiveView = (CView*) GetDlgItem(nForm); file://若视图句柄为空,则创建一新的。 if (pNewActiveView == NULL) { if (nForm == IDD_SW99vCHFORM_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_SW99vCHFORM_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_SW99vCHFORM_FORM" file://标识的第二个窗体。 if (GetActiveView()->IsKindOf(RUNTIME_CLASS(CSwitchFormView))) return; SwitchToForm(IDD_SW99vCHFORM_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变量匹配的视图类。如果找到,该窗口被激活。通过与之类似的方法,还可以实现在多文档模式下的单档(文档)多视(视图),通过不同的视图以不同的方式显示来自同一份文档的数据,以更好的满足程序的需要。