分享

MFC控件随窗口大小变化,多次缩放不改变位置

 猎狐肥 2019-11-15

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;

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多