MFC控件随窗口大小变化,多次缩放不影响位置
代码改自:https://blog.csdn.net/u013280734/article/details/51355035
void CMyCefTestDlg::OnSize(UINT nType, int cx, int cy)
{
CDialogEx::OnSize(nType, cx, cy);
// TODO: 在此处添加消息处理程序代码
//最小化判断
if (nType == 1)
{
return;
}
else
{
CRect rect;//获取当前窗口的大小
for (std::list<control*>::iterator it = m_con_list.begin(); it != m_con_list.end();it++)
{
CWnd* pWnd = GetDlgItem((*it)->Id);//获取ID为woc的空间的句柄
pWnd->GetWindowRect(&rect);
ScreenToClient(&rect);//将控件大小转换为在对话框中的区域坐标
rect.left = (*it)->scale[0] * cx;
rect.right = (*it)->scale[1] * cx;
rect.top = (*it)->scale[2] * cy;
rect.bottom = (*it)->scale[3] * cy;
pWnd->MoveWindow(rect);//设置控件大小
}
}
GetClientRect(&m_rect);//将变化后的对话框大小设为旧大小
return;
}
//在初始化里面调用下面这个函数
void CMyCefTestDlg::get_control_original_proportion()
{
HWND hwndChild = ::GetWindow(m_hWnd, GW_CHILD);
while (hwndChild)
{
CRect rect;//获取当前窗口的大小
control* tempcon = new control;
CWnd* pWnd = GetDlgItem(::GetDlgCtrlID(hwndChild));//获取ID为woc的空间的句柄
pWnd->GetWindowRect(&rect);
ScreenToClient(&rect);//将控件大小转换为在对话框中的区域坐标
tempcon->Id = ::GetDlgCtrlID(hwndChild);//获得控件的ID;
tempcon->scale[0] = (double)rect.left / m_rect.Width();//注意类型转换,不然保存成long型就直接为0了
tempcon->scale[1] = (double)rect.right / m_rect.Width();
tempcon->scale[2] = (double)rect.top / m_rect.Height();
tempcon->scale[3] = (double)rect.bottom / m_rect.Height();
m_con_list.push_back(tempcon);
hwndChild = ::GetWindow(hwndChild, GW_HWNDNEXT);
}
}
添加的两个成员
CRect m_rect;
std::list<control*> m_con_list;
结构体:
typedef struct Rect
{
public:
int Id;
double scale[4];
Rect()
{
Id = -2;
scale[0] = 0;
scale[1] = 0;
scale[2] = 0;
scale[3] = 0;
}
Rect(const Rect& c)
{
*this = c;
}
}control;
|