首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

MFC 消息機制探討:OnSize 觸發原理與通過子類化攔截 WM_SIZE 消息

     編輯:程式設計疑難解答

消息觸發鏈路

MoveWindow() / SetWindowPos()
      ↓
發送 WM_WINDOWPOSCHANGING → WM_WINDOWPOSCHANGED
      ↓
發送 WM_SIZE (wParam: SIZE_RESTORED/MAXIMIZED/MINIMIZED, lParam: 新寬高)
      ↓
CWnd::OnWndMsg() 分發 → 虛函數 OnSize(UINT nType, int cx, int cy)

關鍵點

  • MoveWindow 調用會觸發 OnSize,而非相反。在 OnSize 中再調用 MoveWindow 會導致無限遞歸。
  • WM_SIZE 在窗口大小已改變後發送,此時 GetClientRect 已反映新尺寸。
  • 最小化/最大化/還原均觸發,nType 參數區分狀態。

攔截 WM_SIZE 的方法:子類化

// 在目標窗口創建後調用
WNDPROC oldProc = (WNDPROC)SetWindowLong(hWnd, GWL_WNDPROC, (LONG)MyWndProc);

// 自定義窗口過程
LRESULT CALLBACK MyWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
    if (msg == WM_SIZE) {
        // 自定義處理:如禁止縮放、記錄尺寸、條件繼傳
        if (shouldBlockResize) return 0; // 吞噬消息
    }
    return CallWindowProc(oldProc, hWnd, msg, wParam, lParam);
}

MFC 封裝:CWnd::SubclassWindow + 重寫 WindowProc 虛函數。

應用場景

  • 固定窗口大小(禁止用戶拖動邊框)。
  • 同步多視圖尺寸(如分割窗口聯動)。
  • 最小化時暫停渲染/計時器。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved