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






3.69/5 (12投票s)
2003年8月22日
1分钟阅读

84575

3143
您可以任意添加文档/视图,并且所有视图都可以调整大小。
如您所见,您可以任意添加文档/视图,并且所有视图都可以调整大小。
我为什么要编写这个类?
我的公司要求我做一个支持多文档/视图的 COM 对话框。由于这是一个基于 COM 的对话框,我无法使用单文档或多文档文档/视图来实现它。我在 Code Project、Code Guru 等地方寻找解决方案,但没有找到合适的类和示例,所以我自己动手做了。
这是关于什么的?
这个演示只实现了基本功能:您可以添加文档/视图,通过拖动分割条来调整视图大小。这里使用了迭代器,注意所有视图都在改变大小。这可以做得更好 :-),而且这种方法有一些错误。例如,我无法按比例缩放子分割的视图……我会修复它。:-)
这个类包含哪些类?
CSplitterControl
这个类类似于分割窗口,但不是从
CSplitterWnd
派生的。CDisplayView
视图的基础类,所有视图调整大小都必须从它派生。
如何使用这个类
-
将这些文件添加到您的项目中
SplitterControl.h SplitterControl.cpp /*all view should come from CDisplayView */ DisplayView.h DisplayView.cpp
-
在您的项目中添加一些代码
/*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; /*………………*/ };
-
进入 CMyDlgDlg 的对话框设计器
- 添加一个“
PictureBox
”,ID = “IDC_STA_SPLIT
”。它将成为根分割窗口的位置;
- 添加一个“
Static
”,ID = “IDC_STA_VIEW
”。它将成为所有视图绘制的区域。
- 添加一个“
-
从演示项目中复制函数实现代码。
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; }
-
在 SplitterControl.cpp 中,添加对话框的头文件
#include "MyDlg.h" /*The application class */ #include "MyDlgDlg.h" /*the dialog class */
我是一名中国人,上个月刚完成学业,我的英语很差,所以这篇文章可能存在一些语言错误 :-)。我是 CodeProject 的忠实读者,感谢大家对我的帮助。感谢 CodeProject,感谢 C++。