函数ClientToScreen用于将客户区坐标转化为屏幕坐标。
ClientToScreen(myRect);//转换为屏幕坐标 把对话框的大小变成客户区的大小
MoveWindow(myRect.left, myRect.top, myRect.Width(), myRect.Height());
当我们转化后,并movewindow到转换后的坐标系后,发现 左右底 每次减少了3个像素,说明应用程序的 左右底 的边框(非客户区)大小均为3个像素。如下图,
而 “上”每次减少了29个像素,说明标题栏上面的宽度为29个像素。
图6
图7
有些函数必须要使用屏幕坐标系,所以必须用函数ClientToScreen进行转换。
函数ScreenToClient相反,是把屏幕坐标系转换为客户区坐标系。
////////////////////////////////////////////////////////////////////////////////////////////////////
图8
图9
如上2图:应用程序的客户区宽度为470,高度为353。非客户区左边,右边和下面的边框均为3,就是绿色部分。上面的边框(标题系统菜单区宽度)为29.
所以整个应用程序的宽度为470+3+3 = 476,高度为353+29+3 = 385.
应用程序的客户坐标系坐标为(0,0,470,353). (宽470,高353)
应用程序的屏幕坐标系坐标为(274,175,750,560). 其中274代表应用程序左上角到屏幕左边的距离,175代表应用程序左上角到屏幕顶端的距离,750代表应用程序左下角到屏幕左边的距离,560代表应用程序左下角到屏幕顶端的距离。
750 = 应用程序左上角到屏幕左边的距离274+应用程序的宽度476;
560 = 应用程序左上角到屏幕顶端的距离175+应用程序的高度385;
如上图8所示。
执行ClientToScreen后,就是要得到客户区矩形的屏幕坐标系。
就是在应用程序屏幕坐标系的基础上,减去非客户区的宽度而已。
见图8,
左= 274+边框3=277,
上= 175+标题栏宽度29=204,
右= 750-边框3 = 747
底=560-边框3 = 557.
随意拖动程序的位置,发现均是+-边框的宽度而已。
CRect myRect;
GetWindowRect(&myRect); //274,175,750,560
ScreenToClient(myRect); //-3 ,-29,473,356
为什么是-3 ,-29,473,356呢,应该求的是整个应用程序矩形相对于客户区的坐标,
客户区的坐标是(0,0,470,353). (宽470,高353)
如图8,整个应用程序矩形的左上角相对客户区坐标就是(0-3,0-29)(减去边框的宽度),
因为向左向上为负,向下向右为正。而整个应用程序矩形的左下角相对客户区坐标就是(470+3,353+3),即加上边框宽度。见图8
无论怎样拖动窗体,客户区的坐标和.ScreenToClient后的坐标都是不变的,应该客户区的大小没有改变。而屏幕坐标是变化的。