跳轉到內容

Windows 程式設計/MDI 程式

來自華夏公益教科書,自由的教科書

多文件介面 (MDI) 應用程式是十分常見且受歡迎的應用程式型別。MDI 應用程式允許一個單一的程式視窗同時包含多個開啟的工作區。建立它們並不特別困難,本章將嘗試詳細解釋這一過程。

建立 MDI 的步驟

[編輯 | 編輯原始碼]

以下步驟用於建立 MDI 應用程式。我們將解釋每個步驟。

  1. 註冊框架和子視窗類。
  2. 修改訊息迴圈。
  3. 建立框架視窗。
  4. 建立 MDI 客戶區
  5. 使用客戶區建立 MDI 子視窗。

註冊視窗類

[編輯 | 編輯原始碼]

像任何其他 Windows 應用程式一樣,我們需要註冊視窗類。主視窗(框架,或“父”視窗)需要建立。框架視窗就像任何其他視窗一樣,但它們通常具有 COLOR_APPWORKSPACE 的背景色。此外,MDI 應用程式中的子視窗不允許擁有自己的選單,因此框架視窗必須管理應用程式選單。請記住,不同的子視窗通常需要不同的選單選項(或完全不同的選單),因此框架視窗需要維護一個當前活動子視窗的記錄,並相應地設定選單。

子視窗類(所有子視窗)需要使用 WS_CHILD 類建立。MDI 應用程式可以擁有任意數量的不同型別子視窗(一個著名的例子是 Microsoft Excel 中使用電子表格和圖表),它們都需要在使用前註冊。

修改訊息迴圈

[編輯 | 編輯原始碼]

MDI 應用程式使用一個幾乎正常的訊息迴圈,但如果你想在程式中使用加速鍵,你需要新增一個新的步驟

while(GetMessage(&msg, hwndFrame, 0, 0))
{
   if(!TranslateMDISysAccel(hwndClient, &msg) &&
      !TranslateAccelerator(hwndFrame, hAccel, &msg))
   {
       TranslateMessage(&msg);
       DispatchMessage(&msg);
   }
}

這樣,加速鍵就會被路由到所有不同子視窗中的正確目標。如果你沒有使用加速鍵,你就不需要擔心這一步。

框架視窗

[編輯 | 編輯原始碼]

框架視窗的建立方式與其他視窗相同。但是,請記住,框架視窗只是子視窗中發生的動作的背景,因此你應該避免在你的背景藝術上過於瘋狂或花哨。

客戶視窗

[編輯 | 編輯原始碼]

你需要建立一個型別為“MDICLIENT”的視窗。MDICLIENT 視窗在 Windows 內部定義,因此你不必擔心它是什麼或它做什麼。當你建立 MDI 客戶區視窗時,首先需要填寫 CLIENTCREATESTRUCT 結構中的欄位。你將指向該結構的指標作為 LPARAM 資料欄位傳遞到 CreateWindow 函式中。

MDI 子視窗

[編輯 | 編輯原始碼]

建立 MDI 子視窗與建立普通視窗略有不同。要建立 MDI 子視窗,你必須填寫 MDICREATESTRUCT 資料結構。MDICREATESTRUCT 與 WNDCLASS 結構非常相似,只是它更加有限。建立此結構後,你必須將其作為訊息傳送到 MDICLIENT 視窗

hwndChild = (HWND)SendMessage(hwndClient, WM_MDICREATE, 0, (LPARAM)mdicreatestruct);

訊息函式將返回一個指向新建立子視窗的控制代碼。

"視窗" 選單

[編輯 | 編輯原始碼]

許多 MDI 應用程式會在選單欄上提供一個“視窗”彈出選單,以管理 MDI 子視窗。此選單通常包含“平鋪”或“層疊”子視窗的選項,並且它通常會維護一個當前應用程式中可用子視窗的列表。事實證明,如果你只是將正確的選單控制代碼傳遞給它,MDI 客戶區視窗會為你管理這個選單。

下一章

[編輯 | 編輯原始碼]
華夏公益教科書