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

15 篇文章 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)
{
       // 获取原来的活动窗体的视图句柄
       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)
       ……
};
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#中可以使用Panel控件实现多切换功能,具步骤如下: 1. 新建多个Form,分别设置不同的名称和内容。 2. 在主中添加一个Panel控件,用来容纳其他的内容。 3. 在Panel控件中选择一个默认的子,将其Visible属性设置为true,其他子设置为false。 4. 在主中添加按钮或菜项来实现子切换,每个按钮或菜项都对应一个子。 5. 在按钮或菜项的Click事件中,将默认的子Visible属性设置为false,对应的子Visible属性设置为true,实现子切换。 6. 可以通过传递参数的方式向子传递数据或触发相应的事件。 示例代码如下: //定义三个子 Form1 subForm1 = new Form1(); Form2 subForm2 = new Form2(); Form3 subForm3 = new Form3(); private void MainForm_Load(object sender, EventArgs e) { //将子添加到Panel控件中,默认显示第一个子 panel1.Controls.Add(subForm1); panel1.Controls.Add(subForm2); panel1.Controls.Add(subForm3); subForm1.Visible = true; subForm2.Visible = false; subForm3.Visible = false; } private void btnSubForm1_Click(object sender, EventArgs e) { //显示第一个子,隐藏其他子 subForm1.Visible = true; subForm2.Visible = false; subForm3.Visible = false; } private void btnSubForm2_Click(object sender, EventArgs e) { //显示第二个子,隐藏其他子 subForm1.Visible = false; subForm2.Visible = true; subForm3.Visible = false; } private void btnSubForm3_Click(object sender, EventArgs e) { //显示第三个子,隐藏其他子 subForm1.Visible = false; subForm2.Visible = false; subForm3.Visible = true; } 在实际开发中,可以根据需要扩展和优化该方法,比如使用Tab控件实现多切换,使用MDI(多文档界面)实现多间的交互等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值