zoukankan      html  css  js  c++  java
  • 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中的其余的一些虚拟方法就可以生成具有自己个性的分割窗口了。

  • 相关阅读:
    Linux实战(2):Linux传输文件
    Linux实战(1):装机一键设置脚本初级版
    Docker实战(4):Docker错误记一笔
    Docker实战(3):Tomcat部署
    Docker实战(5)升级Docker版本后的报错
    Promise
    创建数据库
    wepy中组件之间通信方法
    javascript —— 禁止通过 Enter 键提交表单
    input禁止复制、粘贴、剪切
  • 原文地址:https://www.cnblogs.com/cy163/p/1929117.html
Copyright © 2011-2022 走看看