MFC小筆記:控件隨窗口變化

一、需求

當窗口大小變化時,如最大化、最小化時,控件位置和大小並沒有變化,本文實現此功能。

二、界面

主界面爲對話框,有最小化、最大化、關閉等功能。

三、原理

當窗口變化時,響應 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進行縮放。注意,有些控件可以不進行縮放,比如,左上方的提示語相關控件,不需要移動。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章