Splitter1

1.csplitterwnd

  提供分离窗口的功能,是一个窗口包含多个方格。

  类成员

  CSplitterWnd类成员

  构造 CSplitterWnd 构造一个CSplitterWnd对象

  Create 创建一个动态的分隔器窗口并将它与一个CSplitterWnd对象连接

  CreateStatic 创建一个静态的分隔器窗口并将它与一个CSplitterWnd对象连接

  CreateView 在一个分隔器窗口中创建一个窗格

  操作符 GetRowCount 返回当前窗格行的计数值

  GetColumnCount 返回当前窗格列的计数值

  GetRowInfo 返回指定行的信息

  SetRowInfo 设置指定行的信息

  GetColumnInfo 返回指定列的信息

  SetColumnInfo 设置指定列的信息

  GetPane 返回位于指定行和列处的窗格

  IsChildPane 确定窗口是否是此分隔器窗口的当前子窗格

  IdFromRowCol 返回位于指定行和列处的窗格的子窗口ID

  RecalcLayout 在调整行或列尺寸后调用此函数来重新显示该分隔器窗口

  GetScrollStyle 返回共享滚动条的风格

  SetScrollStyle 为分隔器窗口的共享滚动条指定新的滚动条风格

  可重载 OnDrawSplitter 绘制一个分隔器窗口的图像

  OnInvertTracker 绘制一个分隔器窗口的图像,使它具有与框架窗口相同的大小和形状

  CreateScrollBarCtrl 创建一个共享的滚动条控件

  DeleteView 从分隔器窗口中删除一个视图

  SplitRow 表明一个框架窗口是否是水平分隔的

  SplitColumn 表明一个框架窗口是否是垂直分隔的

  DeleteRow 从分隔器窗口中删除一行

  DeleteColumn 从分隔器窗口中删除一列

  GetActivePane 根据焦点或框架中的活动视来确定活动窗格

  SetActivePane 在框架中设置一个活动窗格

  CanActivateNext 检查Next PanePrevious Pane命令当前是否有效

  ActivateNext 执行Next PanePrevious Pane命令

  DoKeyboardSplit 执行键盘分隔命令,通常是“Window Split”

  DoScroll 执行分隔窗口的同步滚动

  DoScrollBy 将分隔窗口滚动给定的像素数

  2.呀要用到的该类的成员

  BOOL CreateStatic( CWnd* pParentWnd, int nRows, int nCols, DWORD dwStyle =

  WS_CHILD | WS_VISIBLE, UINT nID = AFX_IDW_PANE_FIRST );

  函数有5个参数,意义如下:

  ● pParentWnd:切分窗口的父窗口指针

  ● nRows:水平方向分隔窗口的数目

  ● nCols:垂直方向分隔窗口的数目

  ● dwStyle:切分窗口的风格

  ● nID:子窗口的ID值,默认为系统定义的AFX_IDW_PANE_FIRST

  返回值:如果创建成功,返回非零值(TRUE),否则返回0(FALSE)

  m_wndSplitter1.CreateStatic(this, 2,1); // 切分为21

  6、 使用CreateView产生每个视图窗口

  virtual BOOL CreateView( int row, int col, CRuntimeClass* pViewClass, SIZE sizeInit, CCreateContext* pContext );

  函数有5个参数,意义如下:

  ● row:窗格的行标,从0开始

  ● col:窗格的列标,从0开始

  ● pViewClass:视图的执行期类CRuntimeClass指针,可以用宏RUNTIME_CLASS获得

  ● sizeInit:一个SIZE(或者CSize)类型的数据,指定窗格的初始大小

  ● pContext:一般是由父窗口传递过来,包含窗口的创建信息

  返回值:如果创建成功,返回非零值(TRUE),否则返回0(FALSE)

  实例(摘):

  以单文档SDI应用程序为例,在框架客户区实现三叉切分窗口,且每个窗格使用不同的视图 。

实现步骤:

  1、 利用VC++6.0 AppWizard创建一个单文档SDI应用程序,项目名为Test

  2、 使用New Class对话框添加新的视图类:

  CinfoView 基类为列表视图类ClistView

  CLineView 基类为表单视图类CFormView

  CMyEditView 基类为编辑视图类CEditView

  要点:在添加ClineView之前,需要先创建一个对话模板资源,IDIDD_FORMVIEW

  3、 在框架窗口类CMainFrame中声明一个CsplitterWnd类的成员变量m_wndSplitter1,用于第一次切分。

  4、 使用ClassWizard为框架窗口类添加OnCreateClient函数。

  注意:OnCreateClient函数的调用在OnCreate函数之后,在构造视图对象和产生视图窗口之前。

  5、 在OnCreateClient函数中调用CsplitterWnd::CreateStatic,产生静态切分。该函数的原形如下:

  BOOL CreateStatic( CWnd* pParentWnd, int nRows, int nCols, DWORD dwStyle =

  WS_CHILD | WS_VISIBLE, UINT nID = AFX_IDW_PANE_FIRST );

  函数有5个参数,意义如下:

  ● pParentWnd:切分窗口的父窗口指针

  ● nRows:水平方向分隔窗口的数目

  ● nCols:垂直方向分隔窗口的数目

  ● dwStyle:切分窗口的风格

  ● nID:子窗口的ID值,默认为系统定义的AFX_IDW_PANE_FIRST

  返回值:如果创建成功,返回非零值(TRUE),否则返回0(FALSE)

  m_wndSplitter1.CreateStatic(this, 2,1); // 切分为21

  6、 使用CreateView产生每个视图窗口

  virtual BOOL CreateView( int row, int col, CRuntimeClass* pViewClass, SIZE sizeInit, CCreateContext* pContext );

  函数有5个参数,意义如下:

  ● row:窗格的行标,从0开始

  ● col:窗格的列标,从0开始

  ● pViewClass:视图的执行期类CRuntimeClass指针,可以用宏RUNTIME_CLASS获得

  ● sizeInit:一个SIZE(或者CSize)类型的数据,指定窗格的初始大小

  ● pContext:一般是由父窗口传递过来,包含窗口的创建信息

  返回值:如果创建成功,返回非零值(TRUE),否则返回0(FALSE)

  OnCreateClient函数的全部代码:

  BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)

  {

  // TODO: Add your specialized code here and/or call the base class

  CRect rect;

  GetClientRect(&rect);

  //产生第一次静态切分

  m_wndSplitter1.CreateStatic(this, //父窗口指针

  2, // 切分的行数

  1); // 切分的列数

  //为第一个窗格产生视图

  m_wndSplitter1.CreateView(0,0, // 窗格的行、列序数

  RUNTIME_CLASS(CTestView),//视图类

  CSize(rect.Width(),rect.Height()-rect.Height()/5),//初始化大小

  pContext);//父窗口的创建参数

  //为第二个窗格产生视图

  m_wndSplitter1.CreateView(1,0,

  RUNTIME_CLASS(CMyEditView),

  CSize(rect.Width(),rect.Height()/5),

  pContext);

  return TRUE;//不再调用基类的OnCreateClient函数

  //return CFrameWnd::OnCreateClient(lpcs, pContext);

  }

  在这里需注意3:

  必须为每个静态切分窗格创建视图窗口,不能漏掉一个;

  必须包含相应的类的头文件,在MainFrm.cpp文件的开始包含一下头文件:

  #include "TestView.h"

  #include "MyEditView.h"

  产生静态切分后,就不能调用默认的基类的OnCreateClient函数。

  7、 在视图窗口类CTestView中声明一个CsplitterWnd类的成员变量m_wndSplitter2,用于第二次切分。

  8、 使用ClassWizard为视图窗口类CTestView添加OnCreate函数,在该函数中调用CreateStatic函数和CreateView函数,类似CMainFrame::OnCreateClient函数中的调用

代码如下:

  int CTestView::OnCreate(LPCREATESTRUCT lpCreateStruct)

  {

  if (CView::OnCreate(lpCreateStruct) == -1)

  return -1;

  // TODO: Add your specialized creation code here

  CRect rect;

  GetClientRect(&rect);

  //获得窗口的创建信息指针

  CCreateContext *pContext = (CCreateContext*) lpCreateStruct->lpCreateParams;

  //产生二次静态切分

  m_wndSplitter2.CreateStatic(this,1, 2);

  //为第一个窗格产生视图

  m_wndSplitter2.CreateView(0,0,// 窗格的行、列序数

  RUNTIME_CLASS(CLineView),//视图类

  CSize(rect.Width()/4,rect.Height()),//初始化大小

  pContext);//父窗口的创建参数

  //为第二个窗格产生视图

  m_wndSplitter2.CreateView(0,1,

  RUNTIME_CLASS(CInfoView),

  CSize(1,1),

  pContext);

  return 0;

  }

  注意:二次切分的父窗口是第一次切分的第一个窗格,其视图类是CTestView

  9、使用ClassWizard为视图窗口类CTestView添加OnSize函数,在该函数中调用子函数

  SwitchView(),子函数的代码如下:

  void CTestView::SwitchView()

  {

  CRect rect;

  GetClientRect(&rect);

  int cx = rect.Width();

  int cy = rect.Height();

  m_wndSplitter2.MoveWindow(-2,-2,cx,cy+3);

  m_wndSplitter2.SetColumnInfo(0, cx/4,0);

  m_wndSplitter2.SetColumnInfo(1, cx-cx/4, 0);

  m_wndSplitter2.RecalcLayout();

  该子函数主要用于设置二次切分后的各列信息,通过CSplitterWnd::SetColumnInfo函数实现,原型为:void SetColumnInfo( int col, int cxIdeal, int cxMin );

  由3 个参数,意义如下:

  ● col:切分窗口的列标识

  ● cxIdeal:列的实际宽度,单位为像素

  ● cxMin:列的最小宽度,单位为像素

 

 

下面的代码实现的是左面一列,右面一列两行:

加上类成员变量
CSplitterWnd   m_wndSplitter2;

OnCreateClient()里:

if   (!m_wndSplitter1.CreateView(0,   0,   RUNTIME_CLASS(COutbarView),   CSize(100,   300),   pContext)
...
if   (!m_wndSplitter2.Create(&m_wndSplitter1,   2,   1,   CSize(0,   0),   pContext,   WS_CHILD   |   WS_VISIBLE   |   WS_HSCROLL   |   WS_VSCROLL,   AFX_IDW_PANE_FIRST   +   1)  
...
if   (!m_wndSplitter2.CreateView(0,   0,   RUNTIME_CLASS(COutlookStyleUIView),   CSize(500,   100),   pContext)   ||   !m_wndSplitter2.CreateView(1,   0,   RUNTIME_CLASS(CMyHtmlView),   CSize(100,   100),   pContext))
...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值