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

用非模態對話框模擬 MDI 多文件介面

     編輯:關於VC++

圖:執行畫面,主視窗左側功能選單,右側多文件子視窗

標準 MDI 架構需大量 RUNTIME_CLASS 且難以在主視窗加入功能選單。本文提供 CMDIChild 類別,以非模態對話框模擬 MDI 效果,支援類似 Outlook 的主視窗+多文件子視窗架構。

實作步驟

1. 建立單文件專案

AppWizard 選 Single Document,基類 CFormView。

2. 加入 CMDIChild.h/.cpp

3. 主視窗類別加入成員

#include "MDIChild.h"
class CMainFrame : public CFrameWnd
{
    // ...
    CMDIChild m_Child;  // 核心管理物件
};

4. OnCreate 初始化

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    // ...
    RECT rect; SetRect(&rect, 0, 64, 800, 574);  // 子視窗活動區域(需手動計算)
    m_Child.InitMainWnd(this, &rect);
}

5. 選單命令開啟子視窗

#include "Dlg1.h"
void CMainFrame::OnDialog1()
{
    CDlg1* pDlg = NULL;
    char* sName = "功能1";  // 子視窗唯一名稱
    if (!m_Child.GetClassChild(sName))
    {
        pDlg = new CDlg1;
        if (!pDlg) return;
        pDlg->Create(IDD_DIALOG1, this);
    }
    m_Child.ADD((CView*)pDlg, sName);
}

技術細節

  • 非模態對話框具備獨立訊息迴圈,利用 SetWindowLong(hWnd, GWL_WNDPROC, ...) 攔截主視窗與子視窗訊息
  • MDIChildProc、MDIMainProc 處理標題列啟用/停用狀態切換
  • 子視窗以名稱管理,同類別可建立多實例(名稱須不同)

已知缺點

  • 無法自動計算客戶區大小,需強制主視窗最大化並手動設定矩形
  • 作者表示後續不再使用此方案

完整原始碼請下載本文附帶範例專案。

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