一。大小和位置都改变

1.首先为窗体类添加CRect m_rect,该成员变量用来记录窗体的当前大小。

2.在类向导里面(Ctrl+W),为窗体添加消息WM_SIZE的响应函数OnSize();

注意if(nType==1) return;这一句必须添加,否则最小化恢复的时候会出错。

[cpp] view plaincopy

  1. void CPaperManagementDlg::OnSize(UINT nType, int cx, int cy)   
  2. {  
  3.     CDialog::OnSize(nType, cx, cy);  
  4.     if(nType==1) return;//最小化则什么都不做  
  5.     // TODO: Add your message handler code here  
  6.     CWnd *pWnd;   
  7.     pWnd = GetDlgItem(IDC_STATIC);  
  8.     ChangeSize(pWnd, cx, cy);  
  9.     pWnd = GetDlgItem(IDC_FILE_TREE);  
  10.     ChangeSize(pWnd, cx, cy);  
  11.     pWnd = GetDlgItem(IDC_EDIT_NAME);  
  12.     ChangeSize(pWnd, cx, cy);  
  13.     pWnd = GetDlgItem(IDC_EDIT_REFERENCE);  
  14.     ChangeSize(pWnd, cx, cy);  
  15.     pWnd = GetDlgItem(IDC_EDIT_SUMMARY);  
  16.     ChangeSize(pWnd, cx, cy);  
  17.     pWnd = GetDlgItem(IDC_EDIT_REMARK);  
  18.     ChangeSize(pWnd, cx, cy);  
  19.     pWnd = GetDlgItem(IDC_BUTTON_UPDATE);  
  20.     ChangeSize(pWnd, cx, cy);  
  21.     pWnd = GetDlgItem(IDC_BUTTON_SAVE);  
  22.     ChangeSize(pWnd, cx, cy);  
  23.     pWnd = GetDlgItem(IDC_STATIC_1);  
  24.     ChangeSize(pWnd, cx, cy);  
  25.     pWnd = GetDlgItem(IDC_STATIC_2);  
  26.     ChangeSize(pWnd, cx, cy);  
  27.     pWnd = GetDlgItem(IDC_STATIC_3);  
  28.     ChangeSize(pWnd, cx, cy);  
  29.     pWnd = GetDlgItem(IDC_STATIC_4);  
  30.     ChangeSize(pWnd, cx, cy);  
  31.     GetClientRect(&m_rect);// 将变化后的对话框大小设为旧大小     
  32. }  

其中函数ChangeSize是手动添加的用户函数,步骤如下

3.添加一个改变控件大小的用户函数,void ChangeSize(CWnd *pWnd, int cx, int cy),并编写代码

[plain] view plaincopy

  1. void CPaperManagementDlg::ChangeSize(CWnd *pWnd, int cx, int cy)  
  2. {  
  3.     if(pWnd)  //判断是否为空,因为对话框创建时会调用此函数,而当时控件还未创建   
  4.     {  
  5.         CRect rect;   //获取控件变化前的大小    
  6.         pWnd->GetWindowRect(&rect);  
  7.         ScreenToClient(&rect);//将控件大小转换为在对话框中的区域坐标  
  8.   
     
  9.         //    cx/m_rect.Width()为对话框在横向的变化比例  
  10.         rect.left=rect.left*cx/m_rect.Width();//调整控件大小  
  11.         rect.right=rect.right*cx/m_rect.Width();  
  12.         rect.top=rect.top*cy/m_rect.Height();  
  13.         rect.bottom=rect.bottom*cy/m_rect.Height();  
  14.         pWnd->MoveWindow(rect);//设置控件大小  
  15.     }  
  16. }  

真正改变控件大小的函数是ChangeSize函数,在OnSize中不断调用ChangeSize函数从而改变窗体中所有控件的大小。

——————————————————————————————————————————————————————

以下内容来自网络:

二、 VC++之根据对话框大小仅调整控件位置
    1、在对话框类中加入成员变量CRect m_rect;用于保存对话框大小变化前的大小;
    2、在对话框的OnInitDialog()函数中获取对话框创建时的大小: 
    GetClientRect(&m_rect);
    3、在WM_SIZE的响应函数OnSize()中加入以下代码:
    CWnd *pWnd; 
    pWnd = GetDlgItem(IDC_BUTTON1);     //获取控件句柄
    if(nType==1) return;   //如果是窗体最小化则什么都不做
    if(pWnd)//判断是否为空,因为对话框创建时会调用此函数,而当时控件还未创建
    { 
    CRect rect;   //获取控件变化前大小
      LONG cWidth,cHeight; //记录控件的右部到窗体右部的距离,记录控件的底部到窗体底部的距离
      pWnd->GetWindowRect(&rect);
     ScreenToClient(&rect);//将控件大小转换为在对话框中的区域坐标
     cWidth=m_rect.Width()-rect.right;
     cHeight=m_rect.Height()-rect.bottom;
     rect.left=cx-rect.Width()-cWidth;
     rect.right=cx-cWidth;   
     rect.top=cy-rect.Height()-cHeight;
     rect.bottom=cy-cHeight;
     pWnd->MoveWindow(rect);//设置控件大小
    }
    GetClientRect(&m_rect);//将变化后的对话框大小设为旧大小

C:\\MFC控件大小随窗体大小而改变的更多相关文章

  1. [改善] dcef3 for Firemonkey 浏览器控件,拉动窗体大小会闪烁的问题

    问题:dcef3 for Firemonkey 浏览器控件,拉动窗体大小会闪烁的问题 修改源码:ceffmx.pas 找到 procedure TCustomChromiumFMX.Resize; 修 ...

  2. Delphi让控件随着窗口的大小而改变

    Delphi让控件随着窗口的大小而改变方法1:设置Anchors属性,把akLeft,akTop,akRight,akBottom都设为True.方法2:设置Align属性,其值为alClient.

  3. 【MFC】mfc控件位置调整和坐标确定 .

    摘自DoubleLi:   http://www.cnblogs.com/lidabo/archive/2012/08/24/2654678.html mfc控件位置调整和坐标确定 http://my ...

  4. MFC控件的SubclassDlgItem

    MFC控件的SubclassDlgItem 要在程序中创建新设计的控件,显然不能用自动创建的办法,因为对话框模板对新控件的特性一无所知.程序可以用手工方法创建控件,在调用派生类的Create函数时,派 ...

  5. MFC控件随窗口大小变化原理及实现

    本文主要针对MFC的dialog,实现控件随窗口大小变化. 原理:首先获取dialog的初始大小,当窗口发送变动时,调用OnSize事件和方法,计算缩放比例,然后对界面中的所有控件进行缩放和布局. 实 ...

  6. MFC 控件编程之水平滚动条跟垂直滚动条

    MFC 控件编程之水平滚动条跟垂直滚动条 一点水平滚动条的操作 首先在操作滚动条的时候.我们要知道滚动条的一些属性. 比如我们要设置 最大值 最小值. 以及每次递增的值是多少.都要设置. 所有就有一个 ...

  7. MFC控件编程之 按钮编辑框.静态文本的使用,以及访问控件的七种方法.

    MFC控件编程之 按钮编辑框.静态文本的使用以及访问控件的七种方法. 一丶按钮.静态文本的通用属性. 他们都有一个属性.就是可以输入标题内容.以及可以自定义控件ID. 创建一个MFC Dlg对话框. ...

  8. MFC控件GDI编程

    MFC控件GDI编程 一丶学习内容 1.了解常用的GDI函数绘图. 2.使用常用的画笔画刷. 二丶常用的GDI函数绘图 上方则为我们常用的GDI函数了. 画线 矩形. 以及圆 等等. 2.1 画线代码 ...

  9. Python pyQt4/pyQt5 学习笔记1(空白窗口,按钮,控件事件,控件提示,窗体显示到屏幕中间,messagebox)

    PyQt4是用来编写有图形界面程序(GUI applications)的一个工具包.PyQt4作为一个Python模块来使用,它有440个类和超过6000种函数和方法.同时它也是一个可以在几乎所有主流 ...

随机推荐

  1. 《Linux 性能及调优指南》1.4 硬盘I/O子系统

    翻译:飞哥 (http://hi.baidu.com/imlidapeng) 版权所有,尊重他人劳动成果,转载时请注明作者和原始出处及本声明. 原文名称:<Linux Performance a ...

  2. ELK新手教程(二)

    暂不排版,后面整理. logstash 使用配置文件 在bin目录下创建一个名为test.conf的文件,内容为: input { stdin {} } output { stdout{} } 执行命 ...

  3. update 中实现子查询

    mysql 在update中实现子查询的方式   当使用mysql条件更新时--最先让人想到的写法 UPDATE buyer SET is_seller=1 WHERE uid IN (SELECT  ...

  4. CentOS7开机时的菜单选项及时间的修改

    一.在CentOS更新后,并不会自动删除旧内核.所以在启动选项中会有多个内核选项,可以手动使用以下命令删除多余的内核:(正常下,第一个选项正常启动,第二个选项急救模式启动(系统出项问题不能正常启动时使 ...

  5. 【Jmeter自学】JMeter的安装(一)

    ==================================================================================================== ...

  6. android 开发 实现多个动态权限的方法(并且兼容6.0以下的版本权限授权)

    android开发权限授权因为版本的不同有不同的授权方式,6.0以下的版本使用的是在注册表中添加权限的静态授权(这种授权权限提示只会出现在app安装的时候),而6.0以上(包含6.0)就需要动态授权的 ...

  7. UINavigationController 返回到各级目录

    [self.navigationController popViewControllerAnimated:YES]; UINavigationController返回总结: 1.弹出当前视图控制器(弹 ...

  8. cnblogs博客申请完毕,以后再这里安家落户

    cnblogs博客申请完毕,以后再这里安家落户,之前的博客就不转载了,好好搞技术,安稳过日子.

  9. 【JAVA】使用Aphache poi操作EXCEL 笔记

    1 下载poi,地址 http://poi.apache.org/ 选择3.9版本. 2 刚开始尝试 把poi.jar放在D:\Program Files\java\jdk1.6.0_20\lib(不 ...

  10. js处理数据库时间格式/Date(1332919782070)/

    js处理数据库时间格式 数据库返回时间格式:/Date(1332919782070)/ 方法: function ChangeDateFormat(val) { if (val != null) { ...