VC++ 坐标问题总结,控件大小随窗口变化
【出处:blog.csdn.net/lanmanck】
一般变控件位置和大小在OnSize()消息中处理,不外乎几个函数:
GetClientRect(),GetClientRect(),ScreenToClient(),MoveWindow()。今天说下这几个函数用法。
假设有一个窗体,Dialog1,上面有一个Edit和一个Button,我们希望窗口大小改变时,Edit大小跟着变,最好铺满整个窗口,除了Button;而Button大小不变,但是位置要变。
GetWindowRect() 得到的是在屏幕坐标系下的RECT(对于父窗体来说,以屏幕左上角为原点的矩形[x,y,W,H];对于窗体的控件来说也是以屏幕左上角为原点的矩形[x,y,W,H]);
GetClientRect() 得到的是在客户区坐标系下的RECT(即以所在窗口左上角为原点,去掉了标题栏计算,仅仅是个大小,返回值的左上角永远为0,0。对于父窗体来说,是自己的大小[0,0,W,H];对于窗体内的控件来说,也是自己的大小[0,0,W,H]);
ScreenToClient() 就是把屏幕坐标系下的RECT坐标转换为客户区坐标系下的RECT坐标。 如果需要获得窗体在屏幕上的位置,使用GetWindowRect ;如果需要获得窗体的大小,使用GetClientRect;
对窗体来讲:先调用GetWindowRect后再调用ScreenToClient这个时候得到的rect和直接使用GetClientRect得到的值是相等的,表示的是窗体大小,坐标是自己。
例如:
GetWindowRect=[t=118,b=511,l=326,r=1000],ScreenToClient=[t=0,b=393,l=0,r=674],
而GetClientRect=[t=0,b=393,l=0,r=674]。
由此可见,实际的控件大小为393x674,前后结果一样,坐标一样。
对控件来讲:先调用GetWindowRect后再调用ScreenToClient这个时候得到的rect和直接使用GetClientRect得到的值是不相等的,前面表示的是相对于父窗体的坐标,而后面表示的是自己的大小,坐标是自己,
例如:
GetWindowRect=[t=320,b=323,l=328,r=999],ScreenToClient=[t=202,b=205,l=2,r=673],
而GetClientRect=[t=0,b=3,l=0,r=671]。
由此可见,实际的控件大小为3x671,前后的结果都可以算出,但是各自坐标不一样。
有时候需要获得窗口矩形的大小和客户区矩形的大小二者的值,故需要分别调用GetWindowRect和GetClientRect。如果只需要获得客户区矩形的大小,调用GetClientRect就行了。
MoveWindow()就是把控件移到某个区域,包括放大、缩小和位置,坐标是对于Client来说的,也就是父窗口。对大窗口来说,它的“父窗口”是大屏幕,对于小控件来说,它的“父窗口”是大窗口。
现在的问题就是,如何得到合适的MoveWindow内的RECT大小。
结合上述例子,我归结如下,各位拿回去偷偷Happy吧:
在OnSize里面,
1、先得到父窗体的本身大小:GetCLientRect(rcDlg);后面的控件变化以此坐标为参考
2、得到希望变化大小的控件坐标:GetWindowRect(rcEdit);ScreenToCLient(rcEdit); 然后根据需要变更上下左右,与rcDlg比较,最后Movewindow(); 这里的大小都直接是相对于父窗体来说的大小和偏移了。
3、得到希望移动位置的控件坐标:因为上面有大小变化的控件,而本控件不变大小,所以top要以上面的控件为准:
GetClientRect().保存长和宽,然后根据上面的rect加减,一般得到right和top即可,这样加减保存的长宽,就可以move到一个新位置了。
参考代码:
CRect rcDlg;
GetClientRect(rcDlg); CRect rcEdit;
m_Edit1.GetWindowRect(rcEdit);
ScreenToClient(rcEdit);
rcEdit.top = 10;
rcEdit.bottom = rcDlg.bottom-30;
rcEdit.left = rcDlg.left;
rcEdit.right = rcDlg.right;
m_Edit1.MoveWindow(rcEdit); CRect rcBtn;
m_BtnOK.GetWindowRect(rcBtn);
ScreenToClient(rcBtn); /* 我们只是记录大小,或者这2句改为m_BtnOK.GetClientRect(rcBtn);是一样的效果 */
int nWidth = rcBtn.right-rcBtn.left;
int nHeight = rcBtn.bottom - rcBtn.top; rcBtn.top = rcEdit.bottom+2;
rcBtn.bottom = rcBtn.top+nHeight;
rcBtn.right = rcDlg.right - 10;
rcBtn.left = rcBtn.right-nWidth;
m_BtnOK.MoveWindow(rcBtn);
VC++ 坐标问题总结,控件大小随窗口变化的更多相关文章
- MFC窗口和控件大小等比例变化
第一步:OnInitDialog里保存对话框及其所有子窗体的Rect区域 CRect rect; GetWindowRect(&rect); listRect.AddTail(rect);// ...
- C:\\MFC控件大小随窗体大小而改变
一.大小和位置都改变 1.首先为窗体类添加CRect m_rect,该成员变量用来记录窗体的当前大小. 2.在类向导里面(Ctrl+W),为窗体添加消息WM_SIZE的响应函数OnSize(): 注意 ...
- VC中动态添加控件
VC中动态添加控件 动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的. 一.创建动态控件: 为了对照,我们先来看一下静态控件的创建. 放置静态控件时必须先建立一个 ...
- COM组件开发实践(八)---多线程ActiveX控件和自动调整ActiveX控件大小(下)
源代码下载:MyActiveX20081229.rar 声明:本文代码基于CodeProject的文章<A Complete ActiveX Web Control Tutorial>修改 ...
- COM组件开发实践(七)---多线程ActiveX控件和自动调整ActiveX控件大小(上)
声明:本文代码基于CodeProject的文章<A Complete ActiveX Web Control Tutorial>修改而来,因此同样遵循Code Project Open L ...
- C#控件大小随窗体大小等比例变化
相信很多博友在开发初次接触学习C# winForm时,当窗体大小变化时,窗体内的控件并没有随着窗体的变化而变化,最近因为一个项目工程的原因,也需要解决这个问题.通过查阅和学习,这个问题得到了解决,或许 ...
- VC中添加web控件的方法
在VC中使用WebBrowser控件的两方法 黄森堂(vcmfc)著 ClassWizard方式: 1.创建包装类:View->ClassWizard->Add Class->For ...
- bootstrap 表单控件 控件状态 控件大小 help-block
bootstrap 表单控件 控件状态 控件大小 help-block <!DOCTYPE html> <html lang="en"> <head& ...
- winform 控件大小随着窗体自适应
3个方法: #region 控件缩放变量 double formWidth;//窗体原始宽度 double formHeight;//窗体原始高度 doubl ...
随机推荐
- 网页CSS
CSS 样式表,(分三类:内联.内嵌.外部) 1,内联, 直接作于于 元素 例: <p style="font-size:14px;"> 2,内嵌 作用于网页 首先 ...
- Mongodb基本操作之.net
1.下载官方for C#驱动 2.导入2个dll文件 3.连接字符串 <add key="MongoConn" value="mongodb://127.0.0.1 ...
- 1 Linux平台下快速搭建FTP服务器 win7下如何建立ftp服务器
百度经验连接(亲测可用) http://jingyan.baidu.com/article/380abd0a77ae041d90192cf4.html win7下如何建立ftp服务器 http://j ...
- 最近公共祖先:LCA及其用倍增实现 +POJ1986
Q:为什么我在有些地方看到的是最小公共祖先? A:最小公共祖先是LCA(Least Common Ancestor)的英文直译,最小公共祖先与最近公共祖先只是叫法不同. Q:什么是最近公共祖先(LCA ...
- runtime error ?
程序运行时错误(运行时出错就是出现在程序运行过程中的),有很多种: 比如:溢出.内存泄露.死循.乱用指针.数组越界(数组开小了?).除以0错误.递归太深层(系统暴栈了)
- MySQL学习笔记(3) - 查询服务器版本,当前时间,当前用户
SELECT VERSION(); --显示当前服务器版本 SELECT NOW(); --显示当前日期时间 SELECT USER(); --显示当前用户 MySQL中语句规范: 1.关键字和函数名 ...
- CSS实现三角形效果
类似三角形的形状的元素在网页中可能会用到,我们可以用图片或者CSS元素达到我们想要的效果.这里讲一下是讲自己使用HTML+CSS实现三角形的方式. 为了能够熟悉的使用HTML+CSS构建三角形,我们首 ...
- 移动端-jquery Ajax执行滑动到底部进行加载 指定加载次数
过完年了,又要有新的项目了,趁暴风雨前的宁静,就把之前让我挺头疼的ajax加载给总结了一下.在此分享. 声明下:笔者对于ajax也是新手,如有更好的写法或可以优化的写法,还望指正! 项目需求: 移动端 ...
- jquery的.detach()方法
.detach()就是从DOM中删除所有匹配的元素. 与.remove()方法不同的是, 这个方法不会把匹配的元素从jQuery对象中删除,所有绑定的事件.附加的数据等都会保留下来,因而可以在将来再使 ...
- amchart
amchart能够根据提供的数据便捷的生成好看的图标,曾在项目中遇到使用falsh版以支持对js支持不好的低版本浏览器,但是现在官网上都是js版本的,flash版的文档都没有,搜索结果一般都是链接到博 ...