对话框窗口最大最小化
mfc里,基于對話框的窗口,具有最大最小化的屬性設置。在Border屬性里選擇Resizing,然后在Maximize和Minimize中選擇true。在窗體當中隨便拖幾個控件,然后運行,此時點擊最大化會發現,整個窗體的大小是變大了,但是有效區域并不會改變大小,也就是控件的大小任然不變。那么如何調整對話框中的各個控件,隨窗體的大小改變而改變呢?mfc里面有一個消息WM_SIZE,這個消息能響應窗體大小改變事件。具體如何操作?
選擇類向導,搜索消息WM_SIZE,添加相應的事件處理函數void CMyDlg::OnSize(UINT nType, int cx, int cy),真正改變控件大小的函數并不是此函數,它還需要配合void CMyDlg::ChangeSize(CWnd *pWnd, int cx, int cy,bool tf) 才能進行處理。具體代碼如下:
void CMyDlg::OnSize(UINT nType, int cx, int cy)
{CDialogEx::OnSize(nType, cx, cy);// TODO: 在此處添加消息處理程序代碼if(nType==1) return;//最小化則什么都不做 // TODO: Add your message handler code here CWnd *pWnd; pWnd = GetDlgItem(IDC_STATIC_PLAYCTL); ChangeSize(pWnd, cx, cy,false);
// pWnd = GetDlgItem(IDC_STATIC);
// ChangeSize(pWnd, cx, cy); pWnd = GetDlgItem(IDC_BUTTON_LOAD); ChangeSize(pWnd, cx, cy,false); pWnd = GetDlgItem(IDC_BUTTON_PLAY); ChangeSize(pWnd, cx, cy,false); pWnd = GetDlgItem(IDC_BUTTON_STOP); ChangeSize(pWnd, cx, cy,false); pWnd = GetDlgItem(IDC_BUTTON_PLAY_FORWARD); ChangeSize(pWnd, cx, cy,false); pWnd = GetDlgItem(IDC_BUTTON_PLAY_BACKWARD); ChangeSize(pWnd, cx, cy,false); pWnd = GetDlgItem(IDC_STATIC_VOLUME_TEXT); ChangeSize(pWnd, cx, cy,false); pWnd = GetDlgItem(IDC_STATIC_FILENAME); ChangeSize(pWnd, cx, cy,false); pWnd = GetDlgItem(IDC_SLIDER_MEDIA); ChangeSize(pWnd, cx, cy,false); pWnd = GetDlgItem(IDC_SLIDER_VOLUME); ChangeSize(pWnd, cx, cy,false); pWnd=GetDlgItem(IDC_STATIC_VOLUME);ChangeSize(pWnd, cx, cy,false); pWnd=GetDlgItem(IDC_STATIC_POSITION);ChangeSize(pWnd, cx, cy,false);pWnd=GetDlgItem(IDC_BUTTONftp);ChangeSize(pWnd, cx, cy,false);pWnd = GetDlgItem(IDC_STATIC_VIDEO); ChangeSize(pWnd, cx, cy,true); GetClientRect(&m_rect);// 將變化后的對話框大小設為舊大小}void CMyDlg::ChangeSize(CWnd *pWnd, int cx, int cy,bool tf) //真正改變控件大小的函數,在onsize里邊不斷被調用
{ 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);//設置控件大小 } }
ok,在onsize函數里邊,主要是這兩句:pWnd = GetDlgItem(IDC_STATIC_PLAYCTL); ChangeSize(pWnd, cx, cy,false);,其中IDC_STATIC_PLAYCTL是我項目中的一個picture控件,利用GetDlgItem獲取該控件的句柄,然后調用ChangeSize函數實現具體的調整。
ChangeSize函數里邊的代碼注釋也很詳細,我就不解釋了。這樣做以后,運行發現確實能實現想要的效果。無論是最大化還是你隨意的伸縮窗體,各個控件均能很良好的實現相應的調整。但是我實驗的時候,由于我寫的是一個播放器,中間很大一塊是一個Picture控件,下面是一些控制按鈕。剛開始的時候,我沒有太關心onsize函數里邊每個控件被調用的順序,此時我的Picture控件不是最后一個被調用,所以最大化的時候發現當Picture控件已經最大化后,位于它之后的一些按鈕控件便會在原來的位置閃爍幾下,才調整到最終的位置。于是我改變了調用的順序,將picture控件最后調用,正如代碼中的那樣,于是沒有出現剛才的現象了。
但是,這種方法有一個缺點,就是會閃屏。你想啊,每個控件調整自己的大小以適應新窗口的大小是有先后順序和執行時間的。從最初的狀態到最終的狀態中,控件在不斷變化位置,于是產生了閃屏。這是我自己的理解。好在影響不是特別大,所以更好的方法我就沒有再接著找尋了。但肯定有更好的方法,如果控件太多,中間轉換的時間還是很可觀的??赡荛W屏現象就會更嚴重一點。
拙見。小記。
總結
以上是生活随笔為你收集整理的对话框窗口最大最小化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vc picture控件载入背景图,随控
- 下一篇: 由MessageBox和AfxMessa