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

組語實作 MDI 多文件視窗應用程式完整教學

     編輯:組合語言

前言

MDI (Multiple Document Interface) 允許單一應用程式視窗內同時開啟多個子視窗(如 Word、Excel)。本文完整說明組語建立 MDI 架構的步驟:框架視窗、用戶端視窗、子視窗類別註冊、訊息迴路與常用 MDI 訊息處理。

MDI 架構層級

框架視窗 (Frame Window)
  └─ 用戶端視窗 (Client Window, 類別 "MDICLIENT")
        ├─ MDI 子視窗 1
        ├─ MDI 子視窗 2
        └─ ...
  • 框架視窗:主視窗,處理選單、工具列、協調子視窗。
  • 用戶端視窗:覆蓋框架用戶區的特殊視窗,實際為所有 MDI 子視窗的父視窗。
  • MDI 子視窗:文件視窗,可最大化、最小化、平鋪、重疊排列。

關鍵 API 差異

建立框架視窗

  1. 註冊框架視窗類別(WNDCLASSEX,lpfnWndProc 指向 WndProc)。
  2. CreateWindowEx 建立視窗,風格含 WS_CLIPCHILDREN。

建立用戶端視窗

在框架視窗 WM_CREATE 中:

LOCAL ClientStruct:CLIENTCREATESTRUCT
invoke GetMenu, hWnd
mov hMainMenu, eax
invoke GetSubMenu, hMainMenu, 1          ; 取得「視窗」選單控制代碼
mov ClientStruct.hWindowMenu, eax
mov ClientStruct.idFirstChild, 100       ; 子視窗選單 ID 起始值(不可為 0)

invoke CreateWindowEx, NULL, "MDICLIENT", NULL, \
    WS_CHILD or WS_VISIBLE or WS_CLIPCHILDREN, \
    CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, \
    hWnd, NULL, hInstance, addr ClientStruct
mov hwndClient, eax
  • hWindowMenu:指定哪個子選單顯示子視窗清單(通常是「視窗」選單)。
  • idFirstChild:第一個子視窗的選單 ID,建議 ≥ 100。

建立 MDI 子視窗

兩種方式:

  1. WM_MDICREATE:送訊息給用戶端視窗,lParam 傳 MDICREATESTRUCT。所有子視窗共用框架視窗執行緒。
  2. CreateMDIWindow:為每個子視窗建立獨立執行緒,避免長時間運算凍結整個應用程式。
; 方式一:WM_MDICREATE
.data?
mdicreate MDICREATESTRUCT <>
.code
; 初始化 mdicreate 結構...
invoke SendMessage, hwndClient, WM_MDICREATE, 0, addr mdicreate

常用 MDI 訊息

項目SDI (單文件)MDI
預設視窗程序DefWindowProcDefFrameProc (多一個 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。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved