
圖:執行畫面,主視窗左側功能選單,右側多文件子視窗
標準 MDI 架構需大量 RUNTIME_CLASS 且難以在主視窗加入功能選單。本文提供 CMDIChild 類別,以非模態對話框模擬 MDI 效果,支援類似 Outlook 的主視窗+多文件子視窗架構。
AppWizard 選 Single Document,基類 CFormView。
#include "MDIChild.h"
class CMainFrame : public CFrameWnd
{
// ...
CMDIChild m_Child; // 核心管理物件
};
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
// ...
RECT rect; SetRect(&rect, 0, 64, 800, 574); // 子視窗活動區域(需手動計算)
m_Child.InitMainWnd(this, &rect);
}
#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 處理標題列啟用/停用狀態切換完整原始碼請下載本文附帶範例專案。