当前位置: 首页 > news >正文

MFC窗口大小最大化最小化随拖动调整大小

通常我们的MFC窗口默认是没有可以选择的最大化和最小化,开发用户可以选择支持最大化,最小化属性功能.

选择需要支持的对话框属性,开启Title Bar功能,开启System Menu ,Maximize Box ,Minimize box功能,这样我们的主界面就可以支持最大化,最小化,同时Border属性设置为Resizing模式,可以拖动改变大小.

在这里插入图片描述
定义一个类对象变量
CList<CRect, CRect&> m_listRect;
CRect m_DlgRect;
int m_buttonID;
BOOL m_iniFinish;
在CPP中现实累的初始化,获取子窗口区域.

CRect rect;
m_listRect.RemoveAll();
GetWindowRect(&rect);
m_listRect.AddTail(rect);//对话框的区域  CWnd* pWnd = GetWindow(GW_CHILD);//获取子窗体  
while (pWnd)
{pWnd->GetWindowRect(rect);//子窗体的区域  m_listRect.AddTail(rect);           //CList<CRect,CRect> m_listRect成员变量  pWnd = pWnd->GetNextWindow();//取下一个子窗体  
}
//重绘上次保存的窗口数据
MoveWindow(m_DlgRect.left,m_DlgRect.top,m_DlgRect.Width(),m_DlgRect.Height(),TRUE);m_wndIninFished=TRUE;

重载两个消息函数
ON_WM_SIZE()
ON_WM_GETMINMAXINFO()
///重载消息函数
void CXXXX::OnSize(UINT nType, int cx, int cy)
{
CDialog:OnSize(nType, cx, cy);

 ChangeAllWnd();

}

void CXXXX::OnGetMinMaxInfo(MINMAXINFO* lpMMI)
{
// TODO: Add your message handler code here and/or call default
if (lpMMI->ptMinTrackSize.x <= 1024)
lpMMI->ptMinTrackSize.x = 1024;
if (lpMMI->ptMinTrackSize.y <= 768)
lpMMI->ptMinTrackSize.y = 748;

int cx = GetSystemMetrics(SM_CXFULLSCREEN);
int cy = GetSystemMetrics(SM_CYFULLSCREEN);/*窗口最大值*/
if (lpMMI->ptMaxTrackSize.x >= cx)lpMMI->ptMaxTrackSize.x = cx-2;
if (lpMMI->ptMaxTrackSize.y >= cy)lpMMI->ptMaxTrackSize.y = cy-2;CDialog::OnGetMinMaxInfo(lpMMI);

}
用来盖改变窗体大小,并记录窗口信息,退出时候保存,下次加载时候自动恢复上次保存的窗口大小.
void CXXXX::SaveMainWindow()
{
GetClientRect(&m_DlgRect); //save size of dialog
int t,b,l,r;
t= m_DlgRect.top;
b=m_DlgRect.bottom;
l=m_DlgRect.left;
r=m_DlgRect.right;

::IniWriteInt(_T(“MainWnd”), _T(“Top”), t, GetAbsolutePathName(CFG));
::IniWriteInt(_T(“MainWnd”), _T(“Bottom”), b, GetAbsolutePathName(CFG));
::IniWriteInt(_T(“MainWnd”), _T(“Left”), l, GetAbsolutePathName(CFG));
::IniWriteInt(_T(“MainWnd”), _T(“Right”), r, GetAbsolutePathName(CFG));

}
void CXXXXDlg::LoadMainWindow()
{
int t=0;
int b=0;
int l=0;
int r=0;
t=::IniReadInt(_T(“MainWnd”),_T(“Top”),2,GetAbsolutePathName(CFG));
b=::IniReadInt(_T(“MainWnd”),_T(“Bottom”),2,GetAbsolutePathName(CFG));
l=::IniReadInt(_T(“MainWnd”),_T(“Left”),1024,GetAbsolutePathName(CFG));
r=::IniReadInt(_T(“MainWnd”),_T(“Right”),768,GetAbsolutePathName(CFG));
m_DlgRect.top=t;
m_DlgRect.bottom=b;
m_DlgRect.left=l;
m_DlgRect.right=r;
}

//窗口动态调整
void CXXXXDlg::ChangeAllWnd()
{
CWnd* pWnd = GetWindow(GW_CHILD);
// TODO: Add your message handler code here
if (m_listRect.GetCount() > 0)
{
CRect dlgNow;
GetWindowRect(&dlgNow);
POSITION pos = m_listRect.GetHeadPosition();//第一个保存的是对话框的Rect
if (pos==NULL)
{
return;
}

	CRect dlgSaved;dlgSaved = m_listRect.GetNext(pos);ScreenToClient(dlgNow);float x = dlgNow.Width() * 1.0 / dlgSaved.Width();//根据当前和之前保存的对话框的宽高求比例  float y = dlgNow.Height() * 1.0 / dlgSaved.Height();ClientToScreen(dlgNow);CRect childSaved;while (pWnd){	if (pos!=NULL){childSaved = m_listRect.GetNext(pos);//依次获取子窗体的Rect  childSaved.left = dlgNow.left + (childSaved.left - dlgSaved.left) * x;//根据比例调整控件上下左右距离对话框的距离  childSaved.right = dlgNow.right + (childSaved.right - dlgSaved.right) * x;childSaved.top = dlgNow.top + (childSaved.top - dlgSaved.top) * y;childSaved.bottom = dlgNow.bottom + (childSaved.bottom - dlgSaved.bottom) * y;ScreenToClient(childSaved);pWnd->MoveWindow(childSaved,1);pWnd = pWnd->GetNextWindow();}else{break;}}
}
GetClientRect(&m_DlgRect); //save size of dialog
Invalidate(TRUE);

}
这样我们的对话框就可以自动随着拖动大小,自动缩放变化,再也不用担心窗口拖动变化显示不全的情况.

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Golang | Leetcode Golang题解之第283题移动零
  • 【Go系列】Go的UI框架Fyne
  • SQL Server中非结构化数据的存储神器:文件表的魔力
  • 21 B端产品经理之技术常识(1)
  • Python | Leetcode Python题解之第284题窥视迭代器
  • Alternating Sum
  • web基础,http协议,apache概念及nginx
  • C#小结:string、double、TimeSpan等常见类型的小结和坑点
  • mysql的存储过程:
  • go操作aws s3
  • RemakePython
  • 24年第三届钉钉杯大学生大数据挑战赛
  • PySide(PyQt)使用QPropertyAnimation制作动态界面
  • html实现酷炫美观的可视化大屏(十种风格示例,附源码)
  • 【JS】前端文件读取FileReader操作总结
  • [NodeJS] 关于Buffer
  • 《剑指offer》分解让复杂问题更简单
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 【刷算法】求1+2+3+...+n
  • 230. Kth Smallest Element in a BST
  • AWS实战 - 利用IAM对S3做访问控制
  • CentOS7 安装JDK
  • If…else
  • Java到底能干嘛?
  • linux安装openssl、swoole等扩展的具体步骤
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • Vim Clutch | 面向脚踏板编程……
  • vue 配置sass、scss全局变量
  • 阿里云前端周刊 - 第 26 期
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 浮动相关
  • 关于 Cirru Editor 存储格式
  • 基于 Babel 的 npm 包最小化设置
  • ------- 计算机网络基础
  • 前端面试题总结
  • 网络应用优化——时延与带宽
  • 携程小程序初体验
  • 关于Android全面屏虚拟导航栏的适配总结
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • ${ }的特别功能
  • (3)选择元素——(17)练习(Exercises)
  • (BAT向)Java岗常问高频面试汇总:MyBatis 微服务 Spring 分布式 MySQL等(1)
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (SpringBoot)第七章:SpringBoot日志文件
  • (STM32笔记)九、RCC时钟树与时钟 第二部分
  • (vue)el-tabs选中最后一项后更新数据后无法展开
  • (多级缓存)缓存同步
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (一)UDP基本编程步骤
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅