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[2]; POINT Newp; //获取现在对话框的大小 CRect recta; GetClientRect(&recta); //取客户区大小 Newp.x=recta.right-recta.left; Newp.y=recta.bottom-recta.top; fsp[0]=(float)Newp.x/old.x; fsp[1]=(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[0]); TLPoint.y = long(OldTLPoint.y*fsp[1]); OldBRPoint = Rect.BottomRight(); BRPoint.x = long(OldBRPoint.x *fsp[0]); BRPoint.y = long(OldBRPoint.y *fsp[1]); 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(); 伸缩raterec.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控件随窗口大小变化原理及实现相关推荐
- mfc控件随框变化(EasySize的用法,仔细看绝对有用)
假设创建的对话框的类名是CMyDlg,具体过程如下: 步骤一:把easysize.h拷贝到CMyDlg项目文件夹中,同时在CMyDlg的.h文件和.cpp文件中加入#include "eas ...
- VS2019/MFC学习笔记之三(对话框控件随窗口大小同比例缩放)
目录 一.禁止改变窗口大小 二.控件随窗口大小同比例缩放 三.设置窗口最大最小值 最近在做一个简易计算器的时候,发现窗口大小是可以随意拖动的,但是对话框内的控件并没有发现改变,这就会出现控件部分不动, ...
- 常用MFC控件基础使用(Edit Button Check Combo Tree 显示位图 控件大小自适应、线程、右键菜单、控件调整移动、MFC背景)
常用MFC控件基础使用 1.Edit Control 2.Button控件 3.Check控件 4.Combo Box 5.Tree 控件 5.快捷键设置 6 显示缓冲区位图 7 窗口自适应大小 8 ...
- MFC控件编程之复选框单选框分组框
MFC控件编程之复选框单选框分组框 一丶分组框 分组框 英文叫做 GroubBox 添加了分组框主要就是分组.好看.不重点介绍 二丶单选框 英文: Raido Button 单选框需要注意的事项 1. ...
- 深入学习SAP UI5框架代码系列之六:SAP UI5控件数据绑定的实现原理
这是Jerry 2021年的第 7 篇文章,也是汪子熙公众号总共第 278 篇原创文章. 系列目录 (0) SAP UI5应用开发人员了解UI5框架代码的意义 (1) SAP UI5 module懒加 ...
- VS2010中如何实现自定义MFC控件
本文简要讲解在VS2010中怎样实现自定义MFC控件的知识,以下是分步骤说明. 一.自定义一个空白控件 1.先创建一个MFC工程 NEW Project-->MFC-->MFC Appl ...
- MFC控件编程之组合框跟列表框
MFC控件编程之组合框跟列表框 一丶简介 如果要使用组合框跟列表框.那么就要知道.组合框列表框是最核心的东西就是索引. 索引是从0开始的. 二丶组合框列表框常用的方法 AddString(字符串) 添 ...
- MFC 控件PictureControl 清除显示
MFC 控件PictureControl 清除显示 方法一: GetDlgItem(IDC_STATIC_CAPTURE_PIC)->ShowWindow(FALSE); GetDlgItem( ...
- MFC程序调用Windwos CMD命令打印图片 MFC 控件显示层次调整,即(叠放次序)和绘制遮挡置于底层顶层灰色
MFC打印 打电话 ShellExecute 从您的计划中 print 操作 (特好用) ShellExecute(NULL,"print","c:\\test.png& ...
最新文章
- 2019.01.19-2018年6月NEYC集训counting
- C语言中:在头文件中使用static定义变量意味着什么?
- php-5.4.6-win64,php5.4(64位)+apache2.4(64位)+mysql环境搭建
- libgdx学习记录27——线段与线段相交检测
- 如何在Java中将String转换为int
- HTML行内元素/行级元素/内联元素/行标签/内联标签/行内标签/行元素
- Javascript取select的选中值和文本
- UML类图与类间六种关系表示
- css根据屏幕大小切换样式
- 我的世界之 paper和spigot 的区别 Java服务端开服
- 1001 害死人不偿命的(3n+1)猜想 (15 分)—PAT (Basic Level) Practice (中文)
- sourceInsight
- c++ idea 插件_推荐 33 个 IDEA 最牛配置,写代码太爽了
- Eureka源码深度刨析-(5)EurekaServer处理服务发现
- 傅里叶分析(通俗解释)
- centos journalctl日志查看
- 倾斜摄影三维建模软件photoscan教程
- [嵌入式学习必备网站分享]嵌入式开发必须收藏的二十个网站 内附超链接 实用 嵌入式单片机学习网站
- 菜鸟必知之网络安全常识
- Attribute特性定义及应用
热门文章
- 关于人行acs对账不及时_以在线教育公司为例,如何做一款财务对账产品?
- 计算机网络技术超文本,网络协议确定了计算机网络传递和管理信息的规范,其中HTTP属于()A、超文本传输协议B、传输控制协...
- 嵌入式linux开发环境 cpu,嵌入式Linux开发环境的搭建之:U-Boot移植-嵌入式系统-与非网...
- 以太坊在哪里买_DeFi只是以太坊的开胃小菜,以太坊2.0才是重头戏
- windows cmd 窗口 显示信息慢_Windows系统直接运行Linux,竟是如此简单
- php jpg转换为pdf文件,php使用ImageMagick将PDF文件转换为JPG文件的方法_PHP
- 制打印如下所示的n行数字金字塔_一日一技:在Python中实现阿拉伯数字加上中文数字...
- 现在的python版本_现在python 流行哪个版本
- java控制io_Java-IO操作
- VHDL汽车尾灯控制器的设计