天天看点

GetClientRect GetWindowRect ScreenToClient ClientToScreen 通俗讲解~

CRect rect ;

1.GetClientRect(rect) 将调用此函数的类的 相对于用户区左上角的 矩形坐标 赋给rect

2.GetWindowRect(rect) 将调用此函数的类的 相对于屏幕左上角的 矩形坐标 赋给rect

ps. 这里参数要使用LPRECT的,即指向rect的指针,这里直接使用rect是因为他被重载了。

例1:(假设窗口长200(水平方向), 宽100, 客户区长180,宽90)

void CWnd::Example()
{
     CRect rect ;
   //若此时窗口在屏幕左上角, 则rect的top 跟 left 一定为0 , bottom 为 100, right 为200 
   //若距离屏幕左上角水平距离多x像素, 垂直多y像素, 则rect top = y, left = x, bottom = 100+y, right = 200+x ;
     GetWindowRect(rect) ;
   //窗口的客户区一般是除掉菜单栏,走右两边也稍稍比窗口窄一点, 你可以想象你的浏览器是一个窗口,那么客户区就等于去掉上面的导航栏和标签页,以及左右的滚动条。。
     //现假设导航条宽10像素, 右边滚动条长(水平方向)5像素
   //若此时窗口在屏幕左上角, 则rect的top = 0 left = 0 , bottom = 90, right = 180 (因为他是以客户区的左上角为顶点的,
       所以不用理会导航条的宽度。客户区不包括导航条)
   //窗口在哪个位置, 其实rect都不会变的。。因为客户区左上角也随着窗口移动。。。
   GetClientRect(rect) ;              
}      

例2:

CStatic::Example()
{
     CWnd *pParent = GetParent();
      if (pParent)
     {
       pParent->ScreenToClient(rect);
      }  
}      

首先我们要知道static控件的客户区只是他所在文字的矩形而已,他是不同于他父亲的客户区的。。。

这里static是窗口里面一个控件,因为ScreenToClient是他的父亲窗口调用的,所以若控件处于

rect 的值等于这个控件里窗口客户区的距离。。。有点像这个网页上“推荐”这个按钮离 屏幕左上角垂直距离加上导航栏的那个点 的距离

例3:

CStatic::Example2()
{
   CRect rect ; 
   ScreenToClient(rect) ;
}       

这里是控件调用的ScreenToClient函数, 所以rect的值是距离其所在文字的矩形, 则top 跟 left 都为0, right 和 bottom 随字体大小变化

例4:

CStatic::Example3()
{
    CRect rect ;
  //以下两个操作共同得到的矩形 与 GetWindowRect得到矩形相等
    GetClientRect(rect) ;
    ClientToScreen(rect) ;

  //以下两个操作共同得到的矩形 与 GetClientRect得到矩形相等
    GetWindowRect(rect) ;
    ScreenToClient(rect) ;
}      

这是我以下研究得到的成果。。。。 写下来分享给更多人!

转载于:https://www.cnblogs.com/crisxyj/archive/2013/05/17/3084104.html