65.9K
CodeProject is changing. Read more.
Home

A Doc/View Dialog, supports Dynamic Split

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.69/5 (12 votes)

Aug 22, 2003

1 min read

viewsIcon

83614

downloadIcon

3143

You can arbitrarily add DOC/View, and all the view can be resized.

Sample Image - A_Doc_View_Dialog_support.jpg

As you see, you can arbitrarily add DOC/View, and all the view can be resized.

Why I Write this class?

My company asked me to make a COM dialog supporting multi_Doc/View. Because this is a COM based dialog, I can't make it using this Single or Mulit_Doc Doc/View. I looked for a solution in The Code Project, Code Guru etc., but I couldn't find a suitable class and sample, so I did it myself.

What's this about?

This demo only implements the base function: you can add the Doc / view, resize the View by dragging the splitter. Here, using iterator, notice all the view changing size. This can be done better :-), and this method has some bug. For example, I can't proportionately scale the sub_split's view… I will fix it. :-)

What classes are part of this?

  • CSplitterControl

    This class is like the Split, but not derived form the CSplitterWnd.

  • CDisplayView

    View's base class, here all view resizing must derive form it.

How to using this class

  1. Add this files into your project

    SplitterControl.h 
    SplitterControl.cpp 
    /*all view should come from CDisplayView */
    DisplayView.h 
    DisplayView.cpp
  2. Add some code in your project

    /*File "MyDialog.h"*/ 
    #include <VECTOR>
    #include "SplitterControl.h" 
    #include "DisplayView.h" 
           using namespace std; 
    class CMyDlgDlg: public CDialog 
    { 
        /*…………*/ 
        void UpdateRect(CSplitterControl *pSplitter); 
        CDisplayView *AddRootView(UINT docNum, UINT viewNum,CRect 
                       rect,CSplitterControl *splitter); 
        void AddView(UINT docNum,UINT viewNum,UINT type, 
                     CSplitterControl *splitter, 
                     CView *pCurView); 
        /*…………*/ 
        /* Split vector*/ 
         CSplitterControl m_pSplit; 
         CCreateContext m_pContext; 
        /*………………*/ 
    };
  3. Into the CMyDlgDlg's dialog designer

    • Add a "Picture Box", ID = "IDC_STA_SPLIT".

      It will become the root Split's position;

    • Add a "Ststic", ID = "IDC_STA_VIEW".

      It will become the region of the all View draw.

  4. Copy the function implementation code from the demo project.

    void CMyDlgDlg::AddView(UINT docNum, UINT viewNum,UINT type, 
    CSplitterControl *splitter,CView *pCurView) 
    { 
      /*………… copy demp project code here */
    } 
    CDisplayView *CMyDlgDlg::AddRootView(UINT docNum, UINT viewNum, 
    CRect rect,CSplitterControl *splitter) 
    { 
      /*………… copy demp project code here */
    
    } 
    void CMyDlgDlg::UpdateRect(CSplitterControl *pSplitter) 
    { 
      /*………… copy demp project code here */
    
    } 
    BOOL CMyDlgDlg::OnInitDialog() 
    { 
      CDialog::OnInitDialog(); 
      /*……………… */
      /* TODO: Add extra initialization here  */
      /* flowwer code using init the root view. */
      CRect rc; 
      GetDlgItem(IDC_STA_SPLIT)->GetWindowRect(rc); 
      ScreenToClient(rc); 
      m_pSplit.Create(WS_CHILD | WS_VISIBLE,rc,this,IDC_STA_SPLIT); 
      m_pSplit.SetRange(300, 300, -1); 
      GetDlgItem(IDC_STA_VIEW)->GetWindowRect(rc); 
      ScreenToClient(rc); 
    /***************************************/ 
    /*In here add the root View and Document*/ 
      m_pSplit.AddRootView(0,1,rc); 
      m_pSplit.ShowWindow(SW_HIDE); 
    return TRUE;
    }
  5. In the SplitterControl.cpp, add the Dialog's head file

    #include "MyDlg.h"    /*The application class */ 
    #include "MyDlgDlg.h" /*the dialog class */

I am Chinese and finish my school life last month, my English is very poor, so this article has some language error :-). I am a devoted reader of CodeProject, thanks everybody for helping me. Thanks CodeProject, thanks C++.