一。大小和位置都改变

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. DB通用类:MySQL通用类

    Mysql类为网络上收集的,没有测试过.. using System; using System.Collections; using System.Collections.Generic; usin ...

  2. pthread线程特定数据

    举个栗子 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/t ...

  3. JavaEE进阶——全文检索之Solr7.4服务器

    I. Solr Solr简介 Solr是Apache的顶级开源项目,使用java开发 ,基于Lucene的全文检索服务器. Solr比Lucene提供了更多的查询语句,而且它可扩展.可配置,同时它对L ...

  4. Java8之分组

    数据库中根据多个条件进行分组 ) from tableA group by a, b 现在不使用sql,而直接使用java编写分组,则通过Java8根据多个条件进行分组代码如下: List<Us ...

  5. 如何使用IntelliJ集成nodejs进行接口测试<response demo>

    1.相关的配置及安装,在如下地址进行参考,这位大师写得也挺好(mac和windows都可以下载) https://www.jianshu.com/p/dd2d2d0ff133 2.在集成nodejs的 ...

  6. C# ORM修改实体层

    实体层:[数据库中是么以偶Contents2这个字段的],之所以在实体层添加一个Contents2,是因为: 所以在添加之后: 返回json形式,就用Contents,后台添加就用Contents2. ...

  7. Java实现图像对比类

    package com.function; import java.awt.image.BufferedImage; import java.io.BufferedWriter; import jav ...

  8. mybatis一(常用配置信息和获取插入后id)

    <!--配置文件--><?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE conf ...

  9. LabelFunction 允许在显示数据以前进行处理

    <?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="ht ...

  10. VS2017创建一个 ASP.NET Core2.0 应用,并搭建 MVC 框架

    https://testerhome.com/topics/11747 1.使用最新版本的VS2017,并安装.NET Core2.0中相关开发工具   2.打开VS2017,点击文件-新建-项目,选 ...