1. 程式人生 > >VS2013 MFC 對話方塊控制元件大小隨視窗大小改變而改變

VS2013 MFC 對話方塊控制元件大小隨視窗大小改變而改變

視窗大小改變後控制元件大小也隨之改變

在對話方塊標頭檔案中定義

標頭檔案名稱:專案名稱Dlg.h

POINT Old;//存放對話方塊的寬和高。

對話方塊cpp中初始化

cpp檔名稱:專案名稱Dlg.cpp
在OnInitDialog()函式中新增

CRect rect;
GetClientRect(&rect); //取客戶區大小   
Old.x = rect.right - rect.left;
Old.y = rect.bottom - rect.top;

新增WM_SIZE訊息

在類嚮導中為對話方塊類新增WM_SIZE訊息,如圖
新增WM_SIZE訊息
然後編輯程式碼,在函式中新增以下程式碼

void C槍支編碼識別Dlg::OnSize(UINT nType, int cx, int cy)

{
CDialogEx::OnSize(nType, cx, cy);

// TODO:  在此處新增訊息處理程式程式碼
if (nType == SIZE_RESTORED || nType == SIZE_MAXIMIZED)//窗體大小發生變動。處理程式
{
    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 / Old.x;
    fsp[1] = (float)Newp.y / Old.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]); //高度不可讀的控制元件(如:combBox),不要改變此值.
        Rect.SetRect(TLPoint, BRPoint);
        GetDlgItem(woc)->MoveWindow(Rect, TRUE);
        hwndChild = ::GetWindow(hwndChild, GW_HWNDNEXT);
    }
    Old = Newp;
}

}