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

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

发表:yueshang   阅读: 885次  关键字:   字体:[ ]

 

新建一个基于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 改为 public
public:
       CNextFormView();         
       virtual ~CNextFormView();
        ……
};
 
class CSwitchFormView : public CFormView
{
// protected: 将 protected 改成 public
public:
       CSwitchFormView();
       DECLARE_DYNCREATE(CSwitchFormView)
       ……
};

posted on 2011-01-09 12:05  cy163  阅读(...)  评论(...编辑  收藏

导航