如何设置对话框的最大(小)高度与宽度
關(guān)于如何設(shè)置對話框的最大(小)高度與寬度,網(wǎng)上有很多blog介紹了這個方面,我覺得有一篇寫的比較好,先扒過來湊點(diǎn)字?jǐn)?shù)
以下內(nèi)容轉(zhuǎn)自http://www.youranshare.com/push/code/win-c-cpp/427.html:
在MFC中,沒有像QT那樣的函數(shù)可以直接通過某個函數(shù)就可以完成對窗口的最大最小SIZE信息進(jìn)行設(shè)置,但是這么強(qiáng)大的MFC,這種弱雞的問題肯定也就不是問題,這里給大家分享三個方法來完成限定窗口大小的處理。
方法一:響應(yīng)窗口?WM_SIZE 消息(不推薦)
WM_SIZE 消息是當(dāng)窗口大小發(fā)生改變后發(fā)送的,所以如果要在這個窗口中限制窗口大小的話,你就需要重新計算窗口的大小信息,代碼如下:
void CMainFrame::OnSize(UINT nType, int cx, int cy) {CFrameWnd::OnSize(nType, cx, cy);// TODO: 在此處添加消息處理程序代碼CRect rect ;BOOL IsNeedReset = FALSE;GetWindowRect(&rect);if(cx<640){IsNeedReset = TRUE;rect.right = rect.left+640;}if(cy<480){IsNeedReset = TRUE;rect.bottom = rect.top+480;}if(IsNeedReset){SetWindowPos(NULL,rect.left,rect.top,rect.Width(),rect.Height(),SWP_SHOWWINDOW|SWP_NOMOVE);} }由于OnSize是在窗口大小已經(jīng)改變后才執(zhí)行的,所以如果在代碼種再次執(zhí)行窗口的大小調(diào)整將會導(dǎo)致閃爍的問題,所以這種方法不推薦。
方法二:響應(yīng)窗口?WM_SIZEING 消息(較為推薦)
WM_SIZEING消息是當(dāng)窗口大小正在發(fā)生改變的時候發(fā)送的,所以可以在此消息種限制改變的大小從而達(dá)到限制窗口大小的目的,但是對于一個窗口來說,其改變大小的方式有很多,例如從窗口的四個方向都可以改變其大小,WM_SIZEING 消息有一個SIDE參數(shù)其描述了改變方向邊界位置,這里為了簡單,不去處理這個參數(shù),如果你從左側(cè)調(diào)整大小,可以發(fā)現(xiàn)很好玩的狀態(tài)。
void CMainFrame::OnSizing(UINT fwSide, LPRECT pRect) {//這里還需要知道 dwSide的信息,就是從那個方向進(jìn)行變動//這里省略了,不建議使用這種方法//如果不處理方向,你可以試試看窗口從左下角 變小,很好玩的if(pRect->right-pRect->left<=840){ pRect->right = pRect->left+840;}if(pRect->bottom-pRect->top<=480){ pRect->bottom = pRect->top+480;}//CFrameWnd::OnSizing(fwSide, pRect);// TODO: 在此處添加消息處理程序代碼 }WM_SIZEING 這種處理是可行的,不會出現(xiàn)閃爍的問題,但是需要處理一個dwSide的參數(shù),處理起來較為復(fù)雜。
方法三:響應(yīng)窗口?WM_GETMINMAXINFO消息(推薦)
當(dāng)一個窗口的位置或者大小將要改變的時候?qū)l(fā)送一個WM_GETMINMAXINFO的窗口消息,應(yīng)用程序可以使用這個消息來重設(shè)窗口的默認(rèn)最大化大小和位置,或者窗口的默認(rèn)最小或最大拖放大小。
void CMainFrame::OnGetMinMaxInfo(MINMAXINFO* lpMMI) {//調(diào)整最小高度與寬度,如果需要的話lpMMI->ptMinTrackSize.x = 640;lpMMI->ptMinTrackSize.y = 480;//調(diào)整最大高度與寬度,如果需要的話lpMMI->ptMaxTrackSize.x = 1366;lpMMI->ptMaxTrackSize.y = 768;CFrameWnd::OnGetMinMaxInfo(lpMMI); }WM_GETMINMAXINFO的處理簡單易懂,無需繁雜的計算即可限定窗口的拖放大小等信息。
下面我接著寫自己遇到的問題。我的對話框是Popup無邊框?qū)υ捒?#xff0c;本打算用上面的二或者三方法解決限制窗口大小的問題,卻發(fā)現(xiàn)對話框接收不到WM_SIZING和WM_GETMINMAXINFO消息,而用WM_SIZE解決方案有有點(diǎn)丑陋,于是想到了能不能響應(yīng)WM_WINDOWPOSCHANGING消息解決,還好,可以這此消息里設(shè)置對話框的大小:
void OnWindowPosChanging(LPWINDOWPOS lpWndPos){if (m_iMaxWidth != 0 && lpWndPos->cx > m_iMaxWidth){lpWndPos->cx = m_iMaxWidth;}if (m_iMaxHeight != 0 && lpWndPos->cy > m_iMaxHeight){lpWndPos->cy = m_iMaxHeight;}}
結(jié)論嘛就是在無邊框?qū)υ捒蚴遣豁憫?yīng) WM_SIZING和 WM_GETMINMAXINFO消息的(我想這是因?yàn)闆]有Resizing屬性導(dǎo)致),但是呢可以使用WM_WINDOWPOSCHANGING消息解決限制對話框大小問題。我有回頭翻了下E文:
For a window with the?WS_OVERLAPPED?or?WS_THICKFRAME?style, the?DefWindowProc?function sends theWM_GETMINMAXINFO?message to the window. This is done to validate the new size and position of the window and to enforce the?CS_BYTEALIGNCLIENT?and CS_BYTEALIGNWINDOW client styles. By not passing the?WM_WINDOWPOSCHANGING?message to the?DefWindowProc?function, an application can override these defaults.
While this message is being processed, modifying any of the values in?WINDOWPOS?affects the window's new size, position, or place in the Z order. An application can prevent changes to the window by setting or clearing the appropriate bits in the?flags?member of?WINDOWPOS.
根據(jù)上面所寫,只有窗口具有WS_OVERLAPPED 或者 WS_THICKFRAME時,才會收到 WM_GETMINMAXINFO消息。另外也可以清除WINDOWPOS成員flags某些bit位阻止窗口改變。例如上面的代碼也可以這樣寫:void OnWindowPosChanging(LPWINDOWPOS lpWndPos){if (lpWndPos->cx > m_iMaxWidth || lpWndPos->cy > m_iMaxHeight){lpWndPos->flags |= SWP_NOSIZE;}}
總結(jié)
以上是生活随笔為你收集整理的如何设置对话框的最大(小)高度与宽度的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中国联通GPON/4+1+WiFi(2.
- 下一篇: 图标显示方框问题的一种原因