VS2019/MFC学习笔记之三(对话框控件随窗口大小同比例缩放) |
您所在的位置:网站首页 › cad如何调整窗口到适当大小的界面 › VS2019/MFC学习笔记之三(对话框控件随窗口大小同比例缩放) |
目录 一、禁止改变窗口大小 二、控件随窗口大小同比例缩放 三、设置窗口最大最小值 最近在做一个简易计算器的时候,发现窗口大小是可以随意拖动的,但是对话框内的控件并没有发现改变,这就会出现控件部分不动,加大了空白部分,影响美观,如下所示 于是通过查阅资料,找到了两种解决方案分别整理如下 一、禁止改变窗口大小在工程里找到.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 |