1. 程式人生 > >MFC對話方塊最大化實現

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,是防止在多次放大和縮小時控制元件產生錯位,精度高而已。