转载:https://blog.csdn.net/zhoxier/article/details/7776128

一个基于对话框的MFC界面,怎么样才能让对话框里的控件能和对话框同比例变小变大?今天我一直想解决这个问题,这是师姐留给我的任务。经过在网上的大量搜素,终于找到了解决方法,其实比较简单。

一般情况下,我们新建的对话框,里面的“确定”和:取消”按钮,在对话框最大化得时候,不会一起变大的,而是保持原来的大小。

最简单的情况:

当我们点击最大化按钮的时候,对话框会最大化,但是控件“确定”和“取消”不会跟着变大。如果我们在对话框上面有多少控件,那么会很丑,而且很不实用,最大化本来就是想看的更清楚嘛。

我们可以采取下面的措施:对话框也是窗口,最大化是对窗口大小的改变,而在windows messagehandle中有个WM_SIZE的消息,该消息在窗口大小发生变化的时候会产生。那么我们可以根据这个消息,在窗口大小发生变化的时候,利用MoveWindow()函数来重新设置各个控件的大小。

还是以上面最简单的情况为例子:

1  首先要知道对话框大小是否改变,改变了多少,我们应该记录当前对话框的大小。

在对话框类中添加成员变量 CRect m_rect  他是用来记录当前对话框的大小。我们在OnInitDialog()函数中获取对话框创建时的大小:GetClientRect(&m_rect);

2 增加消息WM_SIZE的消息响应函数 OnSize():只要对话框大小发生变化,就会调用该函数。

3 在OnSize()函数中增加如下代码:(最简单的为例子,就一个确定按钮和取消按钮)

来源:(http://blog.sina.com.cn/s/blog_4b5039210100dzkd.html)- MFC:如何让对话框中的控件和对话框一起变小变大_萧萧_新浪博客

voidCTestDlg::OnSize(UINT nType, int cx, int cy)
{
 CDialog::OnSize(nType, cx, cy);
 
 // TODO: Add your message handler code here
  for (int i=1;i<=2;i++)     //因为是两个控件,所以这里用了循环
  {

CWnd*pWnd; 
  pWnd = GetDlgItem(i);     //获取ID为i的空间的句柄,因为“确认”ID为1,“取消”ID为2
 if(pWnd)  //判断是否为空,因为对话框创建时会调用此函数,而当时控件还未创建

{
   CRect rect;   //获取控件变化前的大小

pWnd->GetWindowRect(&rect);
   ScreenToClient(&rect//将控件大小转换为在对话框中的区域坐标
  //cx/m_rect.Width()为对话框在横向的变化比例

rect.left=rect.left*cx/m_rect.Width();//调整控件大小
   rect.right=rect.right*cx/m_rect.Width();
   rect.top=rect.top*cy/m_rect.Height();
   rect.bottom=rect.bottom*cy/m_rect.Height();
   pWnd->MoveWindow(rect);//设置控件大小
  }

}
  GetClientRect(&m_rect);// 将变化后的对话框大小设为旧大小

}

然后运行,当对话框最大化的时候,两个按钮也变大了。

(因为全屏图太大,我只截取了右上角的部分)

PS:其实这种方法实现起来简单,但是是存在问题的,如果界面有很多控件,那个当你拖拽窗口的角的时候,经过几次变大变小,你会发现其实里面的控件已经失真了,就不是原来的长宽比例了。那么要实现不管窗口怎么变,里面的控件不但大小跟着变,而且大小比例也跟着变,那就不是这个OnSize函数那么简单了,实现起来有点复杂。等我掌握了这个复杂的方法,一定会拿来分享的。

mfc 控件大小随窗体改变而改变

  如果对话框或视类的大小调后,控件的大小和位置没有变化,界面看起来会很不爽.

  控件是从CWnd派生的,但不能使用SetWindowPos()或OnSize()或OnSizing()来改变其大小,应在父窗口的WM_SIZE消息中使用MoveWindow()来进行调整。

  VC++之根据对话框大小调整控件大小

  1、在对话框类中加入成员变量CRect m_rect;用于保存对话框大小变化前的大小;

  2、在对话框的OnInitDialog()函数中获取对话框创建时的大小:

  GetClientRect(&m_rect);

  3、在WM_SIZE的响应函数OnSize()中加入以下代码:

  CWnd *pWnd;

  pWnd = GetDlgItem(IDC_LIST);   //获取控件句柄

  if(pWnd)//判断是否为空,因为对话框创建时会调用此函数,而当时控件还未创建

  {
  CRect rect;  //获取控件变化前大小
  pWnd->GetWindowRect(&rect);
  ScreenToClient(&rect);//将控件大小转换为在对话框中的区域坐标
  // cx/m_rect.Width()为对话框在横向的变化比例
  rect.left=rect.left*cx/m_rect.Width();/调整控件大小
  rect.right=rect.right*cx/m_rect.Width();
  rect.top=rect.top*cy/m_rect.Height();
  rect.bottom=rect.bottom*cy/m_rect.Height();
  pWnd->MoveWindow(rect);//设置控件大小
  }
  GetClientRect(&m_rect);//将变化后的对话框大小设为旧大小

如果是里面只有一两个控件倒好办,但控件太多的话这样做是不是重复劳动太多了?
有没有更好的办法啊?

视类中加成员函数和成员变量:
        void   SetControlInfo(WORD   CtrlId);
protected:
        int   m_old_cx,m_old_cy;
        CDWordArray   m_control_info;
 
构造函数中初始化:
        m_old_cx   =   m_old_cy   =  0;
 
加控件信息的函数定义:
void   CTestFormView::SetControlInfo(WORD   CtrlId)
{
        m_control_info.Add(CtrlId);
 
}

修改OnSize函数:
void   CTestFormView::OnSize(UINT   nType,   int   cx,  int   cy)
{
        if(cx==0   ||   cy==0)
        {
                cx=800;
                cy=600;
        }
        CFormView::OnSize(nType,   cx,   cy);
        float   dx_percent   =   (m_old_cx  ==0)?   1   :   (float)((float)cx/(float)m_old_cx);
        float   dy_percent   =   (m_old_cy  ==0)?   1   :     (float)((float)cy/(float)m_old_cy);
 
        if(m_old_cx)
        {
                CRect   WndRect;
                CWnd   *pWnd;
                for(int   i  =   0;   i   <   m_control_info.GetSize();   i++)
                {
                       pWnd   =   GetDlgItem(m_control_info[i]);
                       if(!pWnd)
                       {
                               TRACE( “Control   ID   -  %d   NOT   FOUND!!\n “,m_control_info[i]);

continue;
                       }
 
                       pWnd-> GetWindowRect(&WndRect);
                       ScreenToClient(&WndRect);
 
                       WndRect.left   =   (int)(WndRect.left*dx_percent);
                       WndRect.right   =   (int)(WndRect.right*   dx_percent);
                       WndRect.bottom   =   (int)(WndRect.bottom*dy_percent);
                       WndRect.top   =   (int)(WndRect.top*dy_percent);
 
                       pWnd-> MoveWindow(&WndRect);
                }
 
        }
        m_old_cx   =   cx;
        m_old_cy   =   cy;
}
 
在OnInitialUpdate函数中加入控件ID:
        SetControlInfo(IDC_BUTTON1);
            。。。。。。。。。。。。。。。。

运行,搞定!
Dialog也一样!

上面是转载的内容,补充一些,就是,当在运行上面的程序后,当dlg为仅剩下标题栏时,再放大,就不会显示内部的控件,那么自己设置了窗体的最小值:

void CDataBaseConfigDlg::OnGetMinMaxInfo(MINMAXINFO* lpMMI)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if(lpMMI->ptMinTrackSize.x <= 800)
lpMMI->ptMinTrackSize.x = 800;
if(lpMMI->ptMinTrackSize.y <= 500)
lpMMI->ptMinTrackSize.y = 500;
CDialogEx::OnGetMinMaxInfo(lpMMI);
}

方法也是在网上看到的!

MFC 控件大小随窗体改变而改变大小-OnSize相关推荐

  1. VC/MFC 控件置顶 窗体内控件置顶

    窗体内指定某个控件置顶,使用SetWindowPos函数.但不能这样用    ::SetWindowPos(m_hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOS ...

  2. 如何改变Static Text控件中文字的字体,字体大小及颜色。

    最近做一项目需要改变Static text 中文字的字体大小及颜色,MFC中默认的没有这一功能,没法实现,要实现它怎么办呢?其实很简单: 1:需要在OnCreate()事件中创建你所需的字体,然后和所 ...

  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控件使用说明书

    VC++控件工具箱: 2 按钮(Button):用来接收用户的命令,应用程序在接收到用户命令后,通常需要进行一些后台工作.按钮可以响应单击或双击动作,在按钮接收到鼠标动作后,向其父窗口发送相应的控件通 ...

  5. 控件-Win Forms窗体控件

    在项目开发中,界面设计是一个很重要的方面.好的界面应该使操作者容易掌握.赏心悦目,把操作看作是一种享受而不是负担.Visual C#.Net提供了丰富的控件,大大简化了界面设计过程. 在桌面应用程序中 ...

  6. MFC控件——ListCtrl控件[翻译](续)

    四.实践学习:一个ListCtrl的详细实现 1.切换到第一个对话框点击ListCtrl控件 2.在属性窗口,改变View属性为Report 3.创建ListCtrl的列,在OnInitDialog( ...

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

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

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

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

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

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

  10. C#仿QQ皮肤-常用用户控件EnterFrom1和窗体EntryForm的实现

    导读部分 ----------------------------------------------------------------------------------------------- ...

最新文章

  1. python 打开网页、封装自己的浏览器、制作浏览器、打开麦克风和摄像头、忽略ssl证书错误、置顶、无边框
  2. WCF学习之旅—基于Fault Contract 的异常处理(十八)
  3. Protobuf生成Java代码(命令行)
  4. Reactive(1) 从响应式编程到好莱坞
  5. java线程wait_Java 并发编程:线程间的协作(wait/notify/sleep/yield/join)
  6. 微分方程传染病模型之指数模型-SI模型-SIS模型-SIR模型
  7. 一个简单的鼠标钩子程序
  8. Git error : bad signature 0x00000000 fatal: index file corrupt
  9. PostgreSQL获得去、今、明年份、今年的第一天、去年的第一天转换时区、最后一天等
  10. 三大功能护航,Amazfit跃我 PowerBuds Pro正式发售
  11. 论文检测的时间段是什么时候?
  12. three.js光效扫描
  13. LXD共享方案(续)
  14. 啥都不会只能瞎暴力——剪子-包袱-锤
  15. 关于AIR724模组HTTP POST一些记录
  16. java计算机毕业设计苗木购销系统源码+数据库+系统+lw文档+mybatis+运行部署
  17. 英国帝国理工本科计算机面试,干货|帝国理工面试攻略大解锁
  18. spring boot 入门指导
  19. VB计算两个日期/时间之间的差(DateDiff函数)
  20. 关于c语言的打卡机思路与代码

热门文章

  1. Xenu检测网站死链
  2. Win8快速开关机的奥妙:假关机还是真休眠?
  3. C++实现龙贝格求积分算法
  4. 电脑ie怎么设置html5,电脑中IE浏览器工具栏设置选项显示的是英文如何改成中文...
  5. 树莓派搭建http服务器实现网页监控摄像头
  6. python文字游戏攻防_一个简单的孙悟空斗牛魔王的文字游戏
  7. 手游本地化不得不看的10条规则
  8. python web游戏实例_Python实现小黑屋游戏的完整实例
  9. Shopee虾皮怎么发货?虾皮物流
  10. 一个程序员的心路历程