1. 在oninitdlg中 計算出目前的交談框的大小與最大化後大小,注意要用float值,不然誤差很大. CRect rect; ::GetWindowRect(m_hWnd,rect); ScreenToClient(rect); m_nDlgWidth = rect.right - rect.left; m_nDlgHeight = rect.bottom - rect.top; //計算解析度 m_nWidth = GetSystemMetrics(SM_CXSCREEN); m_nHeight = GetSystemMetrics(SM_CYSCREEN); //計算放大倍數 m_Multiple_width = float(m_nWidth)/float(m_nDlgWidth); m_Mutiple_heith = float(m_nHeight)/float(m_nDlgHeight); change_flag=TRUE;//這個是成員變數bool形,用來判斷onsize執行時oninitdlg是否已經執行了 2. 給你對話方塊添加 onsize訊息: void EnviromentConfigDlg::OnSize(UINT nType, int cx, int cy) { CDialog::OnSize(nType, cx, cy); if (change_flag)//如果確定oninitdlg已經調用完畢. { ReSize(IDC_STATIC1); ReSize(IDC_TREE_ALARM); ReSize(IDC_STATIC2); ReSize(IDC_TREE_CAMERA); ReSize(IDC_STATIC3); ReSize(IDC_LIST_TYPE); ReSize(IDOK); ReSize(IDC_STATIC4); ReSize(IDC_LIST_INFO); //恢複放大倍數,並儲存 (確保還原時候能夠還原到原來的大小) m_Multiple_width = float(1)/ m_Multiple_width ; m_Mutiple_heith = float(1)/m_Mutiple_heith ; } } 3.重新整理控制項:根據比例計算控制項縮放的大小,然後movewindow 到新矩形上 void EnviromentConfigDlg::ReSize(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_Mutiple_heith ); //計算控制項右下角點 CPoint OldBRPoint,BRPoint; OldBRPoint = Rect.BottomRight(); BRPoint.x = long(OldBRPoint.x *m_Multiple_width); BRPoint.y = long(OldBRPoint.y * m_Mutiple_heith ); //行動控制項到新矩形 Rect.SetRect(TLPoint,BRPoint); GetDlgItem(nID)->MoveWindow(Rect,TRUE); } 這樣,你就可以隨心所遇的放大與縮小你的對話方塊了,控制項也跟著比例縮小放大 |