一。大小和位置都改变

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. tips:Java中while的判断条件

    tips:Java中while的判断条件! 在c++中,有时候会遇到这种情况: while(x = y){ dosomething; } 如果x与y相等,这个时候如果循环体中没有跳出的点,那么会无限循 ...

  2. 干货 | 100+个NLP数据集大放送,再不愁数据!

    奉上100多个按字母顺序排列的开源自然语言处理文本数据集列表(原始未结构化的文本数据),快去按图索骥下载数据自己研究吧! 数据集 Apache软件基金会公开邮件档案:截止到2011年7月11日全部公开 ...

  3. Ramdisk虚拟内存盘,Swap分区

    虚拟内存盘是通过软件将一部分内存(RAM)模拟为硬盘来使用的一种技术.相对于直接的硬盘文件访问来说,这种技术可以极大的提高在其上进行的文件访问的速度.但是RAM的易失性也意味着当关闭电源后这部分数据将 ...

  4. solr 打分和排序机制(转载)

    以下来自solr in action. 包含: 词项频次.查询词项出现在当前查询文档中的次数. 反向文档频次.查询词项出现在所有文档总的次数. 此项权重. 标准化因子: 字段规范: 文档权重. 字段权 ...

  5. 连接Hive的客户端界面工具–SQuirrel SQL Client

    关键字:Hive客户端.界面.SQuirrel SQL Client 刚看到一个可以连接Hive的客户端界面工具–SQuirrel SQL Client,试了一下,用起来还行,在这里记录一下安装及使用 ...

  6. leetcode 852. Peak Index in a Mountain Array

    Input: [0,1,0] Output: 1 Input: [0,2,1,0] Output: 1解: 比较数组中的i和i-1的大小,如果前一位大于后一位数字,前一位则是结果 let ans = ...

  7. mysql5.7-windows安装配置

    sonar要求mysql5.6版本以上,所以安装一下最新的mysql5.7 采用相对名路径和命令行启动,这样是为了方便迁移.也提供了加入服务的指令,但没有进行测试 解压mysql的zip压缩包 解压后 ...

  8. gentoo wireshark 安装

    安装软件 emerge --ask net-analyzer/wireshark 把用户加入 wireshark 组. gpasswd -a $USER wireshark 如果不像重新登录就可以使用 ...

  9. python学习笔记_week17

    note jQuery http://jquery.cuishifeng.cn/ 模块 <=>类库 DOM/BOM/JavaScript的类库 版本: 1.x 1.12 2.x 3.x 转 ...

  10. ant 小结

    ant 的配置文件是xml 格式的. 其xml根元素是 project project元素下面有 property path env target filelist patternset 其中 tar ...