对话框的大小变化后,假若对话框上的控件大小不变化,看起来会比较难看。下面就介绍怎么让对话框上的控件随着对话框的大小的变化自动调整。

首先明确的是Windows有一个WM_SIZE消息响应函数,这个函数在对话框大小发生变化的时候调用,所以我们可以记录下原来对话框的大小,还有当前对话框的大小(这个不用自己算,系统已给出),然后根据控件做出相应比例的调整。

比如原来对话框大小为a,现在为b,原来控件大小为c,那么现在的控件大小应该为c*b/a;(注意a不能为0)。

看实例:(黑体字为添加的代码!!)

假设对话框类为CMyDlg类,那么首先设置一个变量

CRect  m_rect;   //用于保存原对话框大小

那么在对话框创建的时候先获得对话框的大小

BOOL CMyDlg::OnInitDialog()
{

.........................
         SetIcon(m_hIcon, TRUE);   // Set big icon
         SetIcon(m_hIcon, FALSE);  // Set small icon
         // TODO: Add extra initialization here
         GetClientRect(&m_rect);  //获取对话框的大小

return TRUE;  // return TRUE  unless you set the focus to a control
}
然后再手动添加一个函数,用以实现具体的变化

void CMyDlg::ChangeSize(UINT nID, int x, int y)  //nID为控件ID,x,y分别为对话框的当前长和宽
{
       CWnd *pWnd;
       pWnd=GetDlgItem(nID); 
       if(pWnd!=NULL)     //判断是否为空,因为在窗口创建的时候也会调用OnSize函数,但是此时各个控件还没有创建,Pwnd为空
       {
               CRect rec; 
               pWnd->GetWindowRect(&rec);  //获取控件变化前的大小
               ScreenToClient(&rec);   //将控件大小装换位在对话框中的区域坐标
               rec.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);   //伸缩控件
      }
}

最后添加windows消息响应函数OnSize:

void CMyDlg::OnSize(UINT nType, int cx, int cy)  //cx,cy就是当前对话框的长和宽
{
            CDialog::OnSize(nType, cx, cy);
 
            // TODO: Add your message handler code here
            if(nType!=SIZE_MINIMIZED )  //判断窗口是不是最小化了,因为窗口最小化之后 ,窗口的长和宽会变成0,当前一次变化的时就会出现除以0的错误操作
          {
                  ChangeSize(IDC_LIST1,cx,cy);  //对每一个控件依次做调整
                  ChangeSize(IDC_LIST2,cx,cy);
                  ChangeSize(IDC_BUTTON1,cx,cy); 
                  ChangeSize(IDC_BUTTON2,cx,cy); 
                  GetClientRect(&m_rect);   //最后要更新对话框的大小,当做下一次变化的旧坐标;
         }

}

任务完成!

MFC窗体大小变化的更多相关文章

  1. winfrom 中 label 文字随着窗体大小变化

    在进行winfrom 开发过程中,窗体中的文字需要随着窗体大小变化,否则会影响窗体的美观和客户的体验. 之前曾经试过几种方法效果都不满意,例如将label的Dock 属性设置为fill.这样的设置对解 ...

  2. MFC 无边框窗体实现用鼠标拖动窗体边缘实现窗体大小变化

    无边框窗体如何实现用鼠标拖动窗体边缘实现窗体大小变动呢?下面介绍一种方法,通过以下几个步骤即可实现: 1.实现WM_NCHITTEST消息,实现四条边框的模拟 2.实现WM_NCLBUTTONDOWN ...

  3. winform 窗体大小变化时,如何设置使控件一起按照比例变大

    public Form() { InitializeComponent(); + ; float[] factor = new float[count]; ; factor[i++] = Size.W ...

  4. C#设置窗体中的窗体随主窗体大小变化而变化

    form2 f=new form2(); f.Size=this.Size; f.Location=this.Location; f.showdialog(); 作者:耑新新,发布于  博客园 转载请 ...

  5. C#控件大小随窗体大小等比例变化

    相信很多博友在开发初次接触学习C# winForm时,当窗体大小变化时,窗体内的控件并没有随着窗体的变化而变化,最近因为一个项目工程的原因,也需要解决这个问题.通过查阅和学习,这个问题得到了解决,或许 ...

  6. WinForm中控件位置不随窗体大小的变化而改变

    背景:在窗体开发中使控件的位置不随窗体的大小改变而变化的问题?这是一个同事在开发时遇到的问题,在思考试错之后,写出如下代码. 声明成员: Point m_InitLocation; Size m_In ...

  7. C:\\MFC控件大小随窗体大小而改变

    一.大小和位置都改变 1.首先为窗体类添加CRect m_rect,该成员变量用来记录窗体的当前大小. 2.在类向导里面(Ctrl+W),为窗体添加消息WM_SIZE的响应函数OnSize(): 注意 ...

  8. WPF实现无边框窗体拖拽右下角▲ 改变窗体大小【framwork4.0】 谢谢大家关注

    效果图:(右下角拖拽改变窗体大小) 第一步:添加xaml代码: <Border Name="ResizeBottomRight" MouseMove="Resize ...

  9. Pyqt 以OOP方式动画的效果改变自身窗体大小

    代码: # -*- coding:utf8 -*- from PyQt4.QtGui import * from PyQt4.QtCore import * import sys class ani( ...

随机推荐

  1. SEO 搜索引擎优化培训01

    百度搜索风云榜:http://top.baidu.com/boards 页面上的因素:对搜索引擎而言

  2. 在不同的系统中的virtualbox中安装Ubuntu SDK

    对非常多的开发人员来说.你们可能使用的不是Ubuntu操作系统.在这样的情况下,开发人员须要在自己的操作系统中(OS X及Windows)安装virtualbox,并在VirtualBox中安装Ubu ...

  3. [办公应用]如何设置IE打印时的默认页边距,并设置纸张为横向(会计票据打印)

    最近一个做会计的同事询问,如何将IE打印时的默认页边距更改,并且每次都要是横向的纸张. 这是因为她已经测试好纸张的大小,并据此调整好了页边距.可惜的是下一次打印时,又要重新调整一遍. 经过研究,方法如 ...

  4. POJ1389 Area of Simple Polygons 线段树

    POJ1389 给定n个整数点矩形,求面积并. 显然ans必然是整数. 记录若干个事件,每个矩形的左边的竖边记为开始,右边的竖边记为结束. 进行坐标离散化后用线段树维护每个竖的区间, 就可以快速积分了 ...

  5. mysql status关键字 数据表设计中慎重使用

    mysql status关键字  数据表设计中慎重使用

  6. J20180116

    用度 总务 用度係 总务科(管理办公用品等) 型紙 设计图 プラント 工厂

  7. bzoj 1724: [Usaco2006 Nov]Fence Repair 切割木板【堆】

    如果反着看,看成合并木板,就和合并果子一样了,把若干块放进一个小根堆,然后每次取出两个合并,把合并结果加进答案和堆里 代码里小根堆用优先队列实现(懒 #include<iostream> ...

  8. ngCordova插件说明

    转载自 http://my.oschina.net/u/1416844/blog/495026 参 考http://blog.csdn.net/superjunjin/article/details/ ...

  9. Golang 入门 : 竞争条件

    笔者在前文<Golang 入门 : 理解并发与并行>和<Golang 入门 : goroutine(协程)>中介绍了 Golang 对并发的原生支持以及 goroutine 的 ...

  10. vim 跳行查看日志

    VIM 跳跃行号 一.显示行号 在命令模式下输入 :set nu   或者   :set number 即可显示行号 二.跳跃行号 在编辑模式下输入 ngg 或者 nG [n为指定的行数(如25)] ...