1. 程式人生 > >MFC 控制元件隨視窗尺寸變化自動調整位置及大小

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 CMiniPanoPlayerDlg::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);

	double proportion_x = now_Width / (double)last_Width;
	double proportion_y = now_Height / (double)last_Height;

	rect.left = (long)(rect.left*proportion_x+0.5);
	rect.right = (long)(rect.right*proportion_x + 0.5);
	rect.top = (long)(rect.top *proportion_y + 0.5);
	rect.bottom = (long)(rect.bottom *proportion_y + 0.5);
	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,到此完成了所有相關工作,效果如下: