最近用到窗口變化的一些東西,遇到幾個相關的消息函數,簡要分析,做爲備忘。ide
3個消息分別是:WM_SIZE、WM_SIZING、WM_GETMINMAXINFO;分別對應相應的處理函數:OnSize、OnSizing、OnGetMinMaxInfo。函數
當窗口大小發生變化時,響應的順序依次是:WM_GETMINMAXINFO-->WM_SIZING-->WM_SIZE。指針
這個函數在窗口初始化的時候會被調用一次,當窗口大小發生改變的時候也會被調用。利用這個函數,能夠比較方便的實現窗口最大最小尺寸的控制。方法
參數lpMMI是一個結構體指針,其中包含了有關窗口的最大化大小和位置以及最小、最大跟蹤大小的信息。移動
使用這個函數控制窗口最小尺寸的示例的代碼以下:di
void CXXXDlg::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI) { lpMMI->ptMinTrackSize.x = 500; //x寬度 lpMMI->ptMinTrackSize.y = 100; //y高度 CDialog::OnGetMinMaxInfo(lpMMI); }以上代碼能夠使得窗口大小變化時,最小寬度爲500px,最小高度爲100px。block
這個函數在窗口大小發生變化時被調用。在這個函數裏,也能夠控制窗口的最大最小尺寸,可是沒有OnGetMinMaxInfo方便。消息
void CXXXDlg::OnSizing(UINT fwSide, LPRECT pRect) { if ((pRect->right - pRect->left) < 500) { //return ; //直接return是無效的,窗口大小仍是會改變 pRect->right = pRect->left + 500; } CDialog::OnSizing(fwSide, pRect); }用上面的方法,若是是從右邊改變大小,能夠達到想要的效果,可是從左邊改變大小,雖然大小能夠控制在最小500,可是當達到最小寬度後,再縮小,會發現整個窗口往右移動了,緣由是代碼中的pRect->right = pRect->left + 500;這句是針對left來改變right的,因此left移動了,right也移動了,看上去就像是這個窗口右移了。因此針對這種狀況又要另外作相應的處理。結構體
這個函數會在窗口大小改變結束後被調用,一般會在這個函數裏從新擺放各個控件的位置及大小。用這個函數暫時沒有找到什麼辦法能夠控制窗口的最大最小大小。return