MFC设置控件跟随窗口大小变化

前提

未保存控件比例多次拉伸窗口会导致控件不断向左上角偏移,直至消失。

解决方式

使用容器保存比例,每次窗口大小变化,使用窗口大小乘固定比例。

代码实现

1.添加WM_SIZE消息

窗口大小变化时,可添加代码对控件进行处理。
在这里插入图片描述

2.添加容器以及对话框大小变量

头文件引用:

#include <map>
#include <vector>
using std::map;
using std::vector;

头文件对话框添加成员变量:

class CXXXDlg : public CDialogEx
{
private:
	CRect m_rect;	
	map<int, vector<double>> tar;				//存储所有控件比例信息    key = 控件ID  value = 控件比例
	map<int, vector<double>>::iterator key;		//迭代器查找结果
	map<int, vector<double>>::iterator end;		//存储容器的最后一个元素
}
3.修改OnSize()函数

修改前原函数:

void CXXXDlg::OnSize(UINT nType, int cx, int cy)
{
	CDialogEx::OnSize(nType, cx, cy);

	// TODO: 在此处添加消息处理程序代码
}

修改后现函数:

void CXXXDlg::OnSize(UINT nType, int cx, int cy)
{
	CDialogEx::OnSize(nType, cx, cy);

	// TODO: 在此处添加消息处理程序代码
	CWnd* pWnd;
	int id = 0;
	HWND  hwndChild = ::GetWindow(m_hWnd, GW_CHILD);
	if (!cx || !cy)
	{
		return;
	}
	else
	{
		while (hwndChild)
		{
			id = ::GetDlgCtrlID(hwndChild);//获得控件的ID
			pWnd = GetDlgItem(id); //获取ID为woc的空间的句柄			
			if (pWnd)
			{
				CRect rect;
				//获取当前控件大小
				pWnd->GetWindowRect(&rect);
				//将控件大小转换为在对话框中的区域坐标
				ScreenToClient(&rect);
				key = tar.find(id);
				end = tar.end();
				if (key == end)
				{
					vector<double> scale;
					scale.push_back((double)rect.left / m_rect.Width());//注意类型转换,不然保存成long型就直接为0了
					scale.push_back((double)rect.right / m_rect.Width());
					scale.push_back((double)rect.top / m_rect.Height());
					scale.push_back((double)rect.bottom / m_rect.Height());
					tar[id] = scale;
				}

				rect.left = tar[id][0] * cx;
				rect.right = tar[id][1] * cx;
				rect.top = tar[id][2] * cy;
				rect.bottom = tar[id][3] * cy;
				//设置控件大小
				pWnd->MoveWindow(rect);
			}
			hwndChild = ::GetWindow(hwndChild, GW_HWNDNEXT);
		}
		//将变化后的对话框大小设为旧大小
		GetClientRect(&m_rect);
	}
}
4.结果对比

原始图:
在这里插入图片描述
拉伸图:
在这里插入图片描述

  • 5
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
MFC是一个使用C++编写的微软基础类库,用于开发Windows应用程序。在MFC中,设置窗口和控件的大小自适应也是非常简单的。 首先,我们可以使用Visual Studio自带的可视化设计工具,在设计窗口和控件时,将控件的Anchor属性设置为合适的值。Anchor属性可以在属性窗口中找到,它用于指定控件与窗口的哪些边框保持相对位置不变,哪些可以拉伸变化。 如果不使用可视化设计工具,可以在窗口初始化时通过代码设置控件的位置和大小,同时利用MFC提供的SizeToContent函数,设置窗口的尺寸自适应控件的大小。以下是一段示例代码: ``` BOOL CMyDlg::OnInitDialog() { … m_btnOK.SetWindowPos(NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED); SizeToContent(); … } void CMyDlg::SizeToContent() { CRect rectClient, rectWindow; GetClientRect(&rectClient); GetWindowRect(&rectWindow); int nWidthDiff = rectWindow.Width() - rectClient.Width(); int nHeightDiff = rectWindow.Height() - rectClient.Height(); CRect rectNewWindow; rectNewWindow.left = rectWindow.left; rectNewWindow.top = rectWindow.top; rectNewWindow.right = rectNewWindow.left + m_btnOK.GetWindowRect().Width() + nWidthDiff; rectNewWindow.bottom = rectNewWindow.top + m_btnOK.GetWindowRect().Height() + nHeightDiff; SetWindowPos(NULL, 0, 0, rectNewWindow.Width(), rectNewWindow.Height(), SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE); } ``` 以上就是利用MFC设置窗口控件大小自适应的方法,具体实现可以根据实际情况进行相应的调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值