MFC控件随窗口大小变化原理及实现
本文主要针对MFC的dialog,实现控件随窗口大小变化。
原理:首先获取dialog的初始大小,当窗口发送变动时,调用OnSize事件和方法,计算缩放比例,然后对界面中的所有控件进行缩放和布局。
实现:
创建一个CMFCDemoDlg的dialog对话框;
- // CMFCDemoDlg 对话框
- class CMFCDemoDlg : public CDialogEx
- {
- // 构造
- public:
- CMFCDemoDlg(CWnd* pParent = NULL); // 标准构造函数
- // 对话框数据
- enum { IDD = IDD_MFCDEMO_DIALOG };
- protected:
- virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
- protected:
- CRect m_rect;
- void ChangeSize(UINT nID,int x,int y);
- void ReSize(void);
- POINT old;
- protected:
- // 生成的消息映射函数
- virtual BOOL OnInitDialog();
- afx_msg void OnSize(UINT nType, int cx, int cy);
- DECLARE_MESSAGE_MAP()
- };
在OnInitDialog方法中获取dialog的初始大小,记录到old变量中;
注册OnSize事件处理方法(ON_WM_SIZE(), OnSize()函数),设置控件大小
- CMFCDemoDlg::CMFCDemoDlg(CWnd* pParent /*=NULL*/)
- : CDialogEx(CMFCDemoDlg::IDD, pParent)
- {
- m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
- }
- void CMFCDemoDlg::DoDataExchange(CDataExchange* pDX)
- {
- CDialogEx::DoDataExchange(pDX);
- }
- BEGIN_MESSAGE_MAP(CMFCDemoDlg, CDialogEx)
- ON_WM_SIZE()
- END_MESSAGE_MAP()
- // CMFCDemoDlg 消息处理程序
- BOOL CMFCDemoDlg::OnInitDialog()
- {
- CDialogEx::OnInitDialog();
- // 获取对话框初始大小
- GetClientRect(&m_rect); //获取对话框的大小
- old.x=m_rect.right-m_rect.left;
- old.y=m_rect.bottom-m_rect.top;
- return TRUE;
- }
- void CMFCDemoDlg::ReSize(void)
- {
- float fsp[];
- POINT Newp; //获取现在对话框的大小
- CRect recta;
- GetClientRect(&recta); //取客户区大小
- Newp.x=recta.right-recta.left;
- Newp.y=recta.bottom-recta.top;
- fsp[]=(float)Newp.x/old.x;
- fsp[]=(float)Newp.y/old.y;
- CRect Rect;
- int woc;
- CPoint OldTLPoint,TLPoint; //左上角
- CPoint OldBRPoint,BRPoint; //右下角
- HWND hwndChild=::GetWindow(m_hWnd,GW_CHILD); //列出所有控件
- while(hwndChild){
- woc=::GetDlgCtrlID(hwndChild);//取得ID
- GetDlgItem(woc)->GetWindowRect(Rect);
- ScreenToClient(Rect);
- OldTLPoint = Rect.TopLeft();
- TLPoint.x = long(OldTLPoint.x*fsp[]);
- TLPoint.y = long(OldTLPoint.y*fsp[]);
- OldBRPoint = Rect.BottomRight();
- BRPoint.x = long(OldBRPoint.x *fsp[]);
- BRPoint.y = long(OldBRPoint.y *fsp[]);
- Rect.SetRect(TLPoint,BRPoint);
- GetDlgItem(woc)->MoveWindow(Rect,TRUE);
- hwndChild=::GetWindow(hwndChild, GW_HWNDNEXT);
- }
- old=Newp;
- }
- void CMFCDemoDlg::OnSize(UINT nType, int cx, int cy)
- {
- CDialogEx::OnSize(nType,cx,cy);
- if(nType!=SIZE_MINIMIZED ) //判断窗口是不是最小化了,因为窗口最小化之后 ,窗口的长和宽会变成0,当前一次变化的时就会出现除以0的错误操作
- {
- ReSize();
- }
- }
通过hwndChild=::GetWindow(m_hWnd,GW_CHILD);和::GetWindow(hwndChild, GW_HWNDNEXT); 列出所有控件
也可针对特定控件设置其大小,如:
- //change control size
- void CMFCDemoDlg::ChangeSize(UINT nID,int x,int y)
- {
- CWnd *pWnd = GetDlgItem(nID);
- if(pWnd!=NULL)
- {
- CRect rec;
- pWnd->GetWindowRect(&rec);//获取控件变化前的大小
- ScreenToClient(rec); //将控件大小装换位在对话框中的区域坐标
- // x / m_rect.Width(); 伸缩rate
- rec.left = rec.left * x / m_rect.Width();
- rec.top = rec.top * y / m_rect.Height();
- rec.bottom = rec.bottom * y / m_rect.Height();
- rec.right = rec.right * x / m_rect.Width();
- pWnd->MoveWindow(rec);//伸缩控件
- }
- }
参考:http://blog.csdn.net/lujianfeiccie2009/article/details/5485602
MFC控件随窗口大小变化原理及实现的更多相关文章
- C# Winform 界面中各控件随着窗口大小变化
在做一项工程中,由于不确定目标平台的分辨率,而正常使用要求铺满整个屏幕,所以界面中的各个控件必须能够适应窗口的变化. 首先想到的就是控件的百分比布局,但是再尝试写了几个控件的Location和Size ...
- 【MFC】mfc控件位置调整和坐标确定 .
摘自DoubleLi: http://www.cnblogs.com/lidabo/archive/2012/08/24/2654678.html mfc控件位置调整和坐标确定 http://my ...
- MFC控件编程之 按钮编辑框.静态文本的使用,以及访问控件的七种方法.
MFC控件编程之 按钮编辑框.静态文本的使用以及访问控件的七种方法. 一丶按钮.静态文本的通用属性. 他们都有一个属性.就是可以输入标题内容.以及可以自定义控件ID. 创建一个MFC Dlg对话框. ...
- MFC控件编程之鼠标跟键盘消息
MFC控件编程之鼠标跟键盘消息 在MFC中鼠标消息.键盘消息我们很常用.所以说一下. 鼠标消息分为客户区消息.跟非客户区消息. 一丶客户区消息 我们可以处理消息.来进行我们相应的函数即可. MFC添加 ...
- MFC控件的SubclassDlgItem
MFC控件的SubclassDlgItem 要在程序中创建新设计的控件,显然不能用自动创建的办法,因为对话框模板对新控件的特性一无所知.程序可以用手工方法创建控件,在调用派生类的Create函数时,派 ...
- [MFC] 梳理一个简单的图片处理桌面软件中用到的MFC控件技巧
前言 前些天应好友之拖,帮忙设计一个简单的图像处理的小软件.朋友把核心算法封装好了,但是是用openCV类似于console的编程环境,要我在此基础上改成MFC桌面程序.下图是做成之后的效果: 我是 ...
- paip.gui控件form窗体的原理实现以及easyui的新建以及编辑实现
paip.gui控件form窗体的原理实现以及easyui的新建以及编辑实现 //////新建 与编辑 var EditForm=new Form_easyui(); if(row) ...
- Android控件TextView的实现原理分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8636153 在前面一个系列的文章中,我们以窗口 ...
- MFC控件编程进度条编写
MFC控件编程进度条编写 一丶进度条编程需要用到的方法 进度条MFC已经帮我们封装好类了. 叫做 CProgressCtrl 进度条编程也很简单. 封装的方法也就那个那几个. GetPos() 获 ...
随机推荐
- cocos2d-x中CCCallFunc CCCallFuncN CCCallFuncND的区别和使用示例
转自:http://xiandanboke.com.cn/cocos2d-xcccallfunc.html CCCallFunc CCCallFuncN CCCallFuncND的区别和使用 CCCa ...
- Windows内存管理和linux内存管理
windows内存管理 windows 内存管理方式主要分为:页式管理,段式管理,段页式管理. 页式管理的基本原理是将各进程的虚拟空间划分为若干个长度相等的页:页式管理把内存空间按照页的大小划分成片或 ...
- mysql二进制包安装与配置实战记录
导读 一般中小型网站的开发都选择 MySQL 作为网站数据库,由于其社区版的性能卓越,搭配 PHP .Linux和 Apache 可组成良好的开发环境,经过多年的web技术发展,在业内被广泛使用的一种 ...
- Creating a CSRF protection with Spring 3.x--reference
reference from:http://info.michael-simons.eu/2012/01/11/creating-a-csrf-protection-with-spring-3-1/ ...
- 代码片段--Makefile之大型工程项目子目录Makefile的一种通用写法
转载:http://blog.csdn.net/mo_hui123456/article/details/8929615 管理Linux环境下的C/C++大型项目,如果有一个智能的Build Syst ...
- The Socket API, Part 3: Concurrent Servers
转:http://www.linuxforu.com/2011/10/socket-api-part-3-concurrent-servers/ By Pankaj Tanwar on October ...
- docker 中运行 redis 服务
先使用 dockerfile 创建一个 redis 容器 FROM ubuntu:latest RUN apt-get update RUN apt-get -y install redis-serv ...
- LOG4NET开源日志dll引用流程,在net3.5中已经实践ok
一,在app.config中配置 <?xml version="1.0"?><configuration> <configSections> & ...
- C#高级特性
1.接口 接口与抽象基类.抽象类与接口的不同是,抽象类不仅可以定义多态接口还可以定义一些其他的成员以及构造函数.而接口只能包含抽象成员. 抽象父类创建多态接口,只有派生类才可以.而往往很多情况下非派生 ...
- cocoapods 卸载,重装,高版本的使用
今天清理下电脑,发现自己电脑上的cocoapods经常出现的一个问题就是一些经常用的第三方库cocoapods搜不到,比如SDWebImage,然后就鼓捣了一下 $pos list 命令发现M 以后的 ...