自适应大小

原文出处忘了

自适应大小一般分为对话框自适应大小和控件自适应大小。

 

1.对话框自适应大小

 

 

//在屏幕中央 高度和宽度是屏幕的一半
	int   cx   =   GetSystemMetrics(   SM_CXSCREEN   );   
	int   cy   =   GetSystemMetrics(   SM_CYSCREEN   );
	::MoveWindow(m_hWnd,cx/8,cy/8,cx*3/4,cy*3/4,true);	


       其中的m_hWnd 为对话框的句柄,cx、cy是屏幕的高度和宽度;MoveWindow()函数是移动对话框到起点为:(cx/8,cy/8),大小为(cx*3/4,cy*3/4),最后的true是重画整个对话框,如果为false,则不重画真个对话框。

 

 

2.控件自适应大小

 

响应 WM_SIZE消息

void CCVDeviceOnlineTblCompareDlg::OnSize(UINT nType, int cx, int cy)
{
	CDialog::OnSize(nType, cx, cy);
	if(nType == SIZE_MINIMIZED) return;

	// 原本窗体大小尚没有初始化,则直接退出
	if (m_RectOrigi.Width()	!= 0 &&
		m_RectOrigi.Height()!= 0 ){
			CRect rectNew;
			GetWindowRect(&rectNew);
			// 如果新的窗体宽度与原本的窗体宽度不同或是高度小于原本宽度,则恢复原本的窗体大小;
			// 即:只允许用户拉伸窗体高度。
			if( (rectNew.Width() != m_RectOrigi.Width())) {
				MoveWindow(rectNew.left, rectNew.top, m_RectOrigi.Width(), rectNew.Height());
				return;
			}
			if(	(rectNew.Height() < m_RectOrigi.Height())) {
				MoveWindow(rectNew.left, rectNew.top, rectNew.Width(), m_RectOrigi.Height());
				return;
			}
	}

	// 与上一次窗体高度或是宽度的相差
	CSize SizeOff(cx - m_OldSize.cx, cy-m_OldSize.cy);
	// 改变窗体内控件的位置,参数即为offset值
	::EnumChildWindows(GetSafeHwnd(), EnumProc, (LPARAM)&SizeOff);

	if(GetDlgItem(IDD_CVDEVICEONLINETBLCOMPARE_DIALOG)->GetSafeHwnd())
	{
		if(nType == SIZE_MAXIMIZED)
			GetDlgItem(IDD_CVDEVICEONLINETBLCOMPARE_DIALOG)->ShowWindow(SW_HIDE);
		else
			GetDlgItem(IDD_CVDEVICEONLINETBLCOMPARE_DIALOG)->ShowWindow(SW_SHOW);
	}

	// 更新窗体旧大小,用于下一次做比较。
	m_OldSize =CSize(cx,cy);

	Invalidate();

	if (bInitOK == TRUE)
	{
		OnCbnSelchangeComboStandardpoc();
	}
	// TODO: Add your message handler code here
}


其中的EnumChildWindows为全局函数,定义如下:

 

BOOL CALLBACK EnumProc(HWND hwnd, LPARAM lParam)
{
	CWnd* pWnd = CWnd::FromHandle(hwnd);
	CSize* pSizeOff =(CSize*)lParam;
	CCVDeviceOnlineTblCompareDlg* pDlg = (CCVDeviceOnlineTblCompareDlg*)pWnd->GetParent();
	if(!pDlg) return FALSE;
	CRect rect;
	pWnd->GetWindowRect(rect);
	pDlg->ScreenToClient(rect);
	//比较站CListCtrl拉长
	if( hwnd == pDlg->m_ComparePoc.GetSafeHwnd()) 
	{
		pWnd->MoveWindow(
			rect.left,	//左上坐标不变
			rect.top,	//右上坐标不变
			rect.Width()+pSizeOff->cx,	//宽度拉长
			rect.Height(),			//高度不变
			FALSE);
	}
	//全选按钮
	if( hwnd == pDlg->m_AllSelectButton.GetSafeHwnd()) {
		pWnd->MoveWindow(
			rect.left+pSizeOff->cx,					
			rect.top,					
			rect.Width(),	
			rect.Height(),	
			FALSE);
	}
	//比较内容
	if(	hwnd == pDlg->m_CompareShow.GetSafeHwnd()) {
			pWnd->MoveWindow(
				rect.left,	
				rect.top,	
				rect.Width()+pSizeOff->cx,			
				rect.Height()+pSizeOff->cy,			
				FALSE);
	}
	//比较按钮
	if(	hwnd == pDlg->m_CompareButton.GetSafeHwnd()) {
		pWnd->MoveWindow(
			rect.left,	
			rect.top+pSizeOff->cy,	
			rect.Width(),			
			rect.Height(),			
			FALSE);
	}
	//仅差异按钮
	if(	hwnd == pDlg->m_OnlyDifferenceButton.GetSafeHwnd()) {
		pWnd->MoveWindow(
			rect.left,	
			rect.top+pSizeOff->cy,	
			rect.Width(),			
			rect.Height(),			
			FALSE);
	}
	//退出按钮
	if(	hwnd == pDlg->m_QuitButton.GetSafeHwnd()) {
		pWnd->MoveWindow(
			rect.left+pSizeOff->cx,	
			rect.top+pSizeOff->cy,	
			rect.Width(),			
			rect.Height(),			
			FALSE);
	}
	return TRUE;
}


其中if语句块即为控件的拉伸和移动,pSizeOff->cx为对话框变化的长度,pSizeOff->cy表示对话框变化的宽度。

你可能感兴趣的:(自适应大小)