mfc里,基于对话框的窗口,具有最大最小化的属性设置。在Border属性里选择Resizing,然后在Maximize和Minimize中选择true。在窗体当中随便拖几个控件,然后运行,此时点击最大化会发现,整个窗体的大小是变大了,但是有效区域并不会改变大小,也就是控件的大小任然不变。那么如何调整对话框中的各个控件,随窗体的大小改变而改变呢?mfc里面有一个消息WM_SIZE,这个消息能响应窗体大小改变事件。具体如何操作?

选择类向导,搜索消息WM_SIZE,添加相应的事件处理函数void CMyDlg::OnSize(UINT nType, int cx, int cy),真正改变控件大小的函数并不是此函数,它还需要配合void CMyDlg::ChangeSize(CWnd *pWnd, int cx, int cy,bool tf) 才能进行处理。具体代码如下:

void CMyDlg::OnSize(UINT nType, int cx, int cy)
{CDialogEx::OnSize(nType, cx, cy);// TODO: 在此处添加消息处理程序代码if(nType==1) return;//最小化则什么都不做  // TODO: Add your message handler code here  CWnd *pWnd;    pWnd = GetDlgItem(IDC_STATIC_PLAYCTL);  ChangeSize(pWnd, cx, cy,false);
//  pWnd = GetDlgItem(IDC_STATIC);
//  ChangeSize(pWnd, cx, cy);  pWnd = GetDlgItem(IDC_BUTTON_LOAD);  ChangeSize(pWnd, cx, cy,false);  pWnd = GetDlgItem(IDC_BUTTON_PLAY);  ChangeSize(pWnd, cx, cy,false);  pWnd = GetDlgItem(IDC_BUTTON_STOP);  ChangeSize(pWnd, cx, cy,false);  pWnd = GetDlgItem(IDC_BUTTON_PLAY_FORWARD);  ChangeSize(pWnd, cx, cy,false);  pWnd = GetDlgItem(IDC_BUTTON_PLAY_BACKWARD);  ChangeSize(pWnd, cx, cy,false);   pWnd = GetDlgItem(IDC_STATIC_VOLUME_TEXT);  ChangeSize(pWnd, cx, cy,false);  pWnd = GetDlgItem(IDC_STATIC_FILENAME);  ChangeSize(pWnd, cx, cy,false);  pWnd = GetDlgItem(IDC_SLIDER_MEDIA);  ChangeSize(pWnd, cx, cy,false);  pWnd = GetDlgItem(IDC_SLIDER_VOLUME);  ChangeSize(pWnd, cx, cy,false);  pWnd=GetDlgItem(IDC_STATIC_VOLUME);ChangeSize(pWnd, cx, cy,false);  pWnd=GetDlgItem(IDC_STATIC_POSITION);ChangeSize(pWnd, cx, cy,false);pWnd=GetDlgItem(IDC_BUTTONftp);ChangeSize(pWnd, cx, cy,false);pWnd = GetDlgItem(IDC_STATIC_VIDEO);  ChangeSize(pWnd, cx, cy,true);  GetClientRect(&m_rect);// 将变化后的对话框大小设为旧大小}void CMyDlg::ChangeSize(CWnd *pWnd, int cx, int cy,bool tf)    //真正改变控件大小的函数,在onsize里边不断被调用
{  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);//设置控件大小  }  }

ok,在onsize函数里边,主要是这两句:pWnd = GetDlgItem(IDC_STATIC_PLAYCTL); ChangeSize(pWnd, cx, cy,false);,其中IDC_STATIC_PLAYCTL是我项目中的一个picture控件,利用GetDlgItem获取该控件的句柄,然后调用ChangeSize函数实现具体的调整。

ChangeSize函数里边的代码注释也很详细,我就不解释了。这样做以后,运行发现确实能实现想要的效果。无论是最大化还是你随意的伸缩窗体,各个控件均能很良好的实现相应的调整。但是我实验的时候,由于我写的是一个播放器,中间很大一块是一个Picture控件,下面是一些控制按钮。刚开始的时候,我没有太关心onsize函数里边每个控件被调用的顺序,此时我的Picture控件不是最后一个被调用,所以最大化的时候发现当Picture控件已经最大化后,位于它之后的一些按钮控件便会在原来的位置闪烁几下,才调整到最终的位置。于是我改变了调用的顺序,将picture控件最后调用,正如代码中的那样,于是没有出现刚才的现象了。

但是,这种方法有一个缺点,就是会闪屏。你想啊,每个控件调整自己的大小以适应新窗口的大小是有先后顺序和执行时间的。从最初的状态到最终的状态中,控件在不断变化位置,于是产生了闪屏。这是我自己的理解。好在影响不是特别大,所以更好的方法我就没有再接着找寻了。但肯定有更好的方法,如果控件太多,中间转换的时间还是很可观的。可能闪屏现象就会更严重一点。

拙见。小记。

对话框窗口最大最小化相关推荐

  1. Ubuntu 16.04 和 Ubuntu 18.04 启用 点击Launcher图标,窗口实现最小化 功能

    安装了Ubuntu之后,要是每次都点击最小化按钮来实现窗口的最小化,操作起来很不方便,那么怎样才能方便操作呢, Ubuntu 16.04 本身支持 点击应用程序Launcher图标实现最小化 功能,只 ...

  2. pyqt5 最小化 系统托盘_Qt中如何使窗口隐藏/最小化到托盘

    展开全部 功能62616964757a686964616fe78988e69d8331333361303733:窗口最小化后或者点击"hide"按钮将窗口隐藏到托盘. 通常最小化的 ...

  3. 【Win10小技巧1】窗口快速最小化

    窗口快速最小化 Win+↓ 快速最小化 功能:最小化当前窗口 Win+↑ 快速最大化 功能:恢复当前窗口 Win+D 切换到桌面(相当于全部窗口最小化) 功能:按一次回到桌面,再按一次显示会之前全部窗 ...

  4. Electron无边框窗口(最小化、最大化、关闭、拖动)以及动态改变窗口大小

    文章目录 一.目标原型 1. 目标 2. 原型设计 3. 原型初步实现 二.无边框窗口 1. 要点 2. 改造 三.可拖拽区 1. 要点 2. 改造 四.最小化.最大化.关闭 1. 要点 2. 改造 ...

  5. [乱说]Electron 无边框窗口最大化最小化关闭功能

    title: '[乱说]Electron 无边框窗口最大化最小化关闭功能' date: 2017-11-21 21:43:40 tags: Electron 无边框窗口最大化最小化关闭功能 目的 实现 ...

  6. Qt中如何使窗口隐藏/最小化到托盘

    Qt中如何实现自己的托盘功能,Qt自带的demo也很明了,这里我们就来实现自己的一个托盘... 功能:窗口最小化后或者点击"hide"按钮将窗口隐藏到托盘. 通常最小化的窗口会在任 ...

  7. Rhyme/ win10 窗口最大最小化,向左向右最大化快捷键

    win10 窗口最大最小化,向左向右最大化快捷键 快捷键 作用 wins+向上键 最大化窗口 wins+向上键 最小化窗口 wins+向左键 向左最大化窗口 wins+向右键 向右最大化窗口

  8. mac如何使用快捷键,使得窗口最大化/最小化(完)

    问题: mac如何使用快捷键,使得窗口最大化/最小化 回答: 同时按下:command + control + F

  9. win10 晃动一个窗口,显示桌面(所有窗口全部最小化)

    win10 晃动一个窗口,显示桌面(所有窗口全部最小化) win10这个功能是默认开启的,对于大多数人来说,平时基本用不到,而且很容易误操作,造成不好的体验. 把这个功能关闭的方法如下: 首先打开组策 ...

最新文章

  1. linux线程超过1024报错,Linux定位c++程序运行异常的经历《实操》
  2. POI导入大excel文件
  3. dlib 68个关键点 人脸姿态
  4. centos7 iptables 端口转发 保存_iptables 防火墙
  5. 期待flash三剑客
  6. 【软件测试】黑盒测试の正交试验法
  7. 【Python】mayavi小结
  8. 深入理解es module
  9. EMOS1.3安装后的相关安全设置
  10. 大学生慕课第二周学习笔记
  11. 【OpenCV】复制、切割出图像ROI区域
  12. jquery audio没有声音_Audio-technica 铁三角 ATH-DSR7BT 头戴式蓝牙无线耳机测评报告 [Soomal]...
  13. 20. 远程端口查看
  14. jep在java的SpringBoot中的使用
  15. 刷新了dns后无法访问到mysql_高效刷新DNS缓存 解决网页无法访问
  16. 二阶无源低通滤波器幅频特性曲线_二阶无源滤波器
  17. 解决win7 sp1专业版无法安装更新
  18. 只有迷信的人,没有迷信的知识
  19. EL表达式三目运算符
  20. GNU Autotools [一]

热门文章

  1. pygame里面物体闪烁运动_教师资格【试讲示范】高中物理试讲答辩——《自由落体运动》试讲稿答辩...
  2. 习题8_6与习题9_2
  3. android gdb 命令大全,ndk-gdb  |  Android NDK  |  Android Developers
  4. 【机器学习入门】(1) K近邻算法:原理、实例应用(红酒分类预测)附python完整代码及数据集
  5. win10 error LNK1112: 模块计算机类型“X86”与目标计算机类型“x64”冲突
  6. python字符串基本形式_python字符串常用方式
  7. 强大的矩阵奇异值分解(SVD)和特征值及其应用
  8. Node.js实现本地客户端上传单个或者多个文件Excel文件(xls格式、xlsx格式文件)到服务器端,并且解析对应的Excel内容反馈到请求报文中
  9. VSCode设置合并行快捷键
  10. Node.js(nodejs)对本地JSON文件进行增、删、改、查操作(轻车熟路)