一,先介绍两者使用方式

GetWindowRect

CWnd* pWnd;
pWnd = GetDlgItem(IDC_STATIC_PIC);
pWnd->GetWindowRect(&m_PicWindowRect);   //m_PicWindowRect为存储区域大小的CRect

简写为

GetDlgItem(IDC_STATIC_PIC)->GetWindowRect(&m_PicWindowRect);

GetClientRect

 ::GetClientRect(GetDlgItem(IDC_STATIC_PIC)->GetSafeHwnd(), &m_PicRect);

二,区别

GetWindowRect 为获得控件相对与对话框或者(设备屏幕)的坐标大小。

GetWindowRect得到的是相对于当前界面的整个窗口左上角的坐标,比如一个对话框程序,那就是相对于对话框左上角的坐标,从左往右是X方向,从上往下是Y方向。

注意:这个函数的相对坐标原点分两种情况:

1 窗口还没有初始化完成时:原点是整个窗口的左上角  (即将获得坐标的大小写在窗口初始化函数中)

2 初始化完成后,原点是设备屏幕左上角

GetClientRect为获得控件相自身的坐标大小,top和left都为0;

三,对于static text控件来说

如果不设置border (即无边框),那么通过GetWindowRect和GetClientRect的获得控件区域的长宽大小是一致的,

如果border为true(即有边框),那么两者得到的控件长宽是不一样的,GetClientRect得到的长和宽都要小四像素

四,关于坐标的计算

关于坐标

  MFC中绘图时经常涉及到坐标计算,GetWindowRect和GetClientRect这两个函数,是获取逻辑坐标系中窗口或控件(其实也是窗口)大小和坐标的常用函数了,有什么不一样的?

先说说什么叫逻辑坐标?讲到逻辑坐标,它相对的一个概念是设备坐标,是为了屏蔽掉不同设备属性差别而设置的抽象坐标系,说白了,就是独立于设备坐标的统一接口,程序员不需要去在具体的设备上进行绘图操作,而只需要在虚拟的环境下进行绘图,就是CDC。

然后由设备驱动去负责虚拟坐标到实际设备坐标之间的转换。通常逻辑坐标与设备坐标之间有不同的映射转换关系,缺省模式下的映射方式是MM_TEXT,这种方式下的逻辑坐标的方向和单位与设备坐标的相同,也是以像素为单位来表示,X轴向右为正,Y轴向下为正,坐标原点位于窗口的左上角

然后再说上面的两个函数之间的差别:

GetWindowRect得到的是相对于当前界面的整个窗口左上角的坐标,比如一个对话框程序,那就是相对于对话框左上角的坐标,从左往右是X方向,从上往下是Y方向。

注意:这个函数的相对坐标原点分两种情况:

1 窗口还没有初始化完成时:原点是整个窗口的左上角

2 初始化完成后,原点是设备屏幕左上角

GetClientRect得到的是相对于窗口客户区左上角的坐标。

验证

下面通过一段代码来理解:

新建一个MFC对话框程序,在Dialog资源中,把一个静态框加入进来。OnInitDialog中添加如下代码:

BOOL CmfcdialogtestDlg::OnInitDialog()
{
/*.............其它代码.............*//*****************for testing***************/CRect wndRect1;CRect wndRect2;/****首先看对话框的******/this->GetWindowRect(&wndRect1); //PrintRect("Dialog:GetWindowRect", wndRectScreen1);this->ScreenToClient(&wndRect1); //PrintRect("Dialog:ScreenToClient", wndRectClient1);this->GetClientRect(&wndRect2); //PrintRect("Dialog:GetClientRect", wndRectClient2);this->ClientToScreen(&wndRect2); //PrintRect("Dialog:ClientToScreen", wndRectScreen2);/****再看控件的**********/CRect ctrlRect1;CRect ctrlRect2;CStatic *pCtrl = (CStatic*)GetDlgItem(IDC_STC_TEST);pCtrl->GetClientRect(&ctrlRect1); //PrintRect("static:GetClientRect", ctrlRectClient1);pCtrl->ClientToScreen(&ctrlRect1); //PrintRect("static:ClientToScreen", ctrlRectScreen1);pCtrl->GetWindowRect(&ctrlRect2); //PrintRect("static:GetWindowRect", ctrlRectScreen2);pCtrl->ScreenToClient(&ctrlRect2); //PrintRect("static:ScreenToClient", ctrlRectClient2);/*****************ending********************/
/*.............其它代码.............*/}

分析

我们分别观察对整个对话框和静态控件,分别调用这两个函数的效果。首先看看对话框的:

(1)对话框部分的程序运行结果:

对话框:
GetWindowRect: +        &wndRect1    0x0017f410 {top=0 bottom=378 left=0 right=566}    CRect *
ScreenToClient:+        &wndRect1    0x0017f410 {top=-25 bottom=353 left=-3 right=563}    CRect *GetClientRect: +        &wndRect2    0x0017f3f8 {top=0 bottom=350 left=0 right=560}    CRect *
ClientToScreen:+        &wndRect2    0x0017f3f8 {top=25 bottom=375 left=3 right=563}    CRect *

我们给出一份图片分析:

第一个GetWindowRect得到的是整个窗口相对于窗口左上角的坐标,实际上就是这个对话框的大小。

然后ScreenToClient,注意了,我们发现top和left都变成了负值?为什么呢,因为这个时候的转换是基于Client的原点进行的,即客户区的左上角。因为原来的窗口左上角位于Client原点的左上方,所以是负值。

第二个GetClientRect得到的是客户区的大小,因为不包含窗口周边的蓝色区域,所以比第一个的窗口大小要小。

然后ClientToScreen,这个就很好解释了,计算相对于窗口左上角的坐标。你可以自己动手算一下。

(2)控件的程序运行结果:

控件:
GetClientRect:    +        &ctrlRect1    0x0017f3e0 {top=0 bottom=170 left=0 right=285}    CRect *
ClientToScreen:  +        &ctrlRect1    0x0017f3e0 {top=127 bottom=297 left=73 right=358}    CRect *GetWindowRect:    +        &ctrlRect2    0x0017f3c8 {top=127 bottom=297 left=73 right=358}    CRect *
ScreenToClient:  +        &ctrlRect2    0x0017f3c8 {top=0 bottom=170 left=0 right=285}    CRect *

还是图片分析:

同理,第一个GetClientRect得到是控件的大小。

然后ClientToScreen,可以看到这个时候,控件相对于对话框窗口左上角的位移是(127,73)。

第二个GetWindowRect,得到的值与上面的值相同,这个很好理解了,他们的含义是一样的,就是控件在窗口中的坐标。

然后ScreenToClient,得到的值与第一个GetClientRect的值一样。不多说了

为什么对话框和控件的转换之间略有差别(两次转换结果不太一样),主要是对话框包含了非客户区,使得相对坐标不一致。

本文转载自:https://blog.csdn.net/u011432426/article/details/42874513

GetWindowRect与GetClientRect 的区别相关推荐

  1. GetWindowRect和GetClientRect的区别详解

    一,先介绍两者使用方式 方式一 CWnd* pWnd;pWnd = GetDlgItem(IDC_STATIC_PIC);pWnd->GetWindowRect(&m_PicWindow ...

  2. GetWindowRect() 和 GetClientRect() 的区别

    新建一个基于对话框的MFC的exe程序: 删除对话框的所有按钮,并添加一个test按钮,添加一个Static控件,ID为IDC_STATIC: 双击test按钮,在响应函数中添加以下代码: View ...

  3. GetWindowRect和GetClientRect(得到窗口坐标)

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

  4. GetWindowRect和GetClientRect

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

  5. 自动化操作-实践(薅光诈骗群)

    目录 前言 自动化操作 获得窗口句柄 获取鼠标位置 点击操作 什么是偏移量加减? 通过剪贴版输入中文,或文本 自动提取文本操作 截取屏幕保存到目标位置 写入文本到记事本 高级点击,匹配图片点击 自动化 ...

  6. 新人新博客新学习家园

    MFC如何显示位图 51CTO 这是我第二天加入51,感觉这里的学习气氛非常浓厚,开始了自己计算机道路! 我是在校学生,第一次接触C++,MFC,对于这些有着许多兴趣,无论学习的过程多么艰辛,都希望能 ...

  7. 在Windows95/98中实现苹果窗口界面

    有没有想过在Windows环境下实现苹果电脑窗口界面的风格?下面就以实现苹果电脑窗口风格为例,进行一次奇妙的旅行. 原 理   仔细观察苹果窗口,发现和Windows窗口的区别主要体现在标题栏和控制按 ...

  8. VC API常用函数简单例子大全(1-89)

    第一个:FindWindow根据窗口类名或窗口标题名来获得窗口的句柄,该函数返回窗口的句柄 函数的定义:HWND WINAPI FindWindow(LPCSTR lpClassName ,LPCST ...

  9. 转载:VC常用API+示例

    第一个:FindWindow根据窗口类名或窗口标题名来获得窗口的句柄,该函数返回窗口的句柄, 这个函数的定义是这样的 HWND WINAPI FindWindow(LPCSTR lpClassName ...

  10. VC常用API+示例

    2019独角兽企业重金招聘Python工程师标准>>> 第一个:FindWindow根据窗口类名或窗口标题名来获得窗口的句柄,该函数返回窗口的句柄, 这个函数的定义是这样的 HWND ...

最新文章

  1. 为什么Python不是未来的编程语言?
  2. iOS中判断程序是不是第一次运行(新手引导界面用)
  3. Windows Server2008下MYSQL外网无法访问问题解决
  4. mysql-管理事务
  5. tensorflow随笔-tf.ReaderBase
  6. 影响数百万人的21个经典全英文演讲,看完英语水平暴增!赶紧收藏
  7. 3 张图带你走近蚂蚁mPaaS音视频通话组件
  8. phpcmsV9 “来源” 的添加与管理
  9. 《Windows服务器配置与管理》远程桌面管理
  10. Python库glob作用分析
  11. JavaScript--eval
  12. 为翻译软件提供云端语料库支持,Tmxmall 瞄准了语言领域的大数据
  13. CreateThread与_beginthread 内存泄漏的本质
  14. 01_基于蒲公英R300A的异地组网PLC调试实现
  15. gggggggggggg
  16. hook IE 总结
  17. 鸿蒙熔炉是真实存在的吗,古董局中局父辛爵是真的吗 父辛爵真实存在国内仅有两件...
  18. 前端——获取手机验证码案例
  19. 智能车的“耳朵”电磁检测传感器
  20. 网络七层模型和TCP/IP分层模型

热门文章

  1. ceph搭建_【实战演练】基于各种存储模拟器与软件存储的存储实验07-Ceph分布式存储的3种存储类型使用方法...
  2. windows 2003 iis php,windows 2003 iis安装php 5.2版本步骤
  3. php 时间戳 24小时制,如何在php中添加24小时的unix时间戳?(How do I add 24 hours to a unix timestamp in php?)...
  4. 谈谈数字货币交易系统的发展
  5. 性能测试常用的linux命令
  6. C# abstract ,virtual ,override,new --比较好的文章
  7. 处理tiff格式dem数据的方法——输出xyz坐标
  8. 茴香豆的n种写法之①——linQ Join写法
  9. TensorFlow实战minist数据集 softmax回归分类(一)
  10. python代码封装成SDK