开发者社区> double2li> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

MFC 分割窗体(Splitter Windows)

简介: MFC 分割窗体(Splitter Windows) 文档描述MFC中的CSplitterWnd类,该类用来支持窗体的分割和管理分割后每一个子窗格(pane)的大小   1 分割窗体风格(Splitter Styles)CSplitterWnd类支持2种不同风格的分割窗口   1.
+关注继续查看

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时)

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
jdk(Windows/Mac含M1/M2 Arm原生JDK)安装,附各个版本JDK下载链接
jdk(Windows/Mac含M1/M2 Arm原生JDK)安装,附各个版本JDK下载链接
47 0
MFC模拟 Windows 文件可视化系统(上)
MFC模拟 Windows 文件可视化系统
39 0
Swift 4.0 新特征汇总及演示附 Demo(上)
Swift 4.0 新特征汇总及演示附 Demo(上)
26 0
Flutter 在各平台的安装与配置(Windows,macos,linux)【Flutter 专题 0】
Flutter 的特点 Flutter 提供了简单而简单的方法来开始构建漂亮的移动和桌面应用程序,其中包含一组丰富的材料设计和小部件。在这里,我们将讨论其用于开发移动框架的主要功能。
72 0
+关注
double2li
一个在IT行业摸爬滚打的老司机
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载