主窗口大小发生变化(最大化、向下还原、手工手动)时,FormView中的控件等比例缩放
原理:记录原来客户区的长和宽,用现在的客户区的长和宽比上原来的。得到一个比例系统。依据这个比例系统来放大/缩小控件的大小(通过改变窗口矩形的坐标)。
实现:
void CMSVideoMonitorView::OnSize(UINT nType, int cx, int cy)
{
CFormView::OnSize(nType, cx, cy);
// TODO: 在此处添加消息处理程序代码
if(m_bStaticIsInitialized && m_cStatic0.m_hWnd != NULL)//判断是否为真,为真,表示控件已经被初始化(创建),可以进行操作。
/* //否则表明是创建主框架时调用此函数,还没有进行OnInitialUpdate()操作。*/
{
for (int i = 0; i < 16; i++)
{
CRect rect; //获取控件变化前大小
m_cAllStatics[i]->GetWindowRect(&rect);
ScreenToClient(&rect);//将控件大小转换为在对话框中的区域坐标
// cx/m_rect.Width()为对话框在横向的变化比例
rect.left=rect.left * cx/m_rectOriginalWindow.Width();
rect.right=rect.right* cx/m_rectOriginalWindow.Width();
rect.top=rect.top * cy/m_rectOriginalWindow.Height();
rect.bottom=rect.bottom * cy/m_rectOriginalWindow.Height();
m_cAllStatics[i]->MoveWindow(rect);//设置控件大小
}
}
GetClientRect(&m_rectOriginalWindow);//将变化后的对话框大小设为旧大小
}
其中m_rectOriginalWindow变量用来记录原来客户区的大小。
在实际实现时出现了一个小问题,在改变窗口大小的时候所有控件都不见了。后经排查原来问题出在:
rect.left=rect.left * (cx/m_rectOriginalWindow.Width());
为了易于阅读,我将计算比例的表达式用小括号括了起来。这样会导致,在窗口缩小的时候,比例会是一个小数。然后被近似为0——因为是整型数据。
浙公网安备 33010602011771号