本文主要针对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控件随窗口大小变化原理及实现相关推荐

  1. mfc控件随框变化(EasySize的用法,仔细看绝对有用)

    假设创建的对话框的类名是CMyDlg,具体过程如下: 步骤一:把easysize.h拷贝到CMyDlg项目文件夹中,同时在CMyDlg的.h文件和.cpp文件中加入#include "eas ...

  2. VS2019/MFC学习笔记之三(对话框控件随窗口大小同比例缩放)

    目录 一.禁止改变窗口大小 二.控件随窗口大小同比例缩放 三.设置窗口最大最小值 最近在做一个简易计算器的时候,发现窗口大小是可以随意拖动的,但是对话框内的控件并没有发现改变,这就会出现控件部分不动, ...

  3. 常用MFC控件基础使用(Edit Button Check Combo Tree 显示位图 控件大小自适应、线程、右键菜单、控件调整移动、MFC背景)

    常用MFC控件基础使用 1.Edit Control 2.Button控件 3.Check控件 4.Combo Box 5.Tree 控件 5.快捷键设置 6 显示缓冲区位图 7 窗口自适应大小 8 ...

  4. MFC控件编程之复选框单选框分组框

    MFC控件编程之复选框单选框分组框 一丶分组框 分组框 英文叫做 GroubBox 添加了分组框主要就是分组.好看.不重点介绍 二丶单选框 英文: Raido Button 单选框需要注意的事项 1. ...

  5. 深入学习SAP UI5框架代码系列之六:SAP UI5控件数据绑定的实现原理

    这是Jerry 2021年的第 7 篇文章,也是汪子熙公众号总共第 278 篇原创文章. 系列目录 (0) SAP UI5应用开发人员了解UI5框架代码的意义 (1) SAP UI5 module懒加 ...

  6. VS2010中如何实现自定义MFC控件

    本文简要讲解在VS2010中怎样实现自定义MFC控件的知识,以下是分步骤说明. 一.自定义一个空白控件  1.先创建一个MFC工程 NEW Project-->MFC-->MFC Appl ...

  7. MFC控件编程之组合框跟列表框

    MFC控件编程之组合框跟列表框 一丶简介 如果要使用组合框跟列表框.那么就要知道.组合框列表框是最核心的东西就是索引. 索引是从0开始的. 二丶组合框列表框常用的方法 AddString(字符串) 添 ...

  8. MFC 控件PictureControl 清除显示

    MFC 控件PictureControl 清除显示 方法一: GetDlgItem(IDC_STATIC_CAPTURE_PIC)->ShowWindow(FALSE); GetDlgItem( ...

  9. MFC程序调用Windwos CMD命令打印图片 MFC 控件显示层次调整,即(叠放次序)和绘制遮挡置于底层顶层灰色

    MFC打印 打电话 ShellExecute 从您的计划中 print 操作 (特好用) ShellExecute(NULL,"print","c:\\test.png& ...

最新文章

  1. 2019.01.19-2018年6月NEYC集训counting
  2. C语言中:在头文件中使用static定义变量意味着什么?
  3. php-5.4.6-win64,php5.4(64位)+apache2.4(64位)+mysql环境搭建
  4. libgdx学习记录27——线段与线段相交检测
  5. 如何在Java中将String转换为int
  6. HTML行内元素/行级元素/内联元素/行标签/内联标签/行内标签/行元素
  7. Javascript取select的选中值和文本
  8. UML类图与类间六种关系表示
  9. css根据屏幕大小切换样式
  10. 我的世界之 paper和spigot 的区别 Java服务端开服
  11. 1001 害死人不偿命的(3n+1)猜想 (15 分)—PAT (Basic Level) Practice (中文)
  12. sourceInsight
  13. c++ idea 插件_推荐 33 个 IDEA 最牛配置,写代码太爽了
  14. Eureka源码深度刨析-(5)EurekaServer处理服务发现
  15. 傅里叶分析(通俗解释)
  16. centos journalctl日志查看
  17. 倾斜摄影三维建模软件photoscan教程
  18. [嵌入式学习必备网站分享]嵌入式开发必须收藏的二十个网站 内附超链接 实用 嵌入式单片机学习网站
  19. 菜鸟必知之网络安全常识
  20. Attribute特性定义及应用

热门文章

  1. 关于人行acs对账不及时_以在线教育公司为例,如何做一款财务对账产品?
  2. 计算机网络技术超文本,网络协议确定了计算机网络传递和管理信息的规范,其中HTTP属于()A、超文本传输协议B、传输控制协...
  3. 嵌入式linux开发环境 cpu,嵌入式Linux开发环境的搭建之:U-Boot移植-嵌入式系统-与非网...
  4. 以太坊在哪里买_DeFi只是以太坊的开胃小菜,以太坊2.0才是重头戏
  5. windows cmd 窗口 显示信息慢_Windows系统直接运行Linux,竟是如此简单
  6. php jpg转换为pdf文件,php使用ImageMagick将PDF文件转换为JPG文件的方法_PHP
  7. 制打印如下所示的n行数字金字塔_一日一技:在Python中实现阿拉伯数字加上中文数字...
  8. 现在的python版本_现在python 流行哪个版本
  9. java控制io_Java-IO操作
  10. VHDL汽车尾灯控制器的设计