1. 程式人生 > >MFC/VC++/VS 控制元件隨對話方塊尺寸變化

MFC/VC++/VS 控制元件隨對話方塊尺寸變化

1. 獲取對話方塊尺寸

CRect m_rect; //用於儲存原對話方塊大小

GetClientRect(&m_rect); //獲取對話方塊的大小

2. OnSize 訊息

	if (m_rect.Width() == 0 || m_rect.Height() == 0)
	{
		return;
	}

	if(nType != SIZE_MINIMIZED ) //判斷視窗是不是最小化了,因為視窗最小化之後 ,視窗的長和寬會變成0,當前一次變化的時就會出現除以0的錯誤操作
	{
		CWnd *pWnd = NULL; 
		pWnd = GetWindow(GW_CHILD); 
		while(pWnd != NULL) 
		{ 
			ChangeCtrlSize(pWnd->GetDlgCtrlID(), cx, cy); // 對每一個控制元件依次做調整

			pWnd=pWnd-> GetNextWindow(GW_HWNDNEXT); 
		}


		GetClientRect(&m_rect); //最後要更新對話方塊的大小,當做下一次變化的舊座標
	}

3.  ChangeCtrlSize
void XXXDlg::ChangeCtrlSize(UINT nID, int ix, int iy) //nID為控制元件ID,x,y分別為對話方塊的當前長和寬
{
	float fx = float(ix);
	float fy = float(iy);

	CWnd *pWnd = NULL;
	pWnd = GetDlgItem(nID); 
	if(pWnd != NULL) //判斷是否為空,因為在視窗建立的時候也會呼叫OnSize函式,但是此時各個控制元件還沒有建立,Pwnd為空
	{
		CRect rect; 
		pWnd->GetWindowRect(&rect); //獲取控制元件變化前的大小
		ScreenToClient(&rect); //將控制元件大小裝換位在對話方塊中的區域座標
		rect.left = int(rect.left * fx / (float)m_rect.Width()); //按照比例調整空間的新位置
		rect.top = int(rect.top * fy / (float)m_rect.Height());
		rect.bottom = int(rect.bottom * fy / (float)m_rect.Height());
		rect.right = int(rect.right * fx / (float)m_rect.Width());
		pWnd->MoveWindow(rect); //伸縮控制元件
	}
}