窗体缩放方法

首先,一个窗口是否可以拖动改变大小决定于border的属性,

仅当border为Resizing是窗口可以拖动改变大小,其它属性时则不可以。



例子:

通常,主窗体上有TabCtrl控件,并且有通过TabCtrl加载的子窗口,在子窗口有ListCtrl控件和Button,那么:

当主窗体缩放时,需要同步放大TabCtrl和当前子窗口,并且当子窗口被缩放时,上面的ListCtrl个Button控件也要跟着调整大小和位置。

方法如下:

步骤一:重载主窗口的WM_SIZE方法,用于处理TabCtrl和其子窗口的缩放结果。注意不要使用WM_SIZING,否则缩放过程会闪烁。

//窗体缩放事件
void CAppConfigDlg::OnSize(UINT nType, int cx, int cy)
{
	CDialogEx::OnSize(nType, cx, cy);

	// TODO:  在此处添加消息处理程序代码

	CRect rect;
	GetClientRect(&rect);

	//TabCtrl缩放处理
	if (m_TabCtrl.GetSafeHwnd())
	{
		m_TabCtrl.MoveWindow(0, 0, rect.Width(), rect.Height());
	}

	//子页面缩放处理
	if (m_clsUploadAPK.GetSafeHwnd())
	{
		rect.left += 4;
		rect.top += 30;
		rect.right -= 3;
		rect.bottom -= 3;
		m_clsUploadAPK.MoveWindow(&rect);
	}
}


步骤二:重载主窗口WM_SIZING方法,用于锁定窗体最小尺寸,这个需要在缩放过程中不断控制。如果不想控制最小尺寸,可以忽略此步骤。

//锁定窗口最小尺寸
void CAppConfigDlg::OnSizing(UINT fwSide, LPRECT pRect)
{
	CDialogEx::OnSizing(fwSide, pRect);

	// TODO:  在此处添加消息处理程序代码

	if (pRect->right - pRect->left < m_nMinWidth)
	{
		pRect->right = pRect->left + m_nMinWidth;
	}
	if (pRect->bottom - pRect->top < m_nMinHeight)
	{
		pRect->bottom = pRect->top + m_nMinHeight;
	}
}

步骤三:重载子窗口的WM_SIZE方法,用于处理子窗口上面ListCtrl和Button的位置调整

//控件位置调整
void CUploadAPK::OnSize(UINT nType, int cx, int cy)
{
	CDialogEx::OnSize(nType, cx, cy);

	// TODO:  在此处添加消息处理程序代码

	//调整ListCtrl
	if (m_ctrApkList.GetSafeHwnd())
	{
		m_ctrApkList.MoveWindow(5, 47, cx - 12, cy - 85);
	}

	//调整按钮
	CRect rect;
	((CButton*)GetDlgItem(IDC_Upload))->GetClientRect(&rect);
	((CButton*)GetDlgItem(IDC_Upload))->MoveWindow(cx - rect.Width() - 10, cy - rect.Height() - 10, rect.Width(), rect.Height());
}


你可能感兴趣的:(窗体缩放方法)