WINDOWS窗口坐标

不只是有最大最小关闭按钮的那个矩形东西被称为窗口,

所有控件是窗口。窗口中的子窗口是窗口。



【窗口的组成】

外部边框。窗口Border属性为 Thin, Resizing时,有3个像素宽的边框。

系统区:窗口上部蓝色部分,有最大最小关闭按钮的那一个部分。

客户区:除去外部边框和系统区的部分。系统区有统一的机制处理,客户区

     是由客户程序员定义外观和行为的部分。



【坐标系】

屏幕坐标系:定义屏幕左上角为(0,0)原点

窗口安放在二维平面上,一般为电脑显示器所在的视觉平面上。

坐标单位为“像素”。假设显示器分辨率为(800*600),那么

屏幕右下角坐标为(800,600)。



客户区坐标系:以窗口客户区的左上角为(0,0)原点。向右为X轴正方向。

向下为Y轴正方向。



【常用函数】

GetWindowRect

取得窗口(包括边框和系统区)位于屏幕坐标系中的位置信息。

如果“窗口”是按钮等控件,就是控件的整体(包括边框)位于屏幕坐标系中位置。



GetClientRect

获得窗口位于客户坐标系中的位置信息。



CRect rc;

对话框->GetClientRect(&rc); //获得对话框客户区尺寸信息。

返回的rc永远是(0,0,width,height),其中width是客户区宽度(单位像素)

height是客户区高度。



CRect rc;

控件->GetClientRect(&rc); //获得控件客户区尺寸信息。

返回的rc永远是(0,0,width,height),其中width是控件宽度(单位像素)

height是控件的高度。



ClientToScreen

将客户区坐标系翻译成屏幕坐标系。



描述惯例 CRect=(左,顶,右,底)



例子1:

CRect rect;

控件->GetClientRect(&rect); //rect = (0,0,20,10)

CRect rect2 = rect;

控件->ClientToScreen(&rect2); //rect2 = (a,b,a+20,b+10)

其中a,b为控件某点(左上角的那个点)在屏幕坐标系的坐标。



例子2:

CRect rect;

对话框->GetClientRect(&rect); //rect = (0,0,20,10)

CRect rect2 = rect;

对话框->ClientToScreen(&rect2); //rect2 = (a,b,a+20,b+10)

其中a,b为对话框某点(左上角的那个点)在屏幕坐标系的坐标。



ScreenToClient

将屏幕坐标系翻译成客户区坐标系。



例子3:

CRect rect;

控件->GetWindowRect(&rect);  //rect = (l,t,r,b)

CRect rect2 = rect;

控件->ScreenToClient(&rect2); //rect2 = (0,0,r-l,b-t)



例子4:

CRect rect;

对话框->GetWindowRect(&rect); //rect = (l,t,r,b)

CRect rect2 = rect;

对话框->ScreenToClient(&rect2); //rect2 =
(-e,-(e+h),(r-l)-e,(b-t)-(e+h))

其中:e代表窗口的边框宽度,一般是3个像素。

    h代表系统区的title-bar的高度,一般是26个像素。

    负数是从何而来呢?GetWindowRect是取整个窗口全体(包括系统区和边框)

    因此变换到客户区坐标系时,对话框左边位于客户区坐标系原点右侧(负方向)

    因此左边的坐标就是-3。



(矩形的几何面积没有变化,变化的是位置值。坐标变换属于刚体运动变换)



例子5:

CRect rect;

控件->GetWindowRect(&rect);

CRect rect2 = rect;

对话框->ScreenToClient(&rect2); //控件的父窗口是对话框



这个比较有用,可以计算某控件相对位于父窗口客户区坐标系中的坐标。

WINDOWS窗口坐标

上一篇:浅析Java并发编程:如何做到线程安全-Collections.synchronizedList和CopyOnWriteArrayList的选择


下一篇:7款js文件上传插件