[英]Reposition dialog controls when resizing a dialog so that they are consistent between operating systems using mfc C++
[英]Resizing Controls in MFC
我正在編寫一個有兩個窗格的程序(通過CSplitter
),但是我在弄清楚調整每一幀中控件的大小時遇到了問題。 為簡單起見,有人可以告訴我如何為具有單個CEdit
控件的基本框架執行此操作嗎?
我相當確定它與CEdit::OnSize()
函數有關......但我並沒有真正到任何地方......
謝謝! :)
窗口在調整大小后立即收到 WM_SIZE 消息(由 MFC 中的 OnSize 處理程序處理),因此 CEdit::OnSize 不是您要查找的。
你應該在你的框架類和這個處理程序中添加 OnSize 處理程序,正如 Rob 指出的那樣,你將獲得框架客戶區的寬度和高度,然后你應該添加調整控件大小和位置的代碼。
像這樣的東西
void MyFrame::OnSize(UINT nType, int w, int h)
{
// w and h parameters are new width and height of your frame
// suppose you have member variable CEdit myEdit which you need to resize/move
myEdit.MoveWindow(w/5, h/5, w/2, h/2);
}
當您的框架收到 OnSize 消息時,它將為您提供新的寬度和高度 - 您可以簡單地調用 CEdit SetWindowPos 方法將這些值傳遞給它。
假設 CMyPane 是您的拆分器窗格,它包含您在 OnCreate 中創建的名為 m_wndEdit 的 CEdit:
void CMyPane::OnSize(UINT nType, int cx, int cy)
{
m_wndEdit.SetWindowPos(NULL, 0, 0, cx, cy, SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER);
}
GetDlgItem(IDC_your_slidebar)->SetWindowPos(...) // 實際上你可以移動、調整大小...等
為此,SetWindowPos 有點繁重。 MoveWindow 正是需要的。
其他人指出 WM_SIZE 是您應該在此時處理和調整子控件大小的消息。 WM_SIZE 在調整大小完成后發送。
您可能還想處理在調整大小進行時發送的 WM_SIZING 消息。 這將讓您在用戶仍在拖動鼠標時主動調整子窗口的大小。 處理 WM_SIZE 並不是絕對必要的,但它可以提供更好的用戶體驗。
我使用 CodeGuru 的 CResize 類自動調整所有控件的大小。 您告訴您希望如何調整每個控件的大小,它會為您完成工作。
調整大小范例是指定在調整對話框大小時控件的每一側將移動多少。
SetResize(IDC_EDIT1, 0, 0, 0.5, 1);
SetResize(IDC_EDIT2, 0.5, 0, 1, 1);
當您有大量對話框控件時非常方便。
當談到窗口大小更改時,您可能會對三種窗口消息感興趣: ON_WM_SIZE()
、 ON_WM_SIZING()
和ON_WM_GETMINMAXINFO()
。
正如官方文檔所說:
ON_WM_SIZE
的消息處理程序為::OnSize()
在 CWnd 的大小改變后觸發;ON_WM_SIZING
其消息處理程序是::OnSizing()
當clipbord-查看器窗口的客戶區的大小已經改變被觸發;ON_WM_GETMINMAXINFO
其消息處理程序為::OnGetMinMaxInfo()
每當窗口需要知道最大化位置或尺寸,或者最小或最大跟蹤尺寸時觸發。 如果您想將cwnd
的大小限制在某個范圍內,您可以參考消息ON_WM_GETMINMAXINFO
; 如果您想實時檢索大小變化,您可以參考其他兩個消息。
最好在屬性部分使用每個控件的動態布局功能。
假設你想要一個特定的控件,比如一個標題,總是在視圖/對話框的中心,那么你只需選擇控件的動態布局的屬性,移動類型為水平,移動 X 為 50,但你繼續調整大小無。 這樣,當您調整視圖大小時,標題始終位於中心。 您必須記住,在資源視圖中設計控件時,調整大小/移動的最小值是對話框/視圖中控件的大小/位置。
這樣,您可以節省幾何和變換的負擔。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.