VS2019/MFC学习笔记之三(对话框控件随窗口大小同比例缩放)

您所在的位置:网站首页 cad如何调整窗口到适当大小的界面 VS2019/MFC学习笔记之三(对话框控件随窗口大小同比例缩放)

VS2019/MFC学习笔记之三(对话框控件随窗口大小同比例缩放)

2023-11-17 14:08| 来源: 网络整理| 查看: 265

目录

一、禁止改变窗口大小

二、控件随窗口大小同比例缩放

三、设置窗口最大最小值

最近在做一个简易计算器的时候,发现窗口大小是可以随意拖动的,但是对话框内的控件并没有发现改变,这就会出现控件部分不动,加大了空白部分,影响美观,如下所示

 于是通过查阅资料,找到了两种解决方案分别整理如下

一、禁止改变窗口大小

在工程里找到.rc文件,以文本的形式打开,找到STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU

IDD_COUNT_DEMO_DIALOG DIALOGEX 0, 0, 320, 200 /*窗口尺寸*/ STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU

并替换成STYLE DS_SETFONT | DS_FIXEDSYS | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU & (~WS_THICKFRAME)

IDD_COUNT_DEMO_DIALOG DIALOGEX 0, 0, 201, 230/*修改数值,调整为一个合适的尺寸*/ STYLE DS_SETFONT | DS_FIXEDSYS | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU & (~WS_THICKFRAME)

实现效果:

此时把鼠标放置边框不会出现双向箭头。 

注:用完此方法后,切记不可在工程里的Dialog文件中拖动尺寸,否则上述改动会失效;  

二、控件随窗口大小同比例缩放

改变窗口大小,会响应WM SIZING——OnSizing(),WM GETMINMAXINFO——OnGetMinMaxInfo(),WM SIZI——OnSize()三个消息函数;

如何添加消息函数:

在对话框属性中点击消息图标,会弹出所有的WM消息;

找到对应的消息,右边选择 OnSize即可;

 具体实现:

1、在*Dlg.h文件中添加CList m_listRect;

2、在OnInitDialog()添加以下代码,记录默认窗口和控件大小

CRect rect; GetWindowRect(&rect); m_listRect.AddTail(rect);//对话框的区域 CWnd* pWnd = GetWindow(GW_CHILD);//获取子窗体 while (pWnd) { pWnd->GetWindowRect(rect);//子窗体的区域 m_listRect.AddTail(rect); //CList m_listRect成员变量 pWnd = pWnd->GetNextWindow();//取下一个子窗体 }

3、添加消息函数OnSizing(),并在函数内添加以下代码,用于调整控件大小;

void CcounterDlg::OnSizing(UINT fwSide, LPRECT pRect) { CDialogEx::OnSizing(fwSide, pRect); if (m_listRect.GetCount() > 0) { CRect dlgNow; GetWindowRect(&dlgNow); POSITION pos = m_listRect.GetHeadPosition();//第一个保存的是对话框的Rect 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; CWnd* pWnd = GetWindow(GW_CHILD); while (pWnd) { 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); pWnd = pWnd->GetNextWindow(); } } return; // TODO: 在此处添加消息处理程序代码 }

至此控件就可以随着窗口大小的改变而改变了。

实现效果:

 三、设置窗口最大最小值

为了不让窗口拉到最小,以至于看不到控件,我们可以设置一个窗口的最小值;

添加OnGetMinMaxInfo()消息函数,该函数用于限制窗口大小;

void CcounterDlg::OnGetMinMaxInfo(MINMAXINFO* lpMMI) { // TODO: 在此添加消息处理程序代码和/或调用默认值 /*窗口最小值*/ if (lpMMI->ptMinTrackSize.x ptMinTrackSize.x = 400; if (lpMMI->ptMinTrackSize.y ptMinTrackSize.y = 500; /*窗口最大值*/ if (lpMMI->ptMaxTrackSize.x >= 800) lpMMI->ptMaxTrackSize.x = 800; if (lpMMI->ptMaxTrackSize.y >= 900) lpMMI->ptMaxTrackSize.y = 900; CDialogEx::OnGetMinMaxInfo(lpMMI); }

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3