CSplitterWnd 成员介绍及切分条的定制

1 分割窗体风格(Splitter Styles)
CSplitterWnd类支持2种不同风格的分割窗口

1.1 静态分割(static splitter)

1.2 动态分割(dynamic splitter)

CSplitterWnd 成员

基类的成员

CObject Members

CCmdTarget Members

CWnd Members

Create

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

CreateStatic

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

CreateView

调用它创建一个窗格到一个切分窗口。

CSplitterWnd

调用构造一个 CSplitterWnd 对象。

GetColumnCount

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

GetColumnInfo

返回指定列的信息。

GetPane

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

GetRowCount

返回当前窗格的行列举。

GetRowInfo

返回指定行的信息。

GetScrollStyle

返回被共享的滚动条的风格。

IdFromRowCol

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

IsTracking

定位,如果切分条目前是正在移动的话。

IsChildPane

调用确定这个窗口是否是目前切分窗口的一个子窗格。

RecalcLayout

在校准行和列尺寸之后重新显示切分窗口。

SetColumnInfo

调用设置指定列的信息。

SetRowInfo

调用设置指定行的信息。

SetScrollStyle

为切分窗口(分隔器窗口)的共享滚动条指定新的滚动条风格。

ActivateNext

执行Next Pane或Previous Pane命令。

CanActivateNext

检查看 Next Pane 或 Previous Pane 命令当前是否可用。

CreateScrollBarCtrl

创建共享滚动条控件(control)。

DeleteColumn

从切分窗口中删除一列。

DeleteRow

从切分窗口中删除一行。

DeleteView

从切分窗口中删除一个视图。

DoKeyboardSplit

执行键盘滚动命令,通常是"Window Split."

DoScroll

执行切分窗口同步滚动。

DoScrollBy

通过给定的像素数,滚动切分窗口。

GetActivePane

确定活动窗格,根据焦点或者框架中的视图。

OnDrawSplitter

描绘一个图像到一个切分窗口。

OnInvertTracker

描绘一个图像到一个切分窗口,与框架窗口一样的大小和外形。

SetActivePane

设定一个在框架里活动的窗格。

SplitColumn

表明一个框架窗口是否是垂直切分的。

SplitRow

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

 

 

 

 

分割窗体中使用的术语(Terminology Used By Implement)
CsplitterWnd(分割窗体):
负责提供窗格切分空间和滚动条(同行(row)共享竖直滚动条(Vertical ScrollBar),同列(column)共享水平滚动条(Horizontal ScrollBar) );同时行列的下标从0, 0开始,言即第一个窗格为第0行 第0列的窗格

Pane(窗格)
CSplitterWnd管理的应用程序显示数据的窗体,一般而言窗格是一个视图的派生类对象,实际上窗格可以是任意的从CWnd中派生的对象;

Splitter Bar(分割控制条)
在窗格行列间的控件,用于控制行列上窗格的大小

Spliiter Box(分割格)
动态分割窗体位于竖直滚动条最上的或水平滚动条最左位置的按键,用于创建新的分割窗格

Splitter Intersection(分割交叉点)
竖直或水平分割控制条的交叉点,可用于同步控制水平,竖直窗格的大小

4 共享滚动条(Shared Scroll Bars)

 

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

切分条的定制
由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中的其余的一些虚拟方法就可以生成具有自己个性的分割窗口了。

posted on 2011-01-06 20:23  cy163  阅读(875)  评论(1编辑  收藏  举报

导航