您的位置:首页 > 其它

主窗口大小发生变化(最大化、向下还原、手工手动)时,FormView中的控件等比例缩放

2011-08-26 18:06 295 查看
原理:记录原来客户区的长和宽,用现在的客户区的长和宽比上原来的。得到一个比例系统。依据这个比例系统来放大/缩小控件的大小(通过改变窗口矩形的坐标)。

实现:

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——因为是整型数据。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: