sdk 编码过程,经常遇到一个问题,画图
而且要让界面更漂亮,就要更注重,画图
在win32 sdk 画图过程中一个比不可少的尺度标准, 矩形 RECT 结构
今天把一些,以往的编码经验拿出来分享,希望感兴趣的朋友一起讨论下
1. 矩形结构
win32 sdk 中的矩形结构:
vb: type Rect
Left as long 左边界
Top as long 上边界
Right as long 右边界
Bottom as long 下边界
end type
2. 矩形应用范围及其特点
矩形有如下常用方法,下面给这些矩形,应用个更形象一点的名字,用于区分不同用途
(1) WindowRect as Rect
(2) CLIENTRECT as Rect
(3) CHILDRECT as Rect
分别来解释下,以上名字的含义
WindowRect ,这里一般指窗口矩形,此矩形的特点是,内部坐标通常以屏幕的 0,0 点为原点向
第 4 象限拓展的逻辑尺寸,这种矩形的内部元素值,都是相对于原点的偏移量
常用于: GetWindowRect ,通过此函数调用,由系统对矩形结构填充,此类
矩形通常用于限制鼠标活动范围;或通过一系列调用获取 ChildRect (祥见下文);
还有就是有些绘图函数使用此类型矩形实现的子坐标系统的位置标记,如 FrameRect 》
画矩形边框;DrawRect
ClientRect, 我们会经常用 GetClientRect 函数来获取一个窗口的客户区尺寸;而且你会发现,
该函数似乎永远只填充 Right,Bottom 两项,Left和Top似乎永远是 0。 这个
矩形其实所表示是某个窗口的客户端尺寸,通常与之配合的系统同样提供了,
GetWindowDC 和 GetDC,有些手还比较新的朋友可能还没注意到,这两个
获取设备绘图上下文句柄的函数,所实现的内容其实是不同的,当窗口没有标题
栏或者边框区域时(也就是非客户区)那么对种窗口的HDC的获取,就是针对这
个窗口的所有可视区域否则的情况下,GetDC 是专门用于获取客户区绘图句柄,
GetWindowDC用于获取包括边框在内的窗口区域绘图矩形,例如,通过
GetWindowDC在有标题栏窗口的 0,0 ~ Width,5这个区域内绘图,会发现,
图像直接绘制到了标题栏上。
此外,对于一些GDI 绘图函数来说,他还有另外的应用途径 - 逻辑矩形
如 FillRect 函数,使用此类型矩形实现矩形区域的颜色刷子填充,此时,
他的Left,Top分别代表子坐标系统(某个窗口矩形区域的0,0点为原点的坐标
系统,相对于该窗口的坐标而非屏幕)的绝对坐标,而Right,Bottom元素含义是尺寸。
ChildRect, 一个要重点说说的矩形类型。
该类矩形所代表的含义是,子窗口矩形。
比如:CreateWindow(非重点参数略。。。,x,y,cx,cy,.... )
x, y, cx, cy 分别为,窗口距父窗口左边界距离,绝对坐标值;Y :距上边界绝对坐标值
cx: 宽度 cy 高度
该类型矩形,通常用来记录子窗口或称控件的坐标位置以及长度,高度的值,
似乎和 ClientRect 的某些应用很象。确实是的,不过本文的目的在于正确
认识这些矩形,且在编码时能够通过简单的描述标识出对矩形变量的使用范围
的标记,以至于不会因大量SDK操作时,因各种类型穿插使用而导致思维混
乱的现象频出。
通常,对于该类型矩形的获取,都使用 GetWindowRect 获取父窗口矩形,
在用此方法获取子窗口矩形然后计算出,子窗口的 ChildRect,用于设置窗
口位置,如 MoveWindow 的 4 个窗口位置参数还有就是 GetWindowRect
和 ScreenToCleint / ClientToScreen 的倒换计算。目的基本相同。此法应用
甚广。。。。一些高手通常也没有注意到或者说蔬于认识了,但其实,
Windows 为我们专门提供了专用于获取此类矩形的函数: GetWindowPlacement
通过此函数可以获取窗口的4个边界的绝对坐标值,只需要稍加计算即可以
得到控件的句柄位置、尺寸
3. 一些可能出现的情况
在进行子类化窗口,进行完全自绘控件时,可能需要画矩形边框,填充矩形,画文字等,
你会发现很晕啊。。。
怎么那些绘图效果不在自己预想的位置画出来呢? 这就是本文所提及的问题,
混乱的矩形表示方法。 Win32 sdk 中只有一种矩形,就是 Rect,而他有时可能指绝对坐标,
有时仅仅是尺寸表示,还有时他们是混合的。但他们在一个绘图过程中通常都是一起出现的。
windows中很难找到这样一组函数,只用指定的坐标系统操作所有需要的函数。
做个中介函数? 不会很累吗?如果遇到效率狂人,肯定还会觉得压栈,调用过程所浪费的时间太多了。。
4. 简单的解决方案
我对这些问题的看法就如同本文中,对几个矩形的矩形变量名的表示方法一样,分清楚不同矩形类型的含义
在调用前,对这些矩形分别填充好,由函数根据不同的需要一次性完成调用。
当然,这只是我的个人应用方法,前面所说的中介函数其实也是一个不错的方法。
后记。。。
今年来,一直在写一个心目中的程序, Visual Asm ,是一个 IDE,他不仅仅是代码着色这些简单的应用, 他的最终目标是象 VB 一样可视化 Win32 SDK 开发,使得汇编编程不是一个口号,我喜欢汇编,那真的是一门艺术。