/************************************************
* 标 题 : 使用VC6.0实现窗口的任意分割 *
* 用 途 : *
* 整 理 人: ffww *
* 整理日期: 2006-12-11 9:18:42 *
* 附 注: ★★★ *
*************************************************/
一、关于CSplitterWnd类
1、用来创建动态切分窗口
BOOL Create(CWnd* pParentWnd,int nMaxRows,int nMaxCols,SIZE sizeMin,CCreateContext* pContext,DWORD dwStyle,UINT nID);
2、用来创建静态切分窗口
BOOL CreateStatic(CWnd* pParentWnd,int nRows,int nCols,DWORD dwStyle,UINT nID)
3、为静态切分的窗口的网格填充视图
BOOL CreateView (int row,int col,CruntimeClass* pViewClass,SIZE sizeinit,CcreateContext* pContext);
4、参数说明
pParentWnd 切分窗口的父框架窗口。
nMaxRows,nMaxCols是创建的最大的列数和行数。
sizeMin是窗格的现实大小。
pContext 大多数情况下传给父窗口。
nID是字窗口的ID号.
二、创建嵌套分割窗口
1、动态分割窗口
动态分割窗口使用Create方法,例:m_wndSplitter.Create(this,2,2,CSize(100,100),pContext); 但是一般不使用动态分割,不实用
2、静态分割窗口(适用于SDI、MDI程序)
1)创建单文档ww,生成的视类为CWwView,从CFormView继承,在增加3个视类或者从视类继承而来的派生类CView2、CView3
2)在框架类CMainFrame的.cpp文件中加入头文件,并在CWwView类定义前加上class CWwDoc;
#include "view2.h"
#include "view3.h"
#include "wwView.h" //注意这里,必须在CWwView类定义前加上class CWwDoc;否则编译3条错误
3)在框架类CMainFrame中增加成员:
CSplitterWnd m_wndSplitter1;
CSplitterWnd m_wndSplitter2;
4)利用ClassWizard重载CMainFrame::OnCreateClient()函数
//----------------------------------------------------------------------------------------------
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
//创建一个1行2列
m_wndSplitter1.CreateStatic(this,1,2);
//将CWwView连接到0行0列窗格上
m_wndSplitter1.CreateView(0,0,RUNTIME_CLASS(CWwView),CSize(100,100),pContext);
//将窗口右边再分开2行1列
m_wndSplitter2.CreateStatic(&m_wndSplitter1,2,1,WS_CHILD|WS_VISIBLE, m_wndSplitter1.IdFromRowCol(0, 1));
m_wndSplitter2.CreateView(0,0,RUNTIME_CLASS(CView2),CSize(100,100),pContext);
m_wndSplitter2.CreateView(1,0,RUNTIME_CLASS(CView3),CSize(100,100),pContext);
return TRUE;
}
//----------------------------------------------------------------------------------------------
注意:
① 必须为每个静态切分窗格创建视图窗口,不能漏掉一个;
② 如果从一个CformView类继承的视类,此对话框要作如下设置
style=Child
Border=None
Visible=不选中
② 若在CWwView窗口上放入一TreeCtrl,为了在改变窗口时随窗口大小而改变(类似CB中的居中),可以在CWwView类的WM_SIZE中添加代码如下:
//------------------------------------------------------------
void CWwView::OnSize(UINT nType, int cx, int cy)
{
CFormView::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
if (GetSafeHwnd())
{
CRect rect;
GetClientRect(&rect);
if (m_TreeCtrl.GetSafeHwnd())
m_TreeCtrl.MoveWindow(&rect);
}
}
//------------------------------------------------------------
//在WM_ONINITALUPDATE消息中,添加初始化数据
void CWwView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit();
//上面的代码不用管,是啥就是啥,
m_TreeCtrl.InsertItem("ListCtrl View", 1, 1);
m_TreeCtrl.InsertItem("EditCtrl View", 2, 2);
}
三、实现各个分割区域的通信
点击Button1按钮,在CView2中显示文字
1、在CWwView的.cpp文件中加入:
#include "view2.h"
#include "MainFrm.h"
2、添加按钮代码:
//----------------------------------------------------------------------------------------------
void CWwView::OnButton1()
{
//得到一SplitterView的指针
CView2 *pView=(CView2*)(((CMainFrame*)AfxGetMainWnd())->m_wndSplitter2.GetPane(0,0));
//定义View的DC
CClientDC dc(pView);
dc.MoveTo(10,10);
dc.LineTo(10,100);
dc.TextOut(10,10,"m_wndSplitter2的0行0列就是CView2");
}
//----------------------------------------------------------------------------------------------
* 标 题 : 使用VC6.0实现窗口的任意分割 *
* 用 途 : *
* 整 理 人: ffww *
* 整理日期: 2006-12-11 9:18:42 *
* 附 注: ★★★ *
*************************************************/
一、关于CSplitterWnd类
1、用来创建动态切分窗口
BOOL Create(CWnd* pParentWnd,int nMaxRows,int nMaxCols,SIZE sizeMin,CCreateContext* pContext,DWORD dwStyle,UINT nID);
2、用来创建静态切分窗口
BOOL CreateStatic(CWnd* pParentWnd,int nRows,int nCols,DWORD dwStyle,UINT nID)
3、为静态切分的窗口的网格填充视图
BOOL CreateView (int row,int col,CruntimeClass* pViewClass,SIZE sizeinit,CcreateContext* pContext);
4、参数说明
pParentWnd 切分窗口的父框架窗口。
nMaxRows,nMaxCols是创建的最大的列数和行数。
sizeMin是窗格的现实大小。
pContext 大多数情况下传给父窗口。
nID是字窗口的ID号.
二、创建嵌套分割窗口
1、动态分割窗口
动态分割窗口使用Create方法,例:m_wndSplitter.Create(this,2,2,CSize(100,100),pContext); 但是一般不使用动态分割,不实用
2、静态分割窗口(适用于SDI、MDI程序)
1)创建单文档ww,生成的视类为CWwView,从CFormView继承,在增加3个视类或者从视类继承而来的派生类CView2、CView3
2)在框架类CMainFrame的.cpp文件中加入头文件,并在CWwView类定义前加上class CWwDoc;
#include "view2.h"
#include "view3.h"
#include "wwView.h" //注意这里,必须在CWwView类定义前加上class CWwDoc;否则编译3条错误
3)在框架类CMainFrame中增加成员:
CSplitterWnd m_wndSplitter1;
CSplitterWnd m_wndSplitter2;
4)利用ClassWizard重载CMainFrame::OnCreateClient()函数
//----------------------------------------------------------------------------------------------
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
//创建一个1行2列
m_wndSplitter1.CreateStatic(this,1,2);
//将CWwView连接到0行0列窗格上
m_wndSplitter1.CreateView(0,0,RUNTIME_CLASS(CWwView),CSize(100,100),pContext);
//将窗口右边再分开2行1列
m_wndSplitter2.CreateStatic(&m_wndSplitter1,2,1,WS_CHILD|WS_VISIBLE, m_wndSplitter1.IdFromRowCol(0, 1));
m_wndSplitter2.CreateView(0,0,RUNTIME_CLASS(CView2),CSize(100,100),pContext);
m_wndSplitter2.CreateView(1,0,RUNTIME_CLASS(CView3),CSize(100,100),pContext);
return TRUE;
}
//----------------------------------------------------------------------------------------------
注意:
① 必须为每个静态切分窗格创建视图窗口,不能漏掉一个;
② 如果从一个CformView类继承的视类,此对话框要作如下设置
style=Child
Border=None
Visible=不选中
② 若在CWwView窗口上放入一TreeCtrl,为了在改变窗口时随窗口大小而改变(类似CB中的居中),可以在CWwView类的WM_SIZE中添加代码如下:
//------------------------------------------------------------
void CWwView::OnSize(UINT nType, int cx, int cy)
{
CFormView::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
if (GetSafeHwnd())
{
CRect rect;
GetClientRect(&rect);
if (m_TreeCtrl.GetSafeHwnd())
m_TreeCtrl.MoveWindow(&rect);
}
}
//------------------------------------------------------------
//在WM_ONINITALUPDATE消息中,添加初始化数据
void CWwView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit();
//上面的代码不用管,是啥就是啥,
m_TreeCtrl.InsertItem("ListCtrl View", 1, 1);
m_TreeCtrl.InsertItem("EditCtrl View", 2, 2);
}
三、实现各个分割区域的通信
点击Button1按钮,在CView2中显示文字
1、在CWwView的.cpp文件中加入:
#include "view2.h"
#include "MainFrm.h"
2、添加按钮代码:
//----------------------------------------------------------------------------------------------
void CWwView::OnButton1()
{
//得到一SplitterView的指针
CView2 *pView=(CView2*)(((CMainFrame*)AfxGetMainWnd())->m_wndSplitter2.GetPane(0,0));
//定义View的DC
CClientDC dc(pView);
dc.MoveTo(10,10);
dc.LineTo(10,100);
dc.TextOut(10,10,"m_wndSplitter2的0行0列就是CView2");
}
//----------------------------------------------------------------------------------------------