在单文档程序中动态切换多个窗体---VC---文档中心---源码天空
在单文档程序中动态切换多个窗体 - VC - 文档中心 - 源码天空 新建一个基于CView的单文档应用程序,再添加一个窗体和与之对应的基于CView的新视类,然后通过在主框架类里添加限制代码和菜单限制实现这两个窗体的动态切换,下面就是详细的实现过程 (一) 用MFC AppWizard建立一个新项目Switch,并在其次步的创建类型上选择为Single documnet单文档模式,第三、四、五、六步均取确省状态,最终一步选择CView作为视类的基类。点按完成按钮,生成了初始工程Switch。 (二) 点选菜单Insert、Resource8230;,在弹出的Insert Resource对话框中Dialog树里的IDD_VIEW,点击New按钮,生成了一个新的窗体,将其ID号改为IDD_NEXT。在原有的窗体上加一个静态框这是第一个窗体;在新建的窗体上也添加一个静态框这是其次个窗体。 (三) 在菜单资源的IDR_MAINFRAME上添加一级菜单窗体切换,及其二级菜单第一个窗体、其次个窗体,其标识号分别为ID_FIRST和ID_SECOND。修该第一个窗体的属性为Checked,表明程序初始时显示的是第一个窗体。 (四) 在ClassView属性页里的Switch classes上右键,在弹出菜单上选择New Class8230;,弹出New Class对话框,选择Dialog ID为我们刚添加的新窗体IDD_NEXT,选择Base class为CView,类名取为CNextView,这样就把其次个窗体对应的视图类添加到了工程。 (五) 在框架类里添加函数SwitchTo() void CMainFrameSwitchToint n { // 获得原来的活动窗体的视图句柄 CView* pOldActiveView GetActiveView; // 获得由n标识的窗体所对应的视图句柄 CView* pNewActiveView CView* GetDlgItemn; // 若视图句柄为空,则创建一新的。 if pNewActiveView NULL { if n IDD_SWITCH_ pNewActiveView CView*new CSwitchView; if n IDD_NEXT pNewActiveView CView*new CNextView; CCreateContext context; context.m_pCurrentDoc pOldActiveView-gt;GetDocument; pNewActiveView-gt;CreateNULL, NULL, 0L, CFrameWndrectDefault, this, n, amp;context; pNewActiveView-gt;OnInitialUpdate; } // 选择pNewActiveView为活动窗体 SetActiveViewpNewActiveView; // 显示活动窗体,隐藏非活动窗体 pNewActiveView-gt;ShowWindowSW_SHOW; pOldActiveView-gt;ShowWindowSW_HIDE; int ID; if pOldActiveView-gt;GetRuntimeClass RUNTIME_CLASSCSwitchView ID IDD_SWITCH_; ifpOldActiveView-gt;GetRuntimeClass RUNTIME_CLASSCNextView ID IDD_NEXT; // 设置窗体的ID号 pOldActiveView-gt;SetDlgCtrlIDID; pNewActiveView-gt;SetDlgCtrlIDAFX_IDW_PANE_FIRST; RecalcLayout; } (六)添加两个菜单相对应的吩咐响应函数和更新函数如下 void CMainFrameOnFirst { // 通过IsKindOf函数确定当前活动窗口是否是第一个窗口,如是,则无须切换, // 否则将通过SwitchTo函数将当前活动窗口切换到IDD_SWITCH_ // 标识的其次个窗体。 if GetActiveView-gt;IsKindOfRUNTIME_CLASSCSwitchView return; SwitchToIDD_SWITCH_; } void CMainFrameOnUpdateFirstCUI *pUI { // 通过IsKindOf函数推断当前活动窗口是否是第