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

作者:陈飞

 

下载源代码


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

        本程序是基于单文档的应用程序,通过动态创建框架窗口实现多框架显示,同时,为了满足某种实际需求,程序中还实现了根据当前的活动文档对象建立新的视图对象,以进行多视图显示。具体创建方式请参考附件工程。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值