3、UCGUI视窗管理器原理
1、窗口外形是矩形,由它们的原点(左上角的 X 和 Y 坐标)及它们的 X 和 Y 尺寸(分别是宽和高)所定义。
µC/GUI 中一个窗口:
是一个矩形 · 有一个 Z 坐标 ·
可能是隐藏的或可见的 ,可能拥有有效/或无效区域 · 可以或者不可以有透明区域 · 可以或者不可以有一个回调函数
2、
活动窗口
当前正在使用进行绘图操作的窗口被当作活动窗口。
回调函数
回调函数在用户程序中定义,当一个指定的事件发生时,通知图形系统调用指定的函数。通常应用于一个窗口内容改变时自动重绘的场合。
子/ 父窗口,同胞
一个子窗口的定义是相对于另一个窗口,该窗口称为父窗口。无论什么时候,一个父窗口移动了,它的子窗口会相应随之移动。一个子窗口总是完全包含在它的父窗口里面,如果需要,它会被剪切。从属于同一个父窗口的多个子窗口相互间的关系称为“同胞” 。
3、
客户区
一个窗口的客户区简单地说是它的可使用区。如果一个窗口包括一个边框或标题栏,则客户区是内部的矩形区域。如果没有这样一个边框,则客户区等同于窗口本身。
剪切,剪切区域
剪切是一种限制窗口或它的部分输出的操作。 剪切区域是一个窗口的原有可见区域。由于被更高 Z 序列的同胞窗口遮挡,或者不在父窗口可见区域范围之内的缘故,这些部分就会被剪切掉。
桌面窗口
桌面窗口由视窗管理器自动创建,总是覆盖整个显示区域。它始终是一个最底层的窗口。如果没有定义其它窗口,它就是默认(活动)窗口。所有窗口都是桌面窗口的继承窗口。
4、
句柄
当一个新的窗口被创建,WM 会给它分配一个唯一的标识符,称为句柄。句柄将用于对特定窗口更进一步操作的执行。
隐藏/ 显示窗口
一个隐藏的窗口是不可见的,尽管它仍然存在(有句柄) 。当创建一个窗口时,如果没有创建指定的标识的话,默认状态是隐藏。使一个窗口可见则可以将其显示;使其不可见则可以隐藏它。
透明
带有透明部分的窗口包括有窗口静止时不被重绘的区域。这些区域的操作就仿佛是下面的窗口可以透过它们显示出来。在这种情况下,下面的窗口在这个透明窗口之前重绘就显得很重要了。WM 能自动处理正确的重绘顺序。
5、
有效/ 无效
一个有效的窗口是一个完全更新了的窗口,它不需要重绘。 一个无效的窗口不再对所有的更新有反应,因此需要完全或部分重绘。当改变影响一个特定的窗口时,WM 标记该窗口无效。下一次窗口重绘(手动或通过回调函数)后,它将有效。
Z- 序,底层/ 顶层
尽管一个窗口是在一个只有 X 和 Y 坐标构成的二维的屏幕上显示,WM 也管理被认为是 Z-序,或者深度的座标(一个虚拟的三维的坐标),决定窗口从背景到前景放置。因此窗口可以在另一窗口的上面或下面显示。
将一个窗口设置到底层将会把它放在所有同胞窗口(如果存在)的下面;设置为顶层将会把它放在所有同胞窗口的上面。创建一个窗口时,如果没有指定创建标识符,默认情况下它会被设置在顶层。
6、WM API 函数
7、视窗管理器的回调机制
回调机制后面的哲学
µC/GUI 为窗口和窗口对象(控件)提供的回调机制实质是一个事件驱动系统。正如在大多数视窗系统中一样,原则是控制流程不只是从用户程序到图形系统(用户程序调用图形系统函数来更新窗口) ,同时也从图形系统回到用户程序。意思是图形系统也可以调用用户程序提供的回调函数来达到更新窗口的目的。这种机制常常表现好莱坞法则的特点(“不要打电话给我们,我们会打电话给你们!”)——主要是视窗管理器为了启动窗口重绘的需要。与传统程序比较有差异,但它使对视窗管理器的无效逻辑开发成为可能。
不使用回调函数
你不一定非要用回调函数不可,但这样做,WM 在重绘窗口管理时会降低效率。也可以混合使用,例如,一些窗口使用回调而另一些却不使用。然而,如果一个窗口不使用回调机制,你的应用程序必须负责更新窗口内容。
警告:当没有使用回调机制时,屏幕更新的管理就成了你的责任。
8、使用回调函数
为了使用一个回调函数创建窗口,你必需要有一个回调函数。函数的名称将与创建窗口时对应的回调函数指针参数名称相一致(即 WM_CreateWindow() 中的 cb 参数) 。所有的回调函数必须具有以下函数原型:
函数原型: void callback(WM_MESSAGE* pMsg);
pMsg 消息的指针。
回调函数的执行行为依赖于它收到的消息类型。上面的函数原型通常带有一个开关声明,用于定义了对于不同的使用一个或更多的事件声明的消息所采用的不同的处理方式(典型的至少有对 WM_PAINT()的处理) 。
9、工程下载:
http://yunpan.cn/ccVUD4G4vc6zM 访问密码 c03c