主窗口大小发生变化(最大化、向下还原、手工手动)时,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——因为是整型数据。

posted on 2011-08-26 18:06  LateStop  阅读(2693)  评论(0)    收藏  举报

导航