MFC窗口的位置

缘由,第一次的笔记

最近由于一些原因,想要记录在工作中、或是在学习中遇到的一些问题。以免每次遇到的时候都要去网上查询相关知识,消耗时间,以提高自己的学习效率。
那么就从自己最近遇到的一个MFC的问题开始。

窗口的位置

由于平时写界面相关的比较少,工业场合对界面的要求不高,对于MFC的一些界面知识一直是比较缺乏的状态,每次也只是做到基本能用,便没有去管它。最近在写一些动态生成控件时发现控件显示的位置总不在自己的预期位置。发现自己对GetWindowRect()、GetClientRect()、 ScreenToClient()、 ClientToScreen()几个函数的理解不深,每次很容易使用错误,又不知其中原因,这个问题已有几次重复,今天想到就把它记录下来。

GetWindowRect GetClientRect

定义
GetWindowRect :该函数返回指定窗口的边框矩形的尺寸。该尺寸以相对于屏幕坐标左上角的屏幕坐标给出。
GetClientRect:该函数获取窗口客户区的大小。注意一下:窗口的客户区为窗口中除标题栏、菜单栏之
外的地方。
给出一个最简单的实例,便于理解。
对话框的最终显示如下。
MFC窗口的位置_第1张图片
在OnInitDialog函数和在Button1响应函数中分别调用上面两个函数,得到的窗口位置对比如下图。
MFC窗口的位置_第2张图片
通过对比得出:GetClientRect函数在两个地方调用得到的结果是相同的。而GetWindowRect则在窗口初始化和初始化后得到的结果不同。在窗口初始化时,相对的位置为对话框的左上角(0,0),而窗口初始化后为屏幕的左上角。亦能看出窗口的边框矩形尺寸和窗口客户区大小的区别。

之后,对他们做ScreenToClient 和 ClientToScreen转换,得到的对比结果如下图。
MFC窗口的位置_第3张图片
可以看出ScreenToClient 以客户区(0,0)为坐标原点,所以tmpRect1的坐标出现负值。而 ClientToScreen 以屏幕左上角(对话框未初始化完时,以对话框矩形外框)为原点、
而且对话框中的控件坐标变换均以对话框的原点作变换。变换的本质在于知道变换的原点在什么地方,这样就能比较好的推导出结果。
附调用代码:
CRect tmpRect1, tmpRect2, tmpRect3, tmpRect4;
GetWindowRect(tmpRect1);
//ScreenToClient(tmpRect1);
GetClientRect(tmpRect2);
//ClientToScreen(tmpRect2);
GetDlgItem(IDC_BUTTON1)->GetWindowRect(tmpRect3);
//ScreenToClient(tmpRect3);
GetDlgItem(IDC_BUTTON1)->GetClientRect(tmpRect4);
//ClientToScreen(tmpRect4);

你可能感兴趣的:(mfc)