MFC 控制元件隨著對話方塊大小的改變而改變
(1)首先在對話方塊類中定義一個CRect oldRect的類
(2)在Initstance()函式中獲得GetClientRect(&oldRect)
(3) 新增WM_SIZE函式 OnSize()函式
(4)在響應函式中新增如下程式碼:
for (int i=1;i<=2;i++) //因為是兩個控制元件,所以這裡用了迴圈
{
CWnd *pWnd;
pWnd = GetDlgItem(1000); //獲取ID為i的空間的控制代碼,因為“確認”ID為1,“取消”ID為2
if(pWnd) //判斷是否為空,因為對話方塊建立時會呼叫此函式,而當時控制元件還未建立
{
CRect rect; //獲取控制元件變化前的大小
pWnd->GetWindowRect(&rect);
ScreenToClient(&rect);//將控制元件大小轉換為在對話方塊中的區域座標
//cx/m_rect.Width()為對話方塊在橫向的變化比例
rect.left = rect.left * cx / m_rect.Width();//調整控制元件大小
rect.right = rect.right * cx / m_rect.Width();
rect.top=rect.top * cy / m_rect.Height();
rect.bottom = rect.bottom * cy / m_rect.Height();
pWnd->MoveWindow(rect);//設定控制元件大小
}
}
GetClientRect(&m_rect);// 將變化後的對話方塊大小設為舊大小
}
2.但是以上只能使用最小化最大化的同比例放大 但是如果要點選滑鼠拉大或者縮小對話方塊時會出現失真的現象 效果不是那麼明顯
所以如果想要一個控制元件在對話方塊縮放時保持原來的位置則使用以下方法:
CRect newRect;//用來記錄當前的對話方塊位置
GetClientRect(&newRect);
for (int i=1;i<=2;i++) //因為是兩個控制元件,所以這裡用了迴圈
{
CWnd *pWnd;
pWnd = GetDlgItem(1000); //獲取ID為i的空間的控制代碼,因為“確認”ID為1,“取消”ID為2
if(pWnd) //判斷是否為空,因為對話方塊建立時會呼叫此函式,而當時控制元件還未建立
{
CRect rect; //獲取控制元件變化前的大小
pWnd->GetWindowRect(i);
ScreenToClient(&rect);//將控制元件大小轉換為在對話方塊中的區域座標
//cx/m_rect.Width()為對話方塊在橫向的變化比例
rect.left = rect.left + newRect.right - m_rect.right ;
rect.right = rect.right + newRect.right - m_rect.right ;
rect.top = rect.top + newRect.bottom - m_rect.bottom;
rect.bottom = rect.bottom + newRect.bottom - m_rect.bottom ;
pWnd->MoveWindow(rect);//設定控制元件大小
}
}
GetClientRect(&m_rect);// 將變化後的對話方塊大小設為舊大小
}
3.對於一個列表控制元件或者編輯框控制元件(記事本),實現上述功能,則使用以下方式:
CRect newRect;
GetClientRect(&newRect);
CWnd *pWnd;
pWnd = GetDlgItem(1000); //獲取ID為1000(IDC_LIST)的空間的控制代碼,數值為1000
if(pWnd) //判斷是否為空,因為對話方塊建立時會呼叫此函式,而當時控制元件還未建立
{
CRect rect; //獲取控制元件變化前的大小
pWnd->GetWindowRect(&rect);
ScreenToClient(&rect);//將控制元件大小轉換為在對話方塊中的區域座標
rect.right = rect.right + newRect.right - m_rect.right ;
rect.bottom = rect.bottom + newRect.bottom - m_rect.bottom ;
pWnd->MoveWindow(rect);//設定控制元件大小
}
GetClientRect(&m_rect);// 將變化後的對話方塊大小設為舊大小