MFC SDI程序 CFormView中控件随窗口缩放

Published

当我们添加了资源对话框时,它的尺寸在客户区显示时是不会随着窗口的大小调整的,当框架尺寸小于它的尺寸时,还出现了滚动条。

思路

根据客户区的大小调整资源对话框的大小。

根据对话框大小动态调整控件的大小和位置

 

方法1:

1.记录原始的CFormView的RECT。在OnSize中获得当前Rect,求出放大比例。

2.对每一个控件。在OnSize中获取当前RECT。然后乘以放大比例。作为新的RECT大小。

3.对每一个控件。调用MoveWindow函数。完毕缩放。

这样的方法对每一个控件,都编写代码进行操作,必定是缩放效果最好的。

方法2:

这是对方法1的改进。须要一定的知识和技巧。

全部控件的定义都是在*.rc文件里,可是这些控件的ID声明却都在resource.h中。假设你有足够的耐心和另外一块显示屏,那么你能够:

1.更改这些控件的ID值,使它们顺序增长(减小),这样我们就能够在一个循环里完毕方法1中对控件的操作,仅仅需1套代码。

 

方法3:

我採用了这样的。主要是不想维护太多的代码。也不想在如此众多的宏中对ID值进行更改。

先上代码吧,无码无真相。

void CRealTimeFV::OnSize(UINT nType, int cx, int cy)
{
	CFormView::OnSize(nType, cx, cy);
	
	RECT rc;
	GetClientRect(&rc);
	LPRECT lpClientRect=&rc;
 
	m_dXRate=lpClientRect->right/(double)m_lastRect.right;
	m_dYRate=lpClientRect->bottom/(double)m_lastRect.bottom;
 
	if (lpClientRect->right!=0 && lpClientRect->bottom!=0)
	{
		m_lastRect.bottom=lpClientRect->bottom;
		m_lastRect.left=lpClientRect->left;
		m_lastRect.right=lpClientRect->right;
		m_lastRect.top=lpClientRect->top;
 
		CWnd *pWnd=NULL;
		pWnd=GetWindow(GW_CHILD);
 
		while (pWnd)
		{
			CString strCaption;
			pWnd->GetWindowTextW(strCaption);
			OutputDebugString(TEXT("Caption:")+strCaption+TEXT("\n"));
 
			CRect childRect;
			pWnd->GetWindowRect(&childRect);
			ScreenToClient(&childRect);
 
			childRect.left=(LONG)(childRect.left*m_dXRate);
			childRect.top=(LONG)(childRect.top*m_dYRate);
			childRect.right=(LONG)(childRect.right*m_dXRate);
			childRect.bottom=(LONG)(childRect.bottom*m_dYRate);
 
			pWnd->MoveWindow(&childRect,TRUE);
 
			pWnd=pWnd->GetWindow(GW_HWNDNEXT);
		}
	}
}

 

 

CFormView动态调整对话框的尺寸并成比例调整部署控件