MFC坐标转换

  MapDialogRect,转换对话框坐标为像素坐标
  功能:该函数把指定的对话框单位映射成屏幕单位(像素)。函数MapDialogRect用变换坐标替换指定的RECT结构中的坐标,这就使得该结构可以用来创建对话框或定位对话框内的控制。
  函数原型:BOOL MapDialogRect(HWND hDlg,LPRECT IpRect);
  参数:
  hDlg:标识对话框。MapDialogRect 函数只接收对话框创建函数中一个创建的对话框的句柄,对于其他窗口的句柄失效。
  IpRect:指向一个含有将被转变的对话框坐标的RECT结构。
  返回值:如果消息被处理,则返回值为非零值。如果消息没有被处理则返回值为零。若想获得更多的错误信息,请调用GetLastError函数。
  备注:MapDialogRect函数假定RECT结构内的起始坐标代表对话框单位。为把这些坐标从对话框单位转变为像素,函数检索对话框的当前水平和垂直基本单位,然后应用下列公式:
  left=(left*baseunitX)/4;right=(right*baseunitX)/4
  top=(top* baseunitY)/ 8; bottom=(bottom* baseunitY)/ 8

在很多情况下,对话框的基本单位同用GetDialogBaseUnits函数检索到的单位一样。如果对话板模板有DS_SETFONT类型,那么基本单位为模扳给定的字体中的字符的平均宽度和高度,单位为像素。
  速查:Windows NT:3.1及以上版本:Windows:95及以上版本;Windows CE:1.0及以上版本;头文件:Winuser.h;库文件:USer32.lib。



  GetWindowRect是取得窗口在屏幕坐标系下的RECT坐标(包括客户区和非客户区),这样可以得到窗口的大小和相对屏幕左上角(0,0)的位置。


  GetClientRect取得窗口客户区(不包括非客户区)在客户区坐标系下的RECT坐标,可以得到窗口的大小,而不能得到相对屏幕的位置,因为这个矩阵是在客户区坐标系下(相对于窗口客户区的左上角)的。  

  ClientToScreen把客户区坐标系下的RECT坐标转换为屏幕坐标系下的RECT坐标.

  ScreenToClient把屏幕坐标系下的RECT坐标转换为客户区坐标系下的RECT坐标.

我们对同一个窗口先GetWindowRect取得一个RECT,再用ScreenToClient转换到客户坐标系。然后 GetClientRect取得一个RECT,再用ClientToScreen转换到屏幕坐标系。显然,GetWindowRect取得的矩阵不小于 GetClientRect取得的矩阵。因为前者包含了非客户区,而后包括了客户区。   

 对GetWindowRect取得的矩阵ScreenToClient后,矩阵的大小没有变小,(-3,-29)是窗口的左上角的坐标,相对窗口客户区左上角。   

 

对GetClientRect取得的矩阵ClientToScreen后,矩阵也没有变大,新得到的矩阵是窗口客户区在屏幕坐标系上的RECT。

原文地址:https://www.cnblogs.com/BeyondTechnology/p/1815402.html