My FAQ,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Visual C++ > 文档/视/框架
ProvideanAlternativeViewtoDataUsingSplitterWindow
作者:ghj1976 时间:2001-10-08 10:08 出处:互联网 责编:MyFAQ
              摘要:ProvideanAlternativeViewtoDataUsingSplitterWindow

HOWTO: Provide an Alternative View to Data Using Splitter Window (Q196832)


The information in this article applies to:

  • The Microsoft Foundation Classes (MFC), used with:
    • Microsoft Visual C++, 32-bit Enterprise Edition, version 4.2
    • Microsoft Visual C++, 32-bit Professional Edition, version 4.2
    • Microsoft Visual C++, 32-bit Enterprise Edition, version 5.0
    • Microsoft Visual C++, 32-bit Professional Edition, version 5.0
    • Microsoft Visual C++, 32-bit Enterprise Edition, version 6.0
    • Microsoft Visual C++, 32-bit Professional Edition, version 6.0
    • Microsoft Visual C++, 32-bit Learning Edition, version 6.0



SUMMARY

This article demonstrates how to use a static splitter window in a traditional SDI document-view architecture. The article shows how to design an application that can switch between a single view and a splitter window that can embed as many panes as necessary.


MORE INFORMATION

The solution consists of embedding a pointer to a CSplitterWnd in CMainFrame, as opposed to the recommended way of embedding the CSplitterWnd object. Later, when the application needs to switch from the regular view to the splitter window, this splitter window is created on the heap and initialized by using CreateStatic(), while the regular view is destroyed.

NOTE: To avoid destruction of the CDocument-derived object when the view is destroyed, you need to set its m_bAutoDelete data member to FALSE.

You can easily expand the code to support static splitter windows with different numbers of panes, depending on some run-time conditions.

Steps to Create Sample

  1. Create a new SDI project.

  2. Add a SplitterWnd (ID_VIEW_SPLITTERWND) menu item to a View menu. This item turns the splitter window on and off.

  3. To preserve the document when there is no view associated with it, add add the following code in the CDocument-derived class constructor:

          CMyDoc::CMyDoc()
          {
             m_bAutoDelete = FALSE;
          }
  4. To avoid resource leaks, you also need to set the flag back to true before the destruction of the last view associated with the document (for example, in the CMainFrame handler of WM_CLOSE:

    CMainFrame::OnClose()):
          CMainFrame::OnClose()
          {
             GetActiveDocument()->m_bAutoDelete = TRUE;
             CFrameWnd::OnClose();
          }
  5. Add a pointer to a CSplitterWnd in the CMainFrame definition:

          class CMainFrame : public CFrameWnd
          {
          ...
            protected:
             CSplitterWnd *m_pSplitter;
          ...
          };
  6. Initialize this object in the CMainFrame constructor, and delete it in the destructor:

          CMainFrame::CMainFrame()
          {
             // TODO: add member initialization code here.
             m_pSplitter = NULL;
          }
    
          CMainFrame::~CMainFrame()
          {
             if (m_pSplitter)
                delete m_pSplitter;
          }
  7. Add two new CView-derived classes to your project, representing views that are the panes in your CSplitterWnd.

  8. Add the following #include statements in your MainFrm.cpp file:

          #include "MyDoc.h"
          #include "MyView.h"
          #include "Pane1View.h"
          #include "Pane2View.h"
  9. Use Class Wizard to create a command and an UpdateUI handler in CMainFrame for the menu item you added:

          void CMainFrame::OnUpdateViewSplitterWnd(CCmdUI* pCmdUI)
          {
             // TODO: Add your command update UI handler code here.
             pCmdUI->SetCheck(m_pSplitter!=NULL);
          }
    
          void CMainFrame::OnViewSplitterWnd()
          {
             // TODO: Add your command handler code here.
             CCreateContext ctx;
             ctx.m_pNewViewClass = RUNTIME_CLASS(CMyView);
             // GetActiveDocument() call before you destroy m_splitter.
             ctx.m_pCurrentDoc = GetActiveDocument();
             ASSERT(ctx.m_pCurrentDoc!=NULL);
    
             // m_pSplitter !=NULL when there is a visible splitter.
             if (m_pSplitter)
             {
                // Destroy splitter window.
                delete m_pSplitter;
                m_pSplitter = NULL;
    
                // Create and initialize CMyView.
                SetActiveView((CView*)CreateView(&ctx));
                GetActiveView()->OnInitialUpdate();
             }
             else
             {
                // Destroy CMyView.
                GetActiveView()->DestroyWindow();
    
                // Create new splitter window.
                m_pSplitter = new CSplitterWnd;
                if (!m_pSplitter->CreateStatic(this, 1, 2))
                {
                   TRACE0("Can't create splitter window.\n");
                   return;
                }
                else
                {
                   if ((!m_pSplitter->CreateView(0, 0,
                                                 RUNTIME_CLASS(CPane1View),
                                                 CSize(200, 0), &ctx))
                     ||(!m_pSplitter->CreateView(0, 1,
                                                 RUNTIME_CLASS(CPane2View),
                                                 CSize(500, 0), &ctx)))
                   {
                      TRACE0("Can't create one of the splitter panes.\n");
                      return;
                   }
    
                   // Initialize the two panes (each containing a view
                   // associated with the current document).
                   ((CView*)m_pSplitter->GetPane(0, 0))->OnInitialUpdate();
                   ((CView*)m_pSplitter->GetPane(0, 1))->OnInitialUpdate();
                   SetActiveView((CView*)m_pSplitter->GetPane(0, 0));
                }
             }
    
             // Redisplay frame.
             RecalcLayout();
         
     }
    


Published Dec 8 1998 9:32PM Issue Type kbhowto
Last Modifed Jul 17 2001 4:32PM Additional Query Words
Keywords kbDocView kbMFC KbUIDesign kbVC420 kbVC500 kbVC600 kbGrpDSMFCATL
关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 myfaq.com.cn All rights reserved. www.myfaq.com.cn 版权所有