`
java-mans
  • 浏览: 11341272 次
文章分类
社区版块
存档分类
最新评论

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics