客户区坐标与屏幕坐标之间的转换问题

转载地址:http://blog.csdn.net/ke_yang/article/details/5417552

          http://blog.163.com/tufanghui01@126/blog/static/9460641420101021102433108/


WIN32  API函数:

      1、ClientToScreen 函数:

  这个函数的功能:该函数将指定点的用户坐标转换成屏幕坐标。

  函数原型:BOOL ClientToScreen(HWND hWnd,LPPOINT lpPoint);

  参数:

  hWnd :用户区域用于转换的窗口句柄。 注:第二个参数点的坐标是相对于第一个参数(窗口句柄)的窗口的坐标,将此点转换为屏幕坐标,实际上是在此点窗口坐标(相对于窗口左上角的坐标)的基础上加上此窗口左上角坐标相对于屏幕左上角的坐标值。

  lpPoint:指向一个含有要转换的用户坐标的结构的指针,如果函数调用成功,新屏幕坐标复制到此结构。

  返回值:如果函数调用成功,返回值为非零值,否则为零。

  注释:函数用屏幕坐标取代POINT结构中的用户坐标,屏幕坐标与屏幕左上角相关联。

      CWnd::ClientToScreen(LPPOINT lpPoint)  (ClientToScreen(LPRECT lpRect))实现的是同样的效果,只不过是窗口句柄缺省为调用此函数的窗口。

 

      2、ScreenToClient 函数:

      函数功能:该函数把屏幕上指定点的屏幕坐标转换成用户坐标。

  函数原型:BOOL ScreenToClient(HWND hWnd, LPPOINT lpPoint);

  参数:

  hWnd:指向窗口的句柄,此窗口的用户空间将被用来转换。 注:将此点相对于屏幕左上角的坐标值转换成相对于此窗口左上角的坐标值。

  lpPoint:指向POINT结构指针,该结构含有要转换的屏幕坐标。

  返回值:如果函数调用成功,返回值为非零值,否则为零。

  Windows NT:若想获得更多错误信息,请调用GetLastError函数。

  注释:该函数应用hWnd参数标识的窗口和POINT结构给定的屏幕坐标来计算用户坐标,然后以用户坐标来替代屏幕坐标,新坐标是相对于指定窗口的领域的左上角。

 

CWnd::void GetClientRect( LPRECT lpRect ) const;函数:

此函数得到的区域是相对于调用此函数的窗口指针所指向的窗口的客户区域,坐标点是相对于此窗口而言的。例如:在对话框中,如果是一个子控件调用此函数,那么它得到的rect值左上角的点必定为(0,0),长宽必定与此控件的客户区长宽想等。如果是对话框自身调用此函数,Rect是基类对话框客户区域坐标,并且rect左上角的点也必定是(0,0),长宽与此对话框的客户区长宽相等。

注:API函数::GetClientRect(HWND hwnd,LPRECT lprect)实现同样的效果

 

CWnd::void GetWindowRect( LPRECT lpRect ) const; 函数:

此函数得到的区域坐标是相对于屏幕左上角而言,无论是对话框本身还是它的子控件调用此函数得到的坐标都是相对于屏幕而言。并且如果是对话框那么它得到的是对话框整个窗口的区域坐标。

注:API函数::GetWindowRect(HWND hwnd,LPRECT lprect)实现同样的效果



先调用GetWindowRect后再调用ScreenToClient,这个时候得到的rect和直接使用GetClientRect得到的值是相等的

有时候需要获得窗口矩形的大小和客户区矩形的大小二者的值,故需要分别调用GetWindowRect和GetClientRect。

如果只需要获得客户区矩形的大小,调用GetClientRect就行了。


GetWindowRect() 得到的是在屏幕坐标系下的RECT;(即以屏幕左上角为原点) 
GetClientRect() 得到的是在客户区坐标系下的RECT; (即以所在窗口左上角为原点)

GetWindowRect()取的是整个窗口的矩形; 
GetClientRect()取的仅是客户区的矩形,也就是说不包括标题栏,外框等;

第一个函数获得的是窗口在屏幕上的位置,得到的结果可能是这样CRect(10,10,240,240); 
第二个函数和它不同,它只获得了客户区的大小,因此得到的结果总是这样CRect(0,0,width,height);

ScreenToClient() 就是把屏幕坐标系下的RECT坐标转换为客户区坐标系下的RECT坐标。


GetClientRect得到的是客户区的大小,也就是说这样得到的左上角永远是(0,0)

GetWindowRect 是窗口相对于整个屏幕的坐标,屏幕左上点为0,0


你可能感兴趣的:(ScreenToClient,ClientToScreen,GetClientRect,GetWindowRect)