如何在SDI中创建多框架视图

来源:互联网 发布:淘宝男款白衬衫 编辑:程序博客网 时间:2024/06/10 02:15

作者:陈飞

 

下载源代码


        当某一款待开发的系统由几大功能组成,并且各个模块在处理数据和处理方式上都有很大的区别,往往要考虑多框架的方案。即在一个程序中同事创建多个文档/视图框架,使每个框架有其自己的菜单、工具栏、文档和视图。这样一方面封装了各个模块的处理过程和处理数据,另一方面也可以使程序结构清晰,开发和维护都简单化。
工程实现
(1)建立工程项目

        利用Visual C++6.0向导新建一个名为TestMultiFrame的MFC SDI(单文档)应用程序。
(2)增加资源和相应的命令
        1、双击Menu项的IDR_MAINFRAME选项,添加“窗口”菜单项,在弹出菜单中添加“创建新框架窗口”、“显示新框架窗口”、“显示新窗口”三个子菜单项,分别定义菜单项的ID,并为三个菜单项添加基于TestMultiFrameApp的菜单事件函数OnCreatenewframewnd()、OnShownewframewnd()、OnShownewwnd()。
        2、右击Menu项,选择Insert Menu,添加新的菜单资源,并修改菜单的ID,添加“窗口”菜单项,在弹出菜单中添加“显示原框架窗口”和“显示新的窗口”两个子项,添加菜单项的事件函数OnShowoldframewnd()、OnShownewwnd()。
(3)添加新的框架、视图和文档
        利用Ctrl加W组合键,调出ClassWizard对话框,单击AddClass按钮,选择New项,弹出增加类的对话框,输入类名和基类信息:
        CTestFrame 基类: CFrameWnd
        CTestFrameDoc 基类: CDocument
        CTestFrameView 基类:CView
(4)动态创建框架窗口
        1、在TestMultiFrameApp类中加入成员变量:
private:    CSingleDocTemplate* m_pTestDocTemp;    CTestFrame* m_pTestFrame;    CmainFrame* m_pMainFrame;

        2、在其构造函数中将各指针初始化。
        3、增加文档模板。
        在CTestMulFrameApp中的InitInstance函数,在AddDocTemplate后面加上m_pTestDocTemplate的创建代码。
(5)、创建并切换到新的框架
        定位到CTestMulFrameApp中的OnCreatenewframewnd()函数添加如下代码:
if(m_pTestFrame == NULL){    m_pMainFrame = static_cast(m_pMainWnd);    m_pMainWnd = NULL;if(m_pTestDocTemplate->OpenDocumentFile(NULL) == NULL)    {        m_pMainWnd = static_cast(m_pMainFrame);        return;    }    ASSERT(m_pMainWnd != NULL);    m_pTestFrame = static_cast(m_pMainWnd);}else{    if(m_pMainWnd != m_pMainFrame)    {        m_pMainFrame = static_cast(m_pMainWnd);        m_pMainWnd = static_cast(m_pTestFrame);    }    M_pTestFrame->ShowWindow(SW_SHOW);    m_pTestFrame->GetActiveView()->OnInitialUpdate();    m_pTestFrame->UpdateWindow();}

(6)、显示原框架窗口
        定位到CTestMulFrameApp中的OnShowoldframewnd函数,添加如下代码:
m_pmainFrame->ShowWindow(SW_SHOW);m_pTestFrame->ShowWindow(SW_SHOW);PostThreadMessage(WM_OLDFRAME_FOCUS, 0, (long)m_pMainFrame);

        PostThreadMessage函数是用来取得窗口控制权,并将其设定为活动状态。
        然后在TestMulFrameApp中的OnOldFrameFocus消息函数中添加:
m_pMainWnd= (CMainFrame*)lParam;

(7)、显示新窗口
        根据当前活动窗口所对应的文档对象建立新的视图对象,代码如下:
CMainFrame* pActiveFrame = static_cast(m_pMainWnd);CDocument* pDocument;if(pActiveFrame == NULL || (pDocument = pActiveFrame->GetActiveDocument()) == NULL){    TRACE0(“Warning:No active document for Window New command.\n”);    AfxMessageBox(AFX_IDP_COMMAND_FAILUER);    Return;}CDocTemplate* pTemplate = pDocment->GetDocTemplate();ASSERT_VALID(pTemplate);CFrameWnd* pFrame = pTemplate->CreateTestFrame(pDocument, pActiveFrame);pTemplate->InitialUpdateFrame(pFrame, pDocument);

        本程序是基于单文档的应用程序,通过动态创建框架窗口实现多框架显示,同时,为了满足某种实际需求,程序中还实现了根据当前的活动文档对象建立新的视图对象,以进行多视图显示。具体创建方式请参考附件工程。
原创粉丝点击