澳门新浦京8455comMapWindowsPoints函数使用

MapWindowPoints的百度解释:

 

  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

函数功能:该函数把相对于一个窗口的坐标空间的一组点映射成相对于另一窗口的坐标空
的一组点。

void GetClientRect(
   LPRECT lpRect 
) const;
作用:把CWnd客户区的客户坐标复制到lpRect指向的结构体中。
返回值:如果函数成功,返回值为非零:如果函数失败,返回值为零。若想获得更多错误信息,请调用GetLastError函数。
lpRect:指向RECT结构体或CRect类的指针,接受客户区的坐标。
因为此坐标是相对于CWnd客户区的左上角,故总是得到(0,0,宽度,高度)。

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

函数原型:int MapWindowPoints(HWND hWndFrom, HWND hWndTo,LPPOINT
lpPoints, UINT cPoints);

GetClientRect()得到的是客户区的矩形,不包括标题栏,外框。
GetWindowRect()得到的是整个窗口的矩形。
总结:
相同点:GetclientRect和GetWindowRect都得到矩形的左上角和右下角顶点的坐标。
区别:GetclientRect是相对于窗口的客户区左上角,故得到的总是(0,0,宽度,高度),即客户区的矩形。

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

参数:

GetWindowRect是相对于屏幕的左上角,故得到的可能是(10,10,30,40)。(10,10)表示窗口左上角顶点相对于屏幕左上角的坐标,(30,40)表示窗口右下角顶点相对于屏幕左上角的坐标。窗口的宽度为30-20=10,高度为40-10=30.

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

hWndfrom:转换点所在窗口的句柄,如果此参数为NULL或HWND_DESETOP则假定这些点在屏幕坐标上。

便于理解:
调用GetWindowRect后再调用ScreenToClient==GetClientRect,
调用GetClientRect后再调用ClientToScreen==GetWindowRect

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

hWndTo:转换到的窗口的句柄,如果此参数为NULL或HWND_DESKTOP,这些点被转换为屏幕坐标。

 

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

lpPoints:指向POINT结构数组的指针,此结构数组包含要转换的点,此参数也可指向RECT结构,在此情况下,Cpoints参数应设置为2。

 

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

cPoints:指定LpPoints参数指向的数组中POINT结构的数目。

其它解释:

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

返回值:如果函数调用成功,返回值的低位字是每一个源点的水平坐标的像素数目,以便计算每个目标点的水平坐标;高位字是每一个源点的垂直坐标的像素的数目,以便计算每个目标点的垂直坐标,如果函数调用失败,返回值为零。

GetWindowRect
  函数功能:该函数返回指定窗口的边框矩形的尺寸。该尺寸以相对于屏幕坐标左上角的屏幕坐标给出。
  函数原型:BOOL GetWindowRect(HWND hWnd,LPRECTlpRect);
  在Visual Studio 2005中,函数原型为void GetWindowRect(LPRECT lpRect)
const;
  是属于CWnd类的函数.
  参数:
  hWnd:窗口句柄。
  lpRect:指向一个RECT结构的指针,该结构接收窗口的左上角和右下角的屏幕坐标。
  返回值:如果函数成功,返回值为非零:如果函数失败,返回值为零。若想获得更多错误信息,请调用GetLastError函数。
  速查:Windows NT:3.1以上版本:Windows:95以上版本;Windows
CE:1.0以上版本;头文件:Winuser.h;库文件:User32.lib。
  
先调用GetWindowRect后再调用ScreenToClient,这个时候得到的rect和直接使用GetClientRect得到的值是相等的。

 

个人感受:

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

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

上面是百度上的解释,在我当初看到的时候,感觉上解释是很清楚,但是具体的在实际中怎么用,我们可以用它来帮助我们完成什么样的功能,简直没有一个概念。于是用VC来拖几个控件上去,看看使用效果后,总结如下:

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

1、MapWindowPoints函数可以完成ClientToScreen和ScreenToClient函数的功能。

GetWindowRect和GetClientRect函数的说明如下:

将要转换成Screen的点所在窗口的句柄作为hWndFrom,NULL或者HWND_TOP作为hWndto,所得结果即是与ClientToScreen一样,好处是可以一次进行多个点,可使lpRect作为LPPOINT处的参数,但是要使用做强制转换。完成ScreenToClient时,窗口句柄反过来使用即可。

CWnd::GetClientRect 
    void GetClientRect( LPRECT lpRect ) const;
Parameters:
lpRect
    Points to a RECT structure or a CRect object to receive the client
coordinates. The left and top members will be 0. The right and bottom
members will contain the width and height of the window.
Remarks:
    Copies the client coordinates of the CWnd client area into the
structure pointed to by lpRect. The client coordinates specify the
upper-left and lower-right corners of the client area. Since client
coordinates are relative to the upper-left corners of the CWnd client
area, the coordinates of the upper-left corner are (0,0).

2、获取控件在父窗口上的位置。在不知道使用MapWindowPoint函数一前,我要获取对话框上的控件位置时,都是使用GetWindowRect后,再使用ScreentToClient来转换,很是麻烦的,现在可以直接使用MapWindowPointslpRect,2),即可得到句柄为hChildWnd窗口在其父窗口上的位置了,很方便的。

CWnd::GetWindowRect
void GetWindowRect( LPRECT lpRect ) const;
Parameters:
lpRect
Points to a CRect object or a RECT structure that will receive the
screen coordinates of the upper-left and lower-right corners.
Remarks:
Copies the dimensions of the bounding rectangle of the CWnd object to
the structure pointed to by lpRect. The dimensions are given in screen
coordinates relative to the upper-left corner of the display screen. The
dimensions of the caption, border, and scroll bars, if present, are
included.

3、完成其他任何两个窗口之间的位置判断。当今世界,无奇不有,因此对两互不相关的窗口由于某种原因,也可能用得上MapWindowPoints,如千千静听播放器当两个窗口间距离小于小于某一范围时,让他们自动靠拢。这个距离的判断也是可以通过MapWindowPoints来判断的。只需要传递两个窗口句柄到MapWindowPoints和其中一个窗口的坐标位置,在结合各个窗口大小进行判断即可,此处不讨论了。

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

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

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

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

The GetClientRect function retrieves the coordinates of a window’s
client area. The client coordinates specify the upper-left and
lower-right corners of the client area. Because client coordinates are
relative to the upper-left corner of a window’s client area, the
coordinates of the upper-left corner are (0,0).

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

The GetWindowRect function retrieves the dimensions of the bounding
rectangle of the specified window. The dimensions are given in screen
coordinates that are relative to the upper-left corner of the screen.

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

相互转化用ScreenToClient 或者 ClientToScreen

ClientToScreen
The ClientToScreen function converts the client coordinates of a
specified point to screen coordinates.
BOOL ClientToScreen(
   HWND hWnd,        // window handle for source coordinates
   LPPOINT lpPoint   // pointer to structure containing screen
coordinates
);
Parameters
hWnd
Handle to the window whose client area is used for the conversion.
lpPoint
Pointer to a POINT structure that contains the client coordinates to be
converted. The new screen coordinates are copied into this structure if
the function succeeds.
Return Values
If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero.

虽然存在调用GetWindowRect后再调用ScreenToClient==GetClientRect,但ScreenToClient()和ClientToScreen()两者都是属于WINDOWS
API函数,可能是存在一定的冗余设计,但意义不同。
不过在.Net Framework下对WINDOWS
API函数进行了重新整理和优化,在获取控件或窗口的屏幕坐标和客户区坐标时更方便的多,只需要得到与控件或窗口相对应屏幕坐标和客户区坐标属性值就可以了。

ScreenToClient
The ScreenToClient function converts the screen coordinates of a
specified point on the screen to client coordinates.
BOOL ScreenToClient(
   HWND hWnd,         // window handle for source coordinates
   LPPOINT lpPoint    // address of structure containing coordinates
);
Parameters:
hWnd
Handle to the window whose client area will be used for the
conversion.
lpPoint
Pointer to a POINT structure that contains the screen coordinates to be
converted.
Return Values:
If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero.

You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图