zoukankan      html  css  js  c++  java
  • 基于对话框的MFC应用程序GetWindowRect(),GetClientRect()探究

    简介:这是基于对话框的MFC应用程序GetWindowRect(),GetClientRect()探究的详细页面,介绍了和php,有关的知识、技巧、经验,和一些php源码等。

    class='pingjiaF' frameborder='0' src='http://biancheng.dnbcw.info/pingjia.php?id=338283' scrolling='no'>

    先建一个基于对话框的MFC应用程序,在对话框上放置一个静态文本控件m_plot

    用m_rectOldWindow变量保存对话框RECT,用m_rectOldPlotWindow保存静态文本控件RECT

    在OnInitDialog()添加如下测试代码

    GetWindowRect(&m_rectOldWindow);
    ScreenToClient(&m_rectOldWindow);
    GetClientRect(&m_rectOldWindow);
    ClientToScreen(&m_rectOldWindow);

    m_plot.GetClientRect(&m_rectOldPlotWindow);
    ClientToScreen(&m_rectOldPlotWindow);
    m_plot.GetWindowRect(&m_rectOldPlotWindow);
    ScreenToClient(&m_rectOldPlotWindow);

    调试运行 查看变量的值

    第一句GetWindowRect(&m_rectOldWindow);

    + &m_rectOldWindow 0x002cfcd4 {top=0 bottom=388 left=0 right=576} CRect *

    第二句ScreenToClient(&m_rectOldWindow);

    + &m_rectOldWindow 0x002cfcd4 {top=-30 bottom=358 left=-8 right=568} CRect *

    第三句GetClientRect(&m_rectOldWindow);

    + &m_rectOldWindow 0x002cfcd4 {top=0 bottom=350 left=0 right=560} CRect *

    第四句ClientToScreen(&m_rectOldWindow);

    + &m_rectOldWindow 0x002cfcd4 {top=30 bottom=380 left=8 right=568} CRect *

    第五句 m_plot.GetClientRect(&m_rectOldPlotWindow);

    + &m_rectOldPlotWindow 0x002cfcc4 {top=0 bottom=255 left=0 right=532} CRect *

    第六句:ClientToScreen(&m_rectOldPlotWindow);

    + &m_rectOldPlotWindow 0x002cfcc4 {top=30 bottom=285 left=8 right=540} CRect *

    第七句:m_plot.GetWindowRect(&m_rectOldPlotWindow);

    + &m_rectOldPlotWindow 0x0023f7dc {top=42 bottom=301 left=20 right=556} CRect *

    第八句:ScreenToClient(&m_rectOldPlotWindow);

    + &m_rectOldPlotWindow 0x0023f7dc {top=12 bottom=271 left=12 right=548} CRect *

    本来上网查资料的,乱的一团糟,很多都是自己没测试就给别人回答~

    实践是检验真理的唯一标准~  恩~  

    简要分析:

    本来我以为第一句的GetWindowRect得到的应该是这个对话框窗口相对于屏幕坐标的RECT,结果从下面的数值可以看出

    这四个函数都没有涉及到窗口坐标和屏幕坐标的转换

    GetWindowRect得到的是整个对话框客户区和非客户区的RECT,非客户区就是在xp里面标题部分绿绿的和边框部分,在win7下面半透明的部分

    坐标原点在整个窗口的左上角

    ScreenToClient为什么会得到负值?因为Client是客户区,坐标原点在客户区的左上角,窗口的左上角当然比客户区的左上角更加的左上,所以出现负数

    GetClientRect 得到窗口客户区的RECT,坐标原点在客户区的左上角,比较第一行和第三行的数据 相减,388-350 = 30 +8;576 - 560 = 2*8;

    ClientToScreen 坐标原点变成整个窗口的左上角 ,较客户区原点平移了(30,8),这个坐标转换,大家高中都学过的^_^

    m_plot.GetClientRect 以静态控件的左上角为原点,得到静态控件的RECT,right即为宽,bottom即为高

    ClientToScreen 这句话我纳闷了,难道微软的算法就是平移一个(30,8)? 我的控件左上角并不在客户区的左上角

    m_plot.GetWindowRect 以整个窗口的左上角为原点,得到控件的RECT

    ScreenToClient 以客户区左上角为原点,得到控件的RECT,我的控件左上角离客户区左上角有(12,12)的平移

    还没结束::

    重写控件onpaint

    添加

    GetWindowRect(&rect);
    ScreenToClient(&rect);
    GetClientRect(&rect);
    ClientToScreen(&rect);

    GetWindowRect(&rect);

    + &rect 0x0029f348 {top=233 bottom=492 left=372 right=908} CRect *

     ScreenToClient(&rect);

    + &rect 0x0029f348 {top=-2 bottom=257 left=-2 right=534} CRect *

     GetClientRect(&rect);

    + &rect 0x0029f348 {top=0 bottom=255 left=0 right=532} CRect *

     ClientToScreen(&rect);

    + &rect 0x0029f348 {top=235 bottom=490 left=374 right=906} CRect *

    神奇的事情发生了!

    还记得我前面的一句话不 这四个函数都没有涉及到窗口坐标和屏幕坐标的转换

    实践推翻了我的理论

    为什么呢?为什么呢?为什么呢?

    在对话框中调用GetWindowRec,m_plot.GetWindowRect

    在控件中调用GetWindowRec差别为何如此大?

    控件中的GetWindowRec以屏幕左上角为原点!谁能告诉我为什么

    第二句ScreenToClient(&rect);更加离谱~! -2是相对于什么坐标原点的平移?

    第三句GetClientRect(&rect);总算正常,是期望的结果,得到以控件本身的左上角为原点的RECT

    第四句ClientToScreen(&rect);以屏幕左上角为原点重写计算RECT,但为何和第一句得到的相差了2个像素的偏差?而这2个像素正是

    第二句中莫名冒出来的2个像素!

    求路过解析。。。

    爱J2EE关注Java迈克尔杰克逊视频站JSON在线工具

    http://biancheng.dnbcw.info/php/338283.html pageNo:9
  • 相关阅读:
    go函数
    Linux 查看磁盘容量、查找大文件、查找大目录
    五分钟理解一致性哈希算法(consistent hashing)
    使用Java实现三个线程交替打印0-74
    Python实现IOC控制反转
    Wannafly挑战赛5 A珂朵莉与宇宙 前缀和+枚举平方数
    Yandex Big Data Essentials Week1 Scaling Distributed File System
    Yandex Big Data Essentials Week1 Unix Command Line Interface Processes managing
    Yandex Big Data Essentials Week1 Unix Command Line Interface File Content exploration
    Yandex Big Data Essentials Week1 Unix Command Line Interface File System exploration
  • 原文地址:https://www.cnblogs.com/ooooo/p/2246994.html
Copyright © 2011-2022 走看看