日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

如何设置对话框的最大(小)高度与宽度

發布時間:2024/1/8 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何设置对话框的最大(小)高度与宽度 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

關于如何設置對話框的最大(小)高度與寬度,網上有很多blog介紹了這個方面,我覺得有一篇寫的比較好,先扒過來湊點字數


以下內容轉自http://www.youranshare.com/push/code/win-c-cpp/427.html:

在MFC中,沒有像QT那樣的函數可以直接通過某個函數就可以完成對窗口的最大最小SIZE信息進行設置,但是這么強大的MFC,這種弱雞的問題肯定也就不是問題,這里給大家分享三個方法來完成限定窗口大小的處理。

方法一:響應窗口?WM_SIZE 消息(不推薦)

WM_SIZE 消息是當窗口大小發生改變發送的,所以如果要在這個窗口中限制窗口大小的話,你就需要重新計算窗口的大小信息,代碼如下:

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是在窗口大小已經改變后才執行的,所以如果在代碼種再次執行窗口的大小調整將會導致閃爍的問題,所以這種方法不推薦。

方法二:響應窗口?WM_SIZEING 消息(較為推薦)

WM_SIZEING消息是當窗口大小正在發生改變的時候發送的,所以可以在此消息種限制改變的大小從而達到限制窗口大小的目的,但是對于一個窗口來說,其改變大小的方式有很多,例如從窗口的四個方向都可以改變其大小,WM_SIZEING 消息有一個SIDE參數其描述了改變方向邊界位置,這里為了簡單,不去處理這個參數,如果你從左側調整大小,可以發現很好玩的狀態。

void CMainFrame::OnSizing(UINT fwSide, LPRECT pRect) {//這里還需要知道 dwSide的信息,就是從那個方向進行變動//這里省略了,不建議使用這種方法//如果不處理方向,你可以試試看窗口從左下角 變小,很好玩的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 這種處理是可行的,不會出現閃爍的問題,但是需要處理一個dwSide的參數,處理起來較為復雜。

方法三:響應窗口?WM_GETMINMAXINFO消息(推薦)

當一個窗口的位置或者大小將要改變的時候將會發送一個WM_GETMINMAXINFO的窗口消息,應用程序可以使用這個消息來重設窗口的默認最大化大小和位置,或者窗口的默認最小或最大拖放大小。

void CMainFrame::OnGetMinMaxInfo(MINMAXINFO* lpMMI) {//調整最小高度與寬度,如果需要的話lpMMI->ptMinTrackSize.x = 640;lpMMI->ptMinTrackSize.y = 480;//調整最大高度與寬度,如果需要的話lpMMI->ptMaxTrackSize.x = 1366;lpMMI->ptMaxTrackSize.y = 768;CFrameWnd::OnGetMinMaxInfo(lpMMI); }

WM_GETMINMAXINFO的處理簡單易懂,無需繁雜的計算即可限定窗口的拖放大小等信息。


下面我接著寫自己遇到的問題。我的對話框是Popup無邊框對話框,本打算用上面的二或者三方法解決限制窗口大小的問題,卻發現對話框接收不到WM_SIZING和WM_GETMINMAXINFO消息,而用WM_SIZE解決方案有有點丑陋,于是想到了能不能響應WM_WINDOWPOSCHANGING消息解決,還好,可以這此消息里設置對話框的大小:

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;}}
結論嘛就是在無邊框對話框是不響應 WM_SIZING和 WM_GETMINMAXINFO消息的(我想這是因為沒有Resizing屬性導致),但是呢可以使用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.

根據上面所寫,只有窗口具有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;}}


總結

以上是生活随笔為你收集整理的如何设置对话框的最大(小)高度与宽度的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。