前提
未保存控件比例多次拉伸窗口会导致控件不断向左上角偏移,直至消失。
解决方式
使用容器保存比例,每次窗口大小变化,使用窗口大小乘固定比例。
代码实现
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.结果对比
原始图:
拉伸图: