1. 程式人生 > 其它 >MFC 所有控制元件隨視窗大小自適應

MFC 所有控制元件隨視窗大小自適應

技術標籤:MFC視窗自適應c++mfc

MFC 所有控制元件隨視窗大小自適應

MFC中不同PC之間的解析度不同,為了適應不同解析度所有的控制元件需要自適應變化。實現的方法比較多,下面分享一種經過網上查閱經過修改及除錯的程式碼。
1.MyDlg.h標頭檔案中新增

	public:
		void ReSize(void);
		POINT m_ptOld;
		afx_msg void OnSize(UINT nType, int cx, int cy);//可以直接通過類嚮導新增

2.MyDlg.cpp原始檔的初始化函式OnInitDialog()中新增如下程式碼

BOOL CMyDlg::
OnInitDialog() { CDialogEx::OnInitDialog(); //此處程式碼 CRect rect; GetClientRect(&rect); //取客戶區大小 m_ptOld.x = rect.right - rect.left; m_ptOld.y = rect.bottom - rect.top; int cx = GetSystemMetrics(SM_CXFULLSCREEN); int cy = GetSystemMetrics(SM_CYFULLSCREEN); CRect rt; SystemParametersInfo
(SPI_GETWORKAREA, 0, &rt, 0); cy = rt.bottom; MoveWindow(0, 0, cx, cy); return TRUE; // 除非將焦點設定到控制元件,否則返回 TRUE }

3.ReSize()函式實現程式碼

void CMyDlg::ReSize(void)
{
	float fsp[2];
	POINT Newp; //獲取現在對話方塊的大小
	CRect recta;
	GetClientRect(&recta);     //取客戶區大小  
	Newp.x = recta.right - recta.left;
Newp.y = recta.bottom - recta.top; fsp[0] = (float)Newp.x / m_ptOld.x; fsp[1] = (float)Newp.y / m_ptOld.y; CRect Rect; int woc; CPoint OldTLPoint, TLPoint; //左上角 CPoint OldBRPoint, BRPoint; //右下角 HWND hwndChild = ::GetWindow(m_hWnd, GW_CHILD); //列出所有控制元件 while (hwndChild) { woc = ::GetDlgCtrlID(hwndChild);//取得ID GetDlgItem(woc)->GetWindowRect(Rect); ScreenToClient(Rect); OldTLPoint = Rect.TopLeft(); TLPoint.x = long(OldTLPoint.x*fsp[0]); TLPoint.y = long(OldTLPoint.y*fsp[1]); OldBRPoint = Rect.BottomRight(); BRPoint.x = long(OldBRPoint.x *fsp[0]); BRPoint.y = long(OldBRPoint.y *fsp[1]); // 遇到下拉框就只改變其寬度,不改變其高度。 if (woc == IDC_COMBO_COM_PORT || woc == IDC_COMBO_BAUDRATE || woc == IDC_COMBO_PARITY || woc == IDC_COMBO_BITSSIZE || woc == IDC_COMBO_STOPBITS) { BRPoint.y = long((OldBRPoint.y + 80) *fsp[1]); } else { BRPoint.y = long(OldBRPoint.y *fsp[1]); } Rect.SetRect(TLPoint, BRPoint); GetDlgItem(woc)->MoveWindow(Rect, TRUE); hwndChild = ::GetWindow(hwndChild, GW_HWNDNEXT); } m_ptOld= Newp; }

注意:MFC對話方塊自適應導致下拉框無法下拉問題的解決:遇到下拉框只改變其寬度,不改變其高度。

4.在OnSize()訊息中呼叫ReSize()即可自適應大小

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

	// TODO: 在此處新增訊息處理程式程式碼
	if (nType != SIZE_MINIMIZED)//必須加這個限制條件,否則會在最大/小化後出現顯示問題
	{
		ReSize();
	}
}