MDI (Multiple Document Interface) 允許單一應用程式視窗內同時開啟多個子視窗(如 Word、Excel)。本文完整說明組語建立 MDI 架構的步驟:框架視窗、用戶端視窗、子視窗類別註冊、訊息迴路與常用 MDI 訊息處理。
框架視窗 (Frame Window)
└─ 用戶端視窗 (Client Window, 類別 "MDICLIENT")
├─ MDI 子視窗 1
├─ MDI 子視窗 2
└─ ...
| 項目 | SDI (單文件) | MDI |
|---|---|---|
| 預設視窗程序 | DefWindowProc | DefFrameProc (多一個 hwndClient 參數) |
| 訊息迴路 | TranslateMessage/DispatchMessage | 先呼叫 TranslateMDISysAccel 處理 Ctrl+F4、Ctrl+Tab 等系統加速鍵 |
| 子視窗程序 | 無 | 必須用 DefMDIChildProc 處理未捕獲訊息 |
| 訊息 | 用途 |
|---|---|
| WM_MDIACTIVATE | 啟用指定子視窗;子視窗可用此更新選單 |
| WM_MDICASCADE | 重疊排列子視窗 |
| WM_MDITILE | 平鋪排列(水平/垂直) |
| WM_MDIICONARRANGE | 整理最小化圖示 |
| WM_MDIDESTROY | 關閉子視窗(會正確還原框架標題) |
| WM_MDIGETACTIVE | 取得目前啟用子視窗控制代碼 |
| WM_MDIMAXIMIZE / WM_MDIRESTORE | 最大化/還原子視窗(勿用 ShowWindow SW_MAXIMIZE) |
| WM_MDINEXT | 啟用下一個/上一個子視窗 |
| WM_MDIREFRESHMENU | 重繪框架選單列 |
| WM_MDISETMENU | 替換框架完整選單或子選單(需配合 DrawMenuBar) |
範例包含:
MDIASMClass、子視窗類別 Win32asmMDIChild 註冊。TranslateMDISysAccel。WndProc 用 DefFrameProc。ChildProc 用 DefMDIChildProc,處理 WM_MDIACTIVATE 切換選單、WM_CLOSE 確認關閉並送 WM_MDIDESTROY。ml /c /coff mdi.asm
link /subsystem:windows mdi.obj
需連結 user32.lib、kernel32.lib。