一、需求
當窗口大小變化時,如最大化、最小化時,控件位置和大小並沒有變化,本文實現此功能。
二、界面
主界面爲對話框,有最小化、最大化、關閉等功能。
三、原理
當窗口變化時,響應 OnSize 函數,並計算各控件位置,按比例縮放。
四、編碼
4.1 變量定義
在對話框類嚮導中添加 WM_SIZE 消息。其函數定義如下:
afx_msg void OnSize(UINT nType, int cx, int cy);
在對話框頭文件聲明變量:
CRect m_cRect;
用於保存位置信息。
4.2 初始化
在OnInitDialog函數中先獲取位置信息並保存:
GetClientRect(&m_cRect);
4.3 實現縮放
同一文件,實現控件變化的計算,代碼如下:
void CTestDlg::ChangeSize(int ctrID, int cx, int cy)
{
CWnd* pWnd = GetDlgItem(ctrID);
if (pWnd)
{
CRect rect; //獲取控件變化前的大小
pWnd->GetWindowRect(&rect);
ScreenToClient(&rect);//將控件大小轉換爲在對話框中的區域座標
// cx/m_cRect.Width()爲對話框在橫向的變化比例
rect.left = rect.left*cx / m_cRect.Width();//調整控件大小
rect.right = rect.right*cx / m_cRect.Width();
rect.top = rect.top*cy / m_cRect.Height();
rect.bottom = rect.bottom*cy / m_cRect.Height();
pWnd->MoveWindow(rect);//設置控件大小
}
}
先獲取控件ID,得到控件大小,再根據當前的 x、y計算比例,再移動控件。
4.4 處理 OnSize 事件
在 OnSize 函數中調用 ChangeSize 函數:
void CTestDlg::OnSize(UINT nType, int cx, int cy)
{
CDialogEx::OnSize(nType, cx, cy);
int CDlgItem[] = {
IDC_STC_1,
IDC_STC_2,
IDC_STC_3,
};
for (int i = 0; i < sizeof(CDlgItem) / sizeof(CDlgItem[0]); i++)
{
ChangeSize(CDlgItem[i], cx, cy);
}
GetClientRect(&m_cRect);// 將變化後的對話框大小設爲舊大小
}
根據指定的控件ID進行縮放。注意,有些控件可以不進行縮放,比如,左上方的提示語相關控件,不需要移動。