基于MDI和CFormView框架的多视图开发实例

来源:互联网 发布:东莞市乐其网络可信吗? 编辑:程序博客网 时间:2024/05/16 10:10

 

基于MDICFormView框架的多视图开发实例

1.       打开VC++6.0 利用向导建立一个MFC AppWizard exe)项目,取名MDIx.下一个页面选择Multiple DocumentsMDI),向导最后一个页面的View类的Base ClassCformView

 

2.       Resource管理器中选择向导默认生成的DialogIDD_MDIX_FORMCtrl+C 然后Ctrl+V复制生成一个新得DialogID设为IDD_SUB_FORM.

 

3.       Ctrl+W打开Class Wizard,为IDD_SUB_FORM 创建一个类CsubFormBase ClassCFormView.向导默认为IDD_MDIX_FORM生成了CMDIxView类,基类也是CFormView

 

4.       打开Resource管理器,打开Menu选择IDR_MAINFRAME,添加一个Pop-up子菜单,名字设为“窗口”,菜单项为IDM_WINDOW_SUB,名称为“Main窗口”,IDM_WINDOW_MAIN,名称为“Main窗口”

 

5.       选择IDM_WINDOW_SUBCtrl+W打开Class Wizard.CMainFrame类中为IDM_WINDOW_SUBIDM_WINDOW_MAIN分别添加COMMANDUPDATE_COMMAND_UI命令的消息响应函数:

 

OnWindowSub()OnUpdateWindowSub(CCmdUI* pCmdUI)OnWindowMain()OnUpdateWindowMain(CCmdUI* pCmdUI)

 

6.       CmainFrame类中添加两个public指针变量:

public:

       CChildFrame * m_subWindow;

       CChildFrame * m_mainWindow;

 

 

7.       CmainFrame的构造函数中把m_subWindowm_mainWindow初始化为NULL;

m_subWindow=NULL;

m_mainWindow=NULL;

8.       MainFrm.h中加入

#include "ChildFrm.h"

#include "MDIxDoc.h"

#include "MDIxView.h"

#include "SubForm.h"

 

9.       OnWindowSub()中加入:

      

       if (m_subWindow!= NULL && m_subWindow ->GetSafeHwnd() != NULL)

       {

              m_subWindow ->MDIActivate();

              return;

       }

       else

       {

               CCreateContext context;

context.m_pNewViewClass = RUNTIME_CLASS(CSubForm);

 

              m_subWindow = new CChildFrame();

              m_subWindow ->LoadFrame(IDR_MAINFRAME,WS_MAXIMIZE|WS_OVERLAPPEDWINDOW,this,&context);

             

              m_subWindow ->ShowWindow(SW_SHOWMAXIMIZED);

              ////设置主窗口标题

              m_subWindow ->GetParentFrame()->SetWindowText(“sub窗口”);

              m_subWindow ->InitialUpdateFrame(NULL,true);

             

              return;

}

 

 

10.    OnWindowMain ()中加入:

      

       i // TODO: Add your command handler code here

       if(m_mainWindow!=NULL)

       {

              m_mainWindow->MDIActivate();

              return;

       }

       else

       {

              CCreateContext context;

              context.m_pNewViewClass=RUNTIME_CLASS(CMDIxView);

              m_mainWindow=new CChildFrame;

              m_mainWindow->LoadFrame(IDR_MAINFRAME,WS_OVERLAPPEDWINDOW|WS_MAXIMIZE,this,&context);

              m_mainWindow->ShowWindow(SW_SHOWMAXIMIZED);

              m_mainWindow->GetParentFrame()->SetWindowText("Main Window");

              m_mainWindow->InitialUpdateFrame(NULL,true);

       }

 

11.   OnUpdateWindowSub(CCmdUI* pCmdUI)中加入:

if(GetActiveFrame()!=this)

{

        if(GetActiveFrame()->GetActiveView())

               if(GetActiveFrame()->GetActiveView()->IsKindOf(RUNTIME_CLASS(CSubForm)))

                      pCmdUI->Enable(FALSE);

}else

{

        pCmdUI->Enable();

}

12.    OnUpdateWindowMain(CCmdUI* pCmdUI)中加入:

if(GetActiveFrame()!=this)

{

        if(GetActiveFrame()->GetActiveView())

               if(GetActiveFrame()->GetActiveView()->IsKindOf(RUNTIME_CLASS(CMDIxView)))

                      pCmdUI->Enable(FALSE);

}else

{

        pCmdUI->Enable();

}

 

13.   ChildFrm.h中添加#include "MainFrm.h"

14.   CchildFrame类中增加WM_CLOSE消息响应函数:void CChildFrame::OnClose()

并添加代码:

 

if(this==((CMainFrame *)AfxGetMainWnd())->m_subWindow)    

           ((CMainFrame *)AfxGetMainWnd())->m_subWindow =NULL;

if(this==((CMainFrame *)AfxGetMainWnd())->m_mainWindow)

           ((CMainFrame *)AfxGetMainWnd())->m_mainWindow =NULL;

//子窗口关闭后,销毁指向本子窗口的指针

15.   CChildFrame::PreCreateWindow(CREATESTRUCT& cs)中添加

////窗口的创建样式

cs.style   =   WS_CHILD|

        WS_VISIBLE|

        WS_OVERLAPPED|

        WS_CAPTION|

        WS_SYSMENU|

        //FWS_ADDTOTITLE|

        //WS_THICKFRAME|

        //WS_MINIMIZEBOX|

        WS_MAXIMIZEBOX|

        WS_MAXIMIZE;

16. BOOL CMDIxApp::InitInstance()中修改:

pMainFrame->ShowWindow(SW_SHOWMAXIMIZED);

 

16.   可以在主程序BOOL CMDIxApp::InitInstance()中删除以下代码,以便程序初始化时不打开任何视图。

CMultiDocTemplate* pDocTemplate;

       pDocTemplate = new CMultiDocTemplate(

              //IDR_MDIXTYPE,

              IDR_MAINFRAME,

              RUNTIME_CLASS(CMDIxDoc),

              RUNTIME_CLASS(CChildFrame), // custom MDI child frame

              RUNTIME_CLASS(CMDIxView));

       AddDocTemplate(pDocTemplate);

 

 

 

原创粉丝点击