• MFC 分割窗体(Splitter Windows)


    MFC 分割窗体(Splitter Windows)
    <reference MSDN  Microsoft Foundation Class Library and Templates TNO 029> 
    文档描述MFC中的CSplitterWnd类,该类用来支持窗体的分割和管理分割后每一个子窗格(pane)的大小

     

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

     

    1.1 静态分割(static splitter)
    分割的窗格(pane)在分割窗体(splitter window;)创建时创建,而且顺序,数量不会变化,分割控制条(Splitter Bar)用来控制每个窗格的大小.通常不同的窗格是不同的视图类(view class);
    例如 Visual C++graphics 和 Windows文件管理器就是这个风格的分割窗体;
    该风格分割窗体不会用到分割格(splitter box)

     

    1.2 动态分割(dynamic splitter)
    当用户控制视图的分割或停止分割, 附加窗格会被创建或销毁;  这种动态分割开始于一个单独的视图,分割格(splitter box)用于初始化分割;当一个视图可以在2个方向上被分割时,会有3个新的视图被创建并显示为3个新的窗格;当分割(split)被激活(active)时,分割格(splitter box)会如同分割控制条(splitter bar)一样在各个窗格间被绘制;当用户除去分割时,附加窗格会被销毁,只有原来的视图(分割时位于0行0列位置的窗格)会被保留直到分割窗体本身被销毁;
    例如 Microsoft Excel 和 Microsoft Word都是这种风格的分割窗体;

    当创建任意一种风格的分割窗体时,必须给定分割窗体的最大的行列数;
    静态风格的分割窗体,每个窗格必须被创建CSplitterWnd::CreateView;
    动态风格的分割窗体  第一个窗格会在CSplitterWnd对象创建被自动创建

    静态风格的分割窗体的最大行列数为 16 x 16
    动态风格的分割窗体的最大行列数为 2  x 2
    推荐的分割方式为:
    1  X  2          2  X  1         2  X  2

    2 分割窗体的例子(Splitter Samples)
    很多MFC的列子程序都直接或间接的用到了分割窗体 MFC入门程序Scripple程序的第4 部中就用到动态切分窗体

    MFC标准示例中ViewEx展示静态使用切分窗体的方法,包括如何在一个切分窗体中包含另一个切分窗体
     

    3 分割窗体中使用的术语(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支持共享滚动条,滚动条是CSplitterWnd的子窗体并且在分割窗体中为不同的窗格所共享;

    如在创建1X 2 CSplitterWnd时声明了WS_VSCROLL分割 那么2个窗格共享的竖直滚动条会创建如:
    [      ][      ][^]
    [pane00][pane01][|]
    [      ][      ][v]
    当移动滚动条时,WM_VSCROLL消息会发送到2个窗格中同样,同列的窗格可以共享水平滚动条

    注意
    在分割窗体中共享滚动条是非常有用的,如果是2种不同的视图使用共享滚动条 那么就必须要协调滚动位置和视图的显示;所有视图的派生类可以通过CWnd中的操作ScrollBar的方法来控制共享滚动条,但是一些非视图派生类,没有使用ScrollBar控件的类 或 通过标准Window的实现方法的类如CEditView将不适合于共享滚动条 

    5 最小大小(Minimum size)
    在分割窗体中每一行都有最小高度限制,每一列都有最小宽度限制,这2个最小值用于控制窗格显示数据最小大小;
    静态分割窗体的最小大小为 0,0; 动态分割窗体的最小大小可以在CSplitterWnd::创建时设定;
    这些值可以同过SetColumnInfo 和 SetRowInfo来改变; 

    6 未公布的接口函数(protected interface)
    以下将讨论一些未公布的CSplitterWnd的技术细节以便高级用户来定制CSplitterWnd;
    这些API没有官方文档公布同时在将来版本的MFC中极可能会被改变:

    6.1 分割控制条(splitter bar)分割格(box) 和 分割位置跟踪(tracker)的绘制

    enum ESplitType     { splitBox, splitBar, splitIntersection, splitBorder };virtual void OnDrawSplitter(CDC* pDC, ESplitType nType, const CRect& rect);virtual void OnInvertTracker(const CRect& rect);这些虚函数可以用来实现不同图形表现的分割窗体

    6.2 创建视图和控件 
    virtual BOOL CreateScrollBarCtrl(DWORD dwStyle, UINT nID);默认行为时创建滚动条,但是可以重载用于在滚动条边创建新控件

     

    6.3 动态切分窗体
    virtual void DeleteView(int row, int col);virtual BOOL SplitRow(int cyBefore);virtual BOOL SplitColumn(int cxBefore);virtual void DeleteRow(int row);virtual void DeleteColumn(int row);用于实现动态分割窗体的逻辑(当分割窗体拥有风格SPLS_DYNAMIC_SPLIT时)

  • 相关阅读:
    visualSVNYou don't have permission to access on this server
    怎样截取Http请求
    ASP.NET @page 指令详解
    我的XMLHelperC# XML操作基类(修改,删除,新增,创建)
    最新Visual Studio 2010 下载及学习资料
    redis主从哨兵和集群的区别
    uniapp nvue 支持iconfont
    Error (Error Code: 1175) during executing update command on table using MySQL
    org.apache.jasper.JasperException: Unable to compile class for JSP
    java.sql.SQLException: Access denied for user 'root'@'10.10.10.10' (using password: YES)
  • 原文地址:https://www.cnblogs.com/lidabo/p/3048005.html
Copyright © 2020-2023  润新知