65.9K
CodeProject 正在变化。 阅读更多。
Home

支持动态分割的文档/视图对话框

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.69/5 (12投票s)

2003年8月22日

1分钟阅读

viewsIcon

84575

downloadIcon

3143

您可以任意添加文档/视图,并且所有视图都可以调整大小。

Sample Image - A_Doc_View_Dialog_support.jpg

如您所见,您可以任意添加文档/视图,并且所有视图都可以调整大小。

我为什么要编写这个类?

我的公司要求我做一个支持多文档/视图的 COM 对话框。由于这是一个基于 COM 的对话框,我无法使用单文档或多文档文档/视图来实现它。我在 Code Project、Code Guru 等地方寻找解决方案,但没有找到合适的类和示例,所以我自己动手做了。

这是关于什么的?

这个演示只实现了基本功能:您可以添加文档/视图,通过拖动分割条来调整视图大小。这里使用了迭代器,注意所有视图都在改变大小。这可以做得更好 :-),而且这种方法有一些错误。例如,我无法按比例缩放子分割的视图……我会修复它。:-)

这个类包含哪些类?

  • CSplitterControl

    这个类类似于分割窗口,但不是从 CSplitterWnd 派生的。

  • CDisplayView

    视图的基础类,所有视图调整大小都必须从它派生。

如何使用这个类

  1. 将这些文件添加到您的项目中

    SplitterControl.h 
    SplitterControl.cpp 
    /*all view should come from CDisplayView */
    DisplayView.h 
    DisplayView.cpp
  2. 在您的项目中添加一些代码

    /*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. 进入 CMyDlgDlg 的对话框设计器

    • 添加一个“PictureBox”,ID = “IDC_STA_SPLIT”。

      它将成为根分割窗口的位置;

    • 添加一个“Static”,ID = “IDC_STA_VIEW”。

      它将成为所有视图绘制的区域。

  4. 从演示项目中复制函数实现代码。

    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. 在 SplitterControl.cpp 中,添加对话框的头文件

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

我是一名中国人,上个月刚完成学业,我的英语很差,所以这篇文章可能存在一些语言错误 :-)。我是 CodeProject 的忠实读者,感谢大家对我的帮助。感谢 CodeProject,感谢 C++。

© . All rights reserved.