不只是有最大最小关闭按钮的那个矩形东西被称为窗口,
所有控件是窗口。窗口中的子窗口是窗口。
【窗口的组成】
外部边框。窗口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); //控件的父窗口是对话框
这个比较有用,可以计算某控件相对位于父窗口客户区坐标系中的坐标。