自制水晶泥用洗衣粉:在单文档程序中动态切换多个窗体 - VC - 文档中心 - 源码天空
来源:百度文库 编辑:九乡新闻网 时间:2024/10/04 03:50:25
新建一个基于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){ // 获取原来的活动窗体的视图句柄 CView* pOldActiveView = GetActiveView(); // 获取由"nForm"标识的窗体所对应的视图句柄 CView* pNewActiveView = (CView*) GetDlgItem(nForm); // 若视图句柄为空,则创建一新的。 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(); }// 选择pNewActiveView为活动窗体 SetActiveView(pNewActiveView);// 显示活动窗体,隐藏非活动窗体 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;// 设置窗体的ID号 pOldActiveView->SetDlgCtrlID(ID); pNewActiveView->SetDlgCtrlID(AFX_IDW_PANE_FIRST); RecalcLayout();} (六)添加两个菜单相对应的命令响应函数和更新函数如下: void CMainFrame::OnFirstform(){// 通过IsKindOf函数确定当前活动窗口是否是第一个窗口,如是,则无须切换, // 否则将通过SwitchToForm函数将当前活动窗口切换到"IDD_SWITCHFORM_FORM" // 标识的第二个窗体。 if (GetActiveView()->IsKindOf(RUNTIME_CLASS(CSwitchFormView))) return; SwitchToForm(IDD_SWITCHFORM_FORM);} void CMainFrame::OnUpdateFirstform(CCmdUI *pCmdUI){// 通过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{ DECLARE_DYNCREATE(CNextFormView) // protected: 将 protected 改为 publicpublic: CNextFormView(); virtual ~CNextFormView(); ……}; class CSwitchFormView : public CFormView{// protected: 将 protected 改成 publicpublic: CSwitchFormView(); DECLARE_DYNCREATE(CSwitchFormView) ……};
在单文档程序中动态切换多个窗体 - VC - 文档中心 - 源码天空
在单文档程序中动态切换多个窗体 - VC - 文档中心 - 源码
在VC/MFC编程中将单文档程序改成多文档方法(原创)_闲云野鹤的博客 —— 纪念大二和大...
在RCP程序中嵌入Word文档
如何在MFC单文档中创建多视图111
将文件夹压缩成zip文件的php代码 - Web开发 - 文档中心 - 源码天空
G.729与G.723语音编码介绍及优化 - 编程心得 - 文档中心 - 源码天空
在Word 2003文档窗口中切换到“普通视图”[图]
怎样让多文档程序在启动时不打开一个空文档
28个实用的源码/文档比较合并工具
在Word文档中插入AutoCAD图形-
怎样在Word2003文档中隐藏图片
如何在word文档中插入田字格?
怎样在word文档中插入文本框?
在Word文档中插入AutoCAD图形
VC中判断窗体是否存在
.net中多文档程序中父窗口和子窗口菜单的合并的实现方法
利源电力集团公司在"降本提效年"中DOC文档下载 - 第一文档网
在Word 2003中打印多节文档的一系列页
在Word2003文档中设置页面背景颜色 - Word Home
急:如何在Word文档中插入分数
在EXCEL或者WORD文档中插入FLASH的方法
16.在word文档中插入“Excel工作表”2010
16.在word文档中插入“Excel工作表”44