MFC對話方塊最大化實現
對話方塊最大化個人覺得完全是雞肋,如果需要全屏話的軟體完全可以用單文件實現,對話方塊只是實現一些小的功能的軟體,但為了顯示功能強大加上了最大化按鈕,當初設計時是按對話方塊大小進行設計,放大以後真的不忍直視,但還是要將這倒黴的功能進行記錄,以備後需。
對話方塊放大相應WM_SIZE訊息,實現函式為Onsize(),只需在過載此函式即可
void CCDlgFrameDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
//對話方塊初始化之間會呼叫Onsize進行框架初始化,如果不加判斷會報錯,因為空間還未載入
if(Init_flag)
{
change(IDC_STATIC);
change(IDC_COMBO1);
change(IDC_EDIT1);
change(IDC_PROGRESS1);
change(IDC_BUTTON1);
//放大倍數儲存
m_Multiple_width=1/m_Multiple_width;
m_Multiple_heigh=1/m_Multiple_heigh;
}
}
函式change(int nID)主要實現控制元件放大和恢復
void CCDlgFrameDlg::change(int nID)
{
CRect Rect;
GetDlgItem(nID)->GetWindowRect(Rect);
ScreenToClient(Rect);
CPoint OldTLPoint,TLPoint;
OldTLPoint=Rect.TopLeft();
TLPoint.x=long(OldTLPoint.x*m_Multiple_width);
TLPoint.y=long(OldTLPoint.y*m_Multiple_heigh);
CPoint OldBRPoint,BRPoint;
OldBRPoint=Rect.BottomRight();
BRPoint.x=long(OldBRPoint.x*m_Multiple_width);
BRPoint.y=long(OldBRPoint.y*m_Multiple_heigh);
Rect.SetRect(TLPoint,BRPoint);
GetDlgItem(nID)->MoveWindow(Rect,TRUE);
}
放大倍數的提取則是在呼叫兩個函式之前
CRect rect;
GetWindowRect(&rect);
ScreenToClient(rect);
int m_nDlgWidth=rect.right-rect.left;
int m_nDlgHeight=rect.bottom-rect.top;
//獲取螢幕尺寸
int m_nWidth=GetSystemMetrics(SM_CXSCREEN);
int m_nHeight=GetSystemMetrics(SM_CYSCREEN);·
m_Multiple_width=float(m_nWidth)/float(m_nDlgWidth);
m_Multiple_heigh=float(m_nHeight)/float(m_nDlgHeight);
放大倍數定義為float,是防止在多次放大和縮小時控制元件產生錯位,精度高而已。