屏幕坐标系和窗口客户区坐标系最明显的区别

来源:互联网 发布:淘宝企业店铺公司简介 编辑:程序博客网 时间:2024/05/23 15:36
屏幕坐标系和窗口客户区坐标系最明显的区别在于坐标原点,屏幕坐标系的坐标原点在整个屏幕的左上角,而窗口客户区坐标系的坐标原点在窗口客户区的左上角,通常这两个点是不重合的。

一 设备坐标和逻辑坐标

  设备坐标(Device Coordinate)又称为物理坐标(Physical Coordinate),是指输出设备上的坐标。通常将屏幕上的设备坐标称为屏幕坐标。设备坐标用对象距离窗口左上角的水平距离和垂直距离来指定对象的位置,是以像素为单位来表示的,设备坐标的X轴向右为正,Y轴向下为正,坐标原点位于窗口的左上角。

  逻辑坐标(Logical Coordinate)是系统用作记录的坐标。在缺省的模式(MM_TEXT)下,逻辑坐标的方向和单位与设备坐标的方向和单位相同,也是以像素为单位来表示的,X轴向右为正,Y轴向下为正,坐标原点位于窗口的左上角。逻辑坐标和设备坐标即使在缺省模式下其数值也未必一致,除了在以下两种情况下:

  1. 窗口为非滚动窗口

  2. 窗口为滚动窗口,但垂直滚动条位于滚动边框的最上端,水平滚动条位于最左端,但如果移动了滚动条这两种坐标就不一致了。

  在VC中鼠标坐标的坐标位置用设备坐标表示,但所有GDI绘图都用逻

  坐标表示,所以用鼠标绘图时,那么必须将设备坐标转换为逻辑坐标,可以使用CDC 函数DptoLP()将设备坐标转化为逻辑坐标,同样可以用LptoDP()将逻辑坐标转化为设备坐标。


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

      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::GetClientRect(CRect rect)  函数:

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

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

 

CWnd::GetWindowRect(rect) 函数:

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

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