由于项目需要,需要学习CGridCtrl控件的使用,测试控件时发现了一个问题,我无法将控件放在对话框的制定位置。

  该问题的原因很容易发现,其实就是GetWindowRec()函数和GetClientRect()函数在不同情况下返回的Rect含义不同,以及CWnd::Create()函数的特性造成的。

目的

  在Dialog上创建一个CGridCtrl控件,控件的位置由一个PictureBox控件(拖动到对话框模板上的控件)决定,即在PictureBox控件的位置上创建一个与其大小相同的CGridCtrl,下图中虚线内即为PictureBox。

  

GetClientRect()

  获取窗口客户区的大小,返回的CRect的左上角坐标永远为(0,0)

GetWindowRect()

  首先说一说GetWindowRect()在帮助文档中的介绍是: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()返回的是相对屏幕左上角的的坐标,包括标题栏、边框和滚动条。

在实际测试中我发现,如果调用该函数的CWnd没有父窗口,即CWnd::GetParent()返回null,那么GetWindowRect()返回的CRect的左上角坐标永远为(0,0),如图所示,其中this代表一个基于对话框工程的主对话框。

  

  如果调用该函数的CWnd有父窗口,即CWnd::GetParent()不返回null,那么GetWindowRect()返回的CRect的坐标为相对父窗口(包括标题栏、边框等)左上角的坐标,如下图所示,其中IDC_GRid是一个对话框控件的资源ID。  

  

CWnd::Create()函数的特性

  CWnd::Create()函数在不同的派生类中有不同的实现,其中一种形式为:

 BOOL CWnd::Create(const RECT& rect, CWnd* pParentWnd, UINT nID, DWORD dwStyle)

即指定父窗口和在父窗口中的位置,加入要在一个对话框中创建一个Grid控件,采用如下代码:

   

     CRect rectGridWnd;
GetDlgItem(IDC_GRID)->GetWindowRect(&rectGridWnd); //获取Grid控件的位置,相对于整个Dlg
m_pGrid = new CGridCtrl(,);
m_pGrid->Create(rectGridWnd,this,IDC_GRID);

  那么呈现的效果如下:

  

  即CGridCtrl与PictureBox有了错位,原因在于CWnd::Create()中的CRect是以父窗口客户区的左上角为原点坐标,而GetWindowRect()是以父窗口(包括非客户区)的左上角为原点,所以造成了错位。

要想正确显示,需要采用以下的代码,即根据对话框的边框和标题的尺寸对rectGridWnd进行平移:

     // TODO: 在此添加额外的初始化代码
int captionHeight = ::GetSystemMetrics(SM_CYCAPTION);
int cxframe = GetSystemMetrics(SM_CXFRAME);
int cyframe = GetSystemMetrics(SM_CYFRAME); CRect rectGridWnd;
GetDlgItem(IDC_GRID)->GetWindowRect(&rectGridWnd);
rectGridWnd.OffsetRect(-cxframe,-cyframe-captionHeight);
m_pGrid = new CGridCtrl(,);
m_pGrid->Create(rectGridWnd,this,IDC_GRID);

  最终界面如下图所示:

  

GetWindowRect和GetClientRect的异同的更多相关文章

  1. GetWindowRect和GetClientRect的区别详解

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

  2. GetWindowRect和GetClientRect的注意事项

    发现GetClientRect()函数取值不正确,特此找来了些资料以供参考,具体如下,就可以明白怎么回事了. 一:关于坐标 MFC中绘图时经常涉及到坐标计算,GetWindowRect和GetClie ...

  3. GetWindowRect和GetClientRect比较学习

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

  4. GetWindowRect与GetClientRect 的区别

    GetWindowRect 函数功能:该函数返回指定窗口的边框矩形的尺寸.该尺寸以相对于屏幕坐标左上角的屏幕坐标给出. 函数原型:BOOL GetWindowRect(HWND hWnd,LPRECT ...

  5. GetWindowRect、GetClientRect、ScreenToClient与ClientToScreen

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

  6. VC:GetWindowRect、GetClientRect、ScreenToClient与ClientToScreen

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

  7. MFC特定函数的应用20160720(SystemParametersInfo,GetWindowRect,WriteProfileString,GetSystemMetrics)

    1.SystemParametersInfo函数可以获取和设置数量众多的windows系统参数 MFC中可以用 SystemParametersInfo(……) 函数来获取和设置系统信息,如下面例子所 ...

  8. vc++ mfc中拖动效果的实现 借助于CImageList

    拖动是界面编程频繁使用的一个效果,在windows系统下可谓大行其道.纵观时下的应用软件几乎各个都支持各种各样拖动的效果,windows7更是把拖动做到了极致.其实说起来拖动的实现也很简单,对于有句柄 ...

  9. VC++的菜单控制和自绘菜单

    菜单控制为什么即使调用EnableMenuItem菜单项后,菜单项还处于禁止状态 需要将CFrameWnd:: m_bAutomenuEnable设置为FALSE,如果该数据成员为TRUE(缺省值), ...

随机推荐

  1. Windows 多用户远程访问 Ubuntu 14.04桌面

    使用X2Go实现多用户远程访问 Ubuntu 14.04桌面:VNC也可以,但是每次连接VNC就回新创建一个Seession,想要在下次远程登录的时候返回上次活动,需要记住开启的线程,这种繁琐的操作不 ...

  2. unity笔录

    ----------------------------unity项目在启动splash的时候黑屏 原因不明------------------测试复制项目  用剔除法测试 笔录开始 先用原版本打包 ...

  3. 在windows下安装pip scrapy...

    将 C:\Users\用户名\AppData\Local\Programs\Python\Python35\Scripts C:\Users\用户名\AppData\Local\Programs\Py ...

  4. spring HttpServletRequest 简介

    前提:工作遇到controller中通过注解的方式注入 @Resourceprivate HttpServletRequest request;我们都知道spring 默认是单例,当遇到并发的时候线程 ...

  5. underScore学习1:匿名函数中call(this)的作用

    匿名函数中(function(){}).call(this) 中的.call(this) 有什么用? 我们都知道,.call()可以改变函数执行时的context,即this的指向,源码中的.call ...

  6. 如何在IIS6,7中部署ASP.NET网站(转载)

    查看web.config文件 web.config通常会放在网站的根目录,这个文件中包含了一最重要的网站运行参数.比如: connectionStrings,httpHandlers,httpModu ...

  7. Spring.net 学习

    最近一段时间,在学习spring.net方面的知识,spring.net是什么,spring.net是用来干什么的,我们这里就不在介绍了,spring.net有两方面的内容---IOC(DI)与AOP ...

  8. FlatBuffers入门

    1.下载flatbuffers 从https://github.com/google/flatbuffers地址下载flatbuffers-master.zip文件. 2.编译flatbuffers ...

  9. PNPOLY - Point Inclusion in Polygon Test

    https://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html The C Code Here is the code, ...

  10. Gdiplus 贴图(助记) -------------------拖动整个对话框

    最简单的两种方法: 一.使WM_NCHITTEST始终返回HTCAPTION,也就是欺骗系统让他以为这是菜单栏. LRESULT CDemoDlg::OnNcHitTest(CPoint point) ...