MFC 控件隨窗口尺寸變化自動調整位置及大小


在MFC對話框編程過程中經常會出現這樣一個問題,在給窗口做尺度變換后,原來的控件位置和大小並沒有跟着變,導致界面看起來極不協調,如下:

  

要解決這個問題,可在類結構體中聲明一個CRect變量以存儲之前窗體大小的信息,如下:

CRect m_DlgRect;//存儲對話框改變前大小,以供計算控件相應位置及大小時使用
在對話框的構造函數中初始化該變量

m_DlgRect.SetRect(0, 0, 0, 0);//初始化對話框大小存儲變量

在類結構體中聲明重繪函數,用於更新控件大小和位置

void repaint(UINT id, int last_Width, int now_Width, int last_Height, int now_Height);

在cpp中實例化該函數

void CMFC_SIZE_TESTDlg::repaint(UINT id, int last_Width, int now_Width, int last_Height, int now_Height)//更新控件位置和大小函數,可以根據需要自行修改
{
	CRect rect;
	CWnd *wnd = NULL;
	wnd = GetDlgItem(id);
	if (NULL == wnd)
	{
		MessageBox(_T("相應控件不存在"));
	}
	wnd->GetWindowRect(&rect);
	ScreenToClient(&rect);
	rect.left = (long)((double)rect.left / (double)last_Width*(double)now_Width);
	rect.right = (long)((double)rect.right / (double)last_Width*(double)now_Width);
	rect.top = (long)((double)rect.top / (double)last_Height*(double)now_Height);
	rect.bottom = (long)((double)rect.bottom / (double)last_Height*(double)now_Height);
	wnd->MoveWindow(&rect);
}
添加對話框消息WM_SIZE的響應函數,如下

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

	if (0 == m_DlgRect.left && 0 == m_DlgRect.right
		&& 0 == m_DlgRect.top && 0 == m_DlgRect.bottom)//第一次啟動對話框時的大小變化不做處理
	{
	}
	else
	{
		if (0 == cx && 0 == cy)//如果是按下了最小化,則觸發條件,這時不保存對話框數據
		{
			return;
		}
		CRect rectDlgChangeSize;
		GetClientRect(&rectDlgChangeSize);//存儲對話框大小改變后對話框大小數據

		repaint(IDC_STATIC, m_DlgRect.Width(), rectDlgChangeSize.Width(), m_DlgRect.Height(), rectDlgChangeSize.Height());//重繪函數,用以更新對話框上控件的位置和大小
		repaint(IDOK, m_DlgRect.Width(), rectDlgChangeSize.Width(), m_DlgRect.Height(), rectDlgChangeSize.Height());
		repaint(IDCANCEL, m_DlgRect.Width(), rectDlgChangeSize.Width(), m_DlgRect.Height(), rectDlgChangeSize.Height());
	}
	GetClientRect(&m_DlgRect); //save size of dialog
	Invalidate();//更新窗口
}

OK,到此完成了所有相關工作,效果如下:






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM