GetWindowRect与GetClientRect 的区别[转]

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就行了。

GetWindowRect和GetClientRect函数的说明如下:

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).

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.

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.

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/dadalan/archive/2010/02/22/5316599.aspx

GetWindowRect与GetClientRect 的区别[转],布布扣,bubuko.com

时间: 2024-10-08 08:16:01

GetWindowRect与GetClientRect 的区别[转]的相关文章

GetWindowRect和GetClientRect的区别详解

一:关于坐标 MFC中绘图时经常涉及到坐标计算,GetWindowRect和GetClientRect这两个函数,是获取逻辑坐标系中窗口或控件(其实也是窗口)大小和坐标的常用函数了,有什么不一样的? 先说说什么叫逻辑坐标?讲到逻辑坐标,它相对的一个概念是设备坐标,是为了屏蔽掉不同设备属性差别而设置的抽象坐标系,说白了,就是独立于设备坐标的统一接口,程序员不需要去在具体的设备上进行绘图操作,而只需要在虚拟的环境下进行绘图,就是CDC. 然后由设备驱动去负责虚拟坐标到实际设备坐标之间的转换.通常逻辑

VC:GetWindowRect、GetClientRect、ScreenToClient与ClientToScreen

GetWindowRect是取得窗口在屏幕坐标系下的RECT坐标(包括客户区和非客户区),这样可以得到窗口的大小和相对屏幕左上角(0,0)的位置. GetClientRect取得窗口客户区(不包括非客户区)在客户区坐标系下的RECT坐标,可以得到窗口的大小,而不能得到相对屏幕的位置,因为这个矩阵是在客户区坐标系下(相对于窗口客户区的左上角)的. 用GetClientRect返回的RECT结构上左为零, 右下分别对应客户区的宽度和高度; ScreenToClient把屏幕坐标系下的RECT坐标转换

GetWindowRect和GetClientRect比较学习

一:关于坐标 MFC中绘图时经常涉及到坐标计算,GetWindowRect和GetClientRect这两个函数,是获取逻辑坐标系中窗口或控件(其实也是窗口)大小和坐标的常用函数了,有什么不一样的? 先说说什么叫逻辑坐标?讲到逻辑坐标,它相对的一个概念是设备坐标,是为了屏蔽掉不同设备属性差别而设置的抽象坐标系,说白了,就是独立于设备坐标的统一接口,程序员不需要去在具体的设备上进行绘图操作,而只需要在虚拟的环境下进行绘图,就是CDC. 然后由设备驱动去负责虚拟坐标到实际设备坐标之间的转换.通常逻辑

MFC 刷新失效的Picture控件

问题描述:如在摄像头显示时,关闭摄像头,此时Picture控件仍然显示最后一帧图像,需要刷新掉,还原Picture控件.或者重复显示两张不同大小的图片时,第二张背景有第一张图片残留. 解决方法1:(最笨的方法) 用对话框背景色来填充控件, CRect rect; GetDlgItem(IDC_ShowImage)->GetClientRect(&rect); GetDlgItem(IDC_ShowImage)->GetDC()->FillSolidRect(&rect2,

MFC特定函数的应用20160720

1.SystemParametersInfo函数可以获取和设置数量众多的windows系统参数 MFC中可以用 SystemParametersInfo(……) 函数来获取和设置系统信息,如下面例子所示,改变的是系统菜单栏的高度.示例:改变系统菜单栏的高度 NONCLIENTMETRICS ncm;ncm.cbSize = sizeof( NONCLIENTMETRICS );  //这个非常重要,否则下面函数调用将返回0,即ret=0,说明函数调用失败 int ret=::SystemPara

VC API常用函数简单例子大全[转]

第一个:FindWindow根据窗口类名或窗口标题名来获得窗口的句柄,该函数返回窗口的句柄 函数的定义:HWND WINAPI FindWindow(LPCSTR lpClassName ,LPCSTR lpWindowName); 第一个参数填窗口的类名,第二个填窗口的标题名,其实是不需要同时填两个参数的,也就是说,你只要知道窗口的类名或窗口的标题就可以了,没有的那个就用NULL代替. 比如现在有一个窗口名为"无标题.txt - 记事本"的记事本程序.那么我就可以用上面的函数获得这个

MFC实现静态图片控件拖动(改)

从这篇文章中提炼http://blog.csdn.net/cq20110310/article/details/6926017 注意几点 1.传入MoveWindow()的是相对坐标 2.传入CImgeList class member方法的是绝对坐标 BOOL CNewPlan::PreTranslateMessage(MSG* pMsg) { // TODO: 在此添加专用代码和/或调用基类 if(pMsg-> message==WM_LBUTTONDBLCLK) { //若在图片中双击跳出

WinSpy涉及的windows api

WinSpy涉及的windows api WinSpy是仿造微软Spy++的开源项目,但只涉及Spy++的窗口句柄.窗口的属性.styles.类名子窗口.进程线程信息等查找功能.功能虽然不算强大,但涉及到很多windows api,是了解windows api的一个有用工具.WinSpy界面截图如下: 1:拖拽瞄准镜图标获取窗口的HWND 核心api:ClientToScreen.WindowFromPoint.EnumChildWindows.GetParent.GetWindowLong.S

对话框大小与像素关系

转载▼ 我们知道可以用记事本打开.rc文件,然后改里面的坐标,来改变对话框大小,如: 以下是rc文件 ///////////////////////////////////////////////////////////////////////////// // // Dialog // IDD_ABOUTBOX DIALOGEX 0, 0, 170, 62 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTIO