天天看點

視窗變化相關消息 OnSize、OnSizing和OnGetMinMaxInfo

最近用到視窗變化的一些東西,遇到幾個相關的消息函數,簡要分析,作為備忘。 3個消息分别是:WM_SIZE、WM_SIZING、WM_GETMINMAXINFO;分别對應相應的處理函數:OnSize、OnSizing、OnGetMinMaxInfo。 當視窗大小發生變化時,響應的順序依次是:WM_GETMINMAXINFO-->WM_SIZING-->WM_SIZE。
這個函數在視窗初始化的時候會被調用一次,當視窗大小發生改變的時候也會被調用。利用這個函數,可以比較友善的實作視窗最大最小尺寸的控制。 參數lpMMI是一個結構體指針,其中包含了有關視窗的最大化大小和位置以及最小、最大跟蹤大小的資訊。 使用這個函數控制視窗最小尺寸的示例的代碼如下: void CXXXDlg::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)    {       lpMMI->ptMinTrackSize.x = 500;   //x寬度       lpMMI->ptMinTrackSize.y = 100;   //y高度       CDialog::OnGetMinMaxInfo(lpMMI);   }   以上代碼可以使得視窗大小變化時,最小寬度為500px,最小高度為100px。
這個函數在視窗大小發生變化時被調用。在這個函數裡,也可以控制視窗的最大最小尺寸,但是沒有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也移動了,看上去就像是這個視窗右移了。是以針對這種情況又要另外做相應的處理。
這個函數會在視窗大小改變結束後被調用,通常會在這個函數裡重新擺放各個控件的位置及大小。用這個函數暫時沒有找到什麼辦法可以控制視窗的最大最小大小。

繼續閱讀