1. 程式人生 > >VS2010 MFC 控制元件隨主框體變化而變化

VS2010 MFC 控制元件隨主框體變化而變化

這裡介紹一種控制控制元件隨主框體變化而變化的方法。
方法並不完善,框體只支援最大化和最小化視窗時還好,但是在連續最大化最小化切換10次以上以後,控制元件在主框體中的相對位置會向左上角移動,幅度並不大,基本可以滿足應用需要;
但如果主框體動態的變化大小,控制元件的相對位置變化的非常快,基本不能使用。
自己使用MFC只是做一些小工具,或者測試工具,自己或者同事使用,只使用最大化和最小化視窗,基本也滿足需要了。
下面介紹方法:
1、在對話方塊類中新增成員變數 CRect m_rectOrg 它是用來記錄當前對話方塊的大小。
在OnInitDialog()函式中獲取對話方塊建立時的大小:GetClientRect(&m_rectOrg )。
2、在對話方塊類中新增函式void ChangeSize(CWnd * pWnd, int cx, int cy),根據主框體的變化改變控制元件大小。

void CTESTDlg::ChangeSize(CWnd * pWnd, int cx, int cy)
{
	if (pWnd)
	{
		CRect rect; 
		pWnd->GetWindowRect(&rect);				//獲取控制元件變化前的大小
		ScreenToClient(&rect);					//將控制元件大小轉換為在對話方塊中的區域座標 
		rect.left=rect.left*cx/m_rectOrg.Width();		//調整控制元件大小 ,cx/m_rectOrg.Width()為對話方塊在橫向的變化比例
		rect.right=rect.right*cx/m_rectOrg.Width();		//cx儲存的是變化後的寬度,cy儲存的是變化後的高度
		rect.top=rect.top*cy/m_rectOrg.Height();		//m_rectOrg.height()表示的是變化前主窗體的高度
		rect.bottom=rect.bottom*cy/m_rectOrg.Height();
		pWnd->MoveWindow(rect);					//設定控制元件大小
	}
}

3、在MFC 類嚮導中新增訊息WM_SIZE,如下圖所示:
在這裡插入圖片描述
4、修改void CTESTDlg::OnSize(UINT nType, int cx, int cy)

void CTESTDlg::OnSize(UINT nType, int cx, int cy)
{
	CDialogEx::OnSize(nType, cx, cy);

	// TODO: 在此處新增訊息處理程式程式碼

	if(nType==SIZE_MINIMIZED) return; //最小化則什麼都不做 
	CWnd *pWnd;		
	int ctrlID;
	HWND hWndChild = ::GetWindow(m_hWnd, GW_CHILD);	//列出所有控制元件
	while(hWndChild)
	{
		ctrlID= ::GetDlgCtrlID(hWndChild);
		pWnd = GetDlgItem(ctrlID); //獲取控制元件控制代碼
		ChangeSize(pWnd,cx,cy);
		hWndChild = ::GetWindow(hWndChild, GW_HWNDNEXT);
	}
	GetClientRect(&m_rectOrg);
}