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

MFC 分割窗体(Splitter Windows)相关推荐

  1. Qt分割条splitter,画出来比写代码方便

    发帖自己记录. vs思维 第一次在qt中使用界面设计时,久久不能忘怀vs c#的风格.因为用过pb7,pb8,vc++,vb6.0,到vs2005眼前一亮,无论是界面设计还是代码格式自动处理,我认为v ...

  2. VS2010/MFC对话框程序调用Windows Media Player播放器控件

    MFC对话框程序调用Windows Media Player播放器控件播放打开的avi格式的文件,具体步骤如下: 1.根据MFC向导提示,创建一个默认的对话框项目TestMediaPlayer. 2. ...

  3. mfc 子窗体任何消息都不触发_winform让窗体一直显示在桌面上以及FindWindow

    想写个程序在电脑桌面上一直显示,类似一个小贴士,提示自己要做的事情等.遇到了技术难题就是怎样把窗体固定在桌面上,经过长时间的搜索和尝试,终于达到了想要的效果,其中涉及到windowsAPI的使用. 先 ...

  4. mfc 子窗体 按钮不触发_资深程序员用c++开发MFC银行排队叫号系统,小白看了也能学会...

    这个C++ 银行排队叫号系统是看了书后写出来的程序,运用于MFC理念编写,我看的书是谭浩强的<C++面向对象程序设计>相对计科的书少了前六章 直接从对象讲起,这本书也是本班使用人数最多的一 ...

  5. AIR中文帮助 第十章. 窗体(Windows)和菜单

    屏幕 根据AIR screen API可以获得系统桌面显示屏幕的信息. 屏幕简介 screen API包含一个简单类,Screen,获得系统屏幕信息和屏幕的详细描述. 计算机系统可能有多个监视器或显示 ...

  6. Qt无边框窗体(Windows)

    Qt无边框窗体Windows篇 去掉标题栏和边框 实现拖拽功能 还原窗体功能 注意点 我们可以做的更好 添加阴影 亚克力面板效果 结语 去掉标题栏和边框 首先第一步我们要通过设置系统绘制的边框消失 s ...

  7. VC/MFC分割字符串(SplitString)返回CStringArray

    引自:http://bbs.csdn.net/topics/60321228 原版: CStringArray* SplitString(CString string, char pattern) { ...

  8. MFC遍历窗体所有的控件

    HWND pWnd = FindWindow(NULL,"另存为");              //获得窗口的句柄 void saveopen(HWND pWnd) {  HWN ...

  9. Visual C++ MFC——基于Shell的Windows GUI小程序DEMO(打开计算器|打开记事本|IP查询|Windows激活状态查询)

    基本概念 Shell: Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言. Shell 是指一种应用程序,这个应用程序提供 ...

最新文章

  1. 安全感与职业发展的几点思考
  2. springboot(2.2.4)全局异常处理(RestControllerAdvice,ExceptionHandler)
  3. 自定义View的三个构造函数
  4. 大型Java项目架构演进(小白)
  5. Linux中Docker部署Redis
  6. windows C++删除非空文件夹
  7. SQL中的Having与Where的区别(面试常问)
  8. Unity编辑器扩展-基本界面编写
  9. 1999年中国十大优秀共享软件
  10. oracle的windows用户名,oracle数据库建立后,用户名跟密码设置windows平台
  11. php 生成条码插件,PHP版条码生成器
  12. java文件头部 追加_java文件追加写入头部
  13. ktt算法 约化_矩阵特征与特征向量的计算
  14. 【练习】获取新浪搜索中的热搜榜的标题
  15. 人要像鹰一样重生、蜕变、成长
  16. vue 悬浮图标_vue实现移动端悬浮窗效果
  17. OpenGL中的平移旋转缩放
  18. 微信小程序页面上下滚动、左右滑动(二)
  19. SVG——入门,路径变形动画
  20. java se版本_补装老版本的Java SE

热门文章

  1. 晶振串联电阻与并联电阻的作用
  2. Kubernetes 固定 Pod IP 地址方法
  3. Docker制作base镜像
  4. 软件测试面试题:在一个页面上,点击一个链接之后不会在当前页面上打开此链接而是新开一个窗口打开此页面。
  5. Python网络编程及WebServer
  6. single-row subquery returns more than one row
  7. ps知识点1-快捷键、文件新建与存储、移动工具、矩形选框、套索工具、快速选择、魔棒
  8. linux操作系统的7种运行级别的详细说明
  9. 计算机打印机端口配置,如何设置打印机端口,打印机端口设置的方法步骤
  10. 78. 子集(区分一下子集、子序列、子数组的概念)