簡體   English   中英

在 MFC 中調整控件大小

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM