CsplitterWnd 百科

原创 2011年01月21日 22:59:00

英文释义  csplitterwnd 类——拆分窗口类,提供分离窗口的功能,是一个窗口包含多个方格。

  CSplitterWnd类提供一个分隔器窗口的功能,分隔器窗口是一个包含有多个窗格的窗口。窗格通常是应用程序特定的由CView派生的对象,但它也可以是具有适当子窗口ID的任何CWnd对象。

  一个CSplitterWnd对象通常被嵌入CFrameWnd或CMDIChildWnd父对象。

编辑本段创建CSplitterWnd对象的步骤:

  1. 在父框架中嵌入一个CSplitterWnd成员变量。

  2. 重载父框架的CFrameWnd::OnCreateClient成员函数。

  3. 从重载的OnCreateClient函数中调用类CSplitterWnd的Create或CreateStatic成员函数。

编辑本段运用原理

  调用Create成员函数可以创建一个动态的分隔器窗口。动态的分隔器窗口通常用于创建和滚动同一文档的多个窗格或视。框架将自动为该分隔器创建一个起始窗格;然后,当用户操纵该分隔器窗口的控件时,框架创建,调整大小,并且排列其它的窗格。

  当你调用Create时,应指定一个最小行高度和最小列宽度,这两个最小值被用来确定窗格什么时候太小以致于不能被完全显示。在调用了Create之后,你可以通过调用SetColumnInfo和SetRowInfo来调整这些最小值。

  你还可以使用SetColumnInfo和SetRowInfo成员函数来给一列设置一个“理想的”宽度,以及给一行设置一个“理想的”高度。当框架显示一个分隔器窗口时,首先显示父框架,然后才显示分隔器窗口。然后,框架从分隔器窗口的客户区左上角至右下角,根据窗格的理想尺寸以行或列来排放各个窗格。

  动态分隔器窗口中的所有窗格都必须是同一个类的窗格。读者熟悉的支持动态分隔器窗口的应用程序包括Microsoft Word和Microsoft Excel。

  使用CreateStatic成员函数可以创建一个静态分隔器窗口。用户只能修改静态分隔器窗口中的窗格的尺寸,但是不能改变其中的窗格序号和次序。

  在创建静态分隔器时必须专门创建该静态分隔器的所有窗格。你必须在父框架的OnCreateClient成员函数返回之前确保创建了所有窗格,否则,框架将不能正确显示该窗口。

  CreateStatic成员函数将使用为0的最小行高度和最小列宽度来自动初始化一个静态分隔器。在调用了Create之后,可以通过调用SetColumnInfo和SetRowInfo成员函数来调整这两个最小值。在调用CreateStatic之后,你也可以使用SetColumnInfo和SetRowInfo成员函数来指定你所希望的理想窗格值。

  静态分隔器中的窗格通常属于不同的类。给予静态分隔器窗口的示例,参见图形编辑器和Windows文件管理器。分隔器窗口支持特殊的滚动条(除窗格可能带有的滚动框之外)。这些滚动条是CSplitterWnd对象的子对象并且被窗格共享。

  当你创建这个分隔器窗口时,你创建了这些特殊的滚动条。例如,如果一个CSplitterWnd具有一行,两列,则WS_VSCROLL风格将显示两个窗格共享的垂直滚动条。当用户移动这个滚动条时,WM_VSCROLL消息将被发送给两个窗格。当窗格设置滚动条位置时,这个共享滚动条将被设置。

  有关动态分隔器窗口的更多信息,参见“Visual C++程序员指南”中的文章“多文档类型,视和框架窗口”中的“分隔器窗口”;和Visual C++联机文档中的“TN029:分隔器窗口”;以及CSplitterWnd类概述。有关如何创建动态分隔器窗口的更多信息,参见“Visual C++联机教程”中的“在增强视的Scribble中添加分隔器窗口”;和MFC常规示例VIEWEX。

  #include

  请参阅:CView, CWnd

编辑本段类成员

构造

  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 Pane或Previous Pane命令当前是否有效

  ActivateNext 执行Next Pane或Previous Pane命令

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

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

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

编辑本段运用实例

1锁定切分条

  当用户创建好分割窗口后,有时并不希望通过拖动切分条来调节窗口的大小。这时就必须锁定切分条。锁定切分条的最简单的方法莫过于不让CSplitterWnd来处理WM_LBUTTONDOWN,WM_MOUSEMOVE,WM_SETCURSOR消息,而是将这些消息交给CWnd窗口进行处理,从而屏蔽掉这些消息。拿WM_LBUTTONDOWN处理过程来说。修改为如下: void CXXSplitterWnd::OnLButtonDown(UINT nFlags,CPoint point){

  CWnd::OnLButtonDown(nFlags,point);

  }

  其余的处理方法类似。

2切分条的定制

  由Window自己生成的切分条总是固定的,没有任何的变化,我们在使用一些软件比如ACDSee的时候却能发现它们的切分条却是和自动生成的切分条不一样的。那么如何定制自己的切分条呢?通过重载CSplitterWnd的虚方法OnDrawSplitter和OnInvertTracker可以达到这样的目的。下面的代码生成的效果是分割窗口的边界颜色为红色,分割条的颜色为绿色.代码如下:void CSplitterWndEx::OnDrawSplitter(CDC *pDC, ESplitType nType, const CRect &rectArg){ if(pDC==NULL)

  { RedrawWindow(rectArg,NULL,RDW_INVALIDATE|RDW_NOCHILDREN);

  return;

  }

  ASSERT_VALID(pDC);

  CRect rc=rectArg;

  switch(nType)

  {

  case splitBorder:

  //重画分割窗口边界,使之为红色

  pDC->Draw3dRect(rc,RGB(255,0,0),RGB(255,0,0));

  rc.InflateRect(-CX_BORDER,-CY_BORDER);

  pDC->Draw3dRect(rc,RGB(255,0,0),RGB(255,0,0));

  return;

  case splitBox:

  pDC->Draw3dRect(rc,RGB(0,0,0),RGB(0,0,0));

  rc.InflateRect(-CX_BORDER,-CY_BORDER);

  pDC->Draw3dRect(rc,RGB(0,0,0),RGB(0,0,0));

  rc.InflateRect(-CX_BORDER,-CY_BORDER);

  pDC->FillSolidRect(rc,RGB(0,0,0));

  pDC->Draw3dRect(rc,RGB(0,0,0),RGB(0,0,0));

  return;

  case splitBar:

  //重画分割条,使之为绿色

  pDC->FillSolidRect(rc,RGB(255,255,255));

  rc.InflateRect(-5,-5);

  pDC->Draw3dRect(rc,RGB(255,0,0),RGB(255,0,0));

  return;

  default:

  ASSERT(FALSE);

  }

  pDC->FillSolidRect(rc,RGB(0,0,255));

  }

  void CSplitterWndEx::OnInvertTracker(CRect &rect)

  {

  ASSERT_VALID(this);

  ASSERT(!rect.IsRectEmpty());

  ASSERT((GetStyle()&WS_CLIPCHILDREN)==0);

  CRect rc=rect;

  rc.InflateRect(2,2);

  CDC* pDC=GetDC();

  CBrush* pBrush=CDC::GetHalftoneBrush();

  HBRUSH hOldBrush=NULL;

  if(pBrush!=NULL) hOldBrush=(HBRUSH)SelectObject(pDC->m_hDC,pBrush->m_hObject); pDC->PatBlt(rc.left,rc.top,rc.Width(),rc.Height(),BLACKNESS);

  if(hOldBrush!=NULL)

  SelectObject(pDC->m_hDC,hOldBrush);

  ReleaseDC(pDC);

  }

CSplitterWnd的使用 .

null文档classborder框架command 一、关于CSplitterWnd类 我们在使用CuteFtp或者NetAnt等工具的时候,一般都会被其复杂的界面所吸引,在这些界面中窗...
  • hugyxh
  • hugyxh
  • 2015年08月10日 15:29
  • 356

MFC-在基于对话框的应用程序中嵌入CSplitterWnd

在CodeGuru中搜索了一下,找到三篇文章,其中一篇好使。http://www.codeguru.com/cpp/w-d/splitter/tutorials/article.php/c4705/步...
  • usertony
  • usertony
  • 2013年10月25日 15:14
  • 994

使用CSplitterWnd和重绘窗口大小时发生的问题

     问题1:如上图所示.我的程序是单文档窗口,使用CSplitterWnd分割成两个窗口.图1所示的是在debug和release两种情况下运行时的右边的那个窗口.处理窗口尺寸变化是在OnSiz...
  • i7366
  • i7366
  • 2008年03月23日 18:30
  • 1093

【VS开发】CSplitterWnd的定制使用

一、基本的CSplitterWnd的使用 1. 在CMainFrame中添加一个CSplitterWnd成员:  CSplitterWnd m_splitterwnd1; 2. 基于CView...
  • LG1259156776
  • LG1259156776
  • 2016年04月28日 14:21
  • 307

CSplitterWnd

MFC支持两种类型的拆分窗口:静态的和动态的。 静态拆分窗口的行列数在拆分窗口被创建时就设置好了,用户不能更改。但是用户可以缩放各行各列。一个静态拆分窗口最多可以包含16行16列。 要找一...
  • zang141588761
  • zang141588761
  • 2015年10月19日 11:33
  • 1093

关于自定义分割窗口类(派生于CSplitterWnd)遇到的问题

 BEGIN_MESSAGE_MAP(CSplitterWinex, CSplitterWnd)//重要  ON_WM_MOUSEMOVE()  ON_WM_LBUTTONDOWN()  ...
  • u014023993
  • u014023993
  • 2014年04月13日 15:11
  • 497

关于CSplitterWnd拆分窗口的隐藏与显示问题

m_wndSplitter2上有四个行拆分窗口,我只想让其中一个(第二个)占满窗口,问题如下: 以下不能按理想显示:  m_wndSplitter2.SetRowInfo(0,0,0);  m_...
  • abcdef8c
  • abcdef8c
  • 2011年12月15日 22:42
  • 3463

关于mfc CSplitterWnd的几点理解

1.首先是CsplitterWnd的关键的几个参数 // implementation attributes which control layout of the splitter int ...
  • abcdef8c
  • abcdef8c
  • 2012年08月20日 15:41
  • 3058

CSplitterWnd窗口分割之——静态分割(一)

静态分割窗口在多文档和单文档里面非常简单,唯一要说的技术单文档窗口分割直接在MainFrm中,而多文档的窗口分割操作是要在ChildFrm中处理。          我今天想说的是在对话框窗口中如何使...
  • CSDNMicrosoftCSDN
  • CSDNMicrosoftCSDN
  • 2015年09月08日 17:47
  • 945

MFC使用CSplitterWnd分割窗口的创建

使用CSplitterWnd分割窗口 csplitterwnd       csplitterwnd 类 提供分离窗口的功能,是一个窗口包含多个...
  • angxiao
  • angxiao
  • 2012年04月11日 13:32
  • 2455
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CsplitterWnd 百科
举报原因:
原因补充:

(最多只允许输入30个字)