TangramMini 是一款輕量級 ActiveX 組件,專為 MDI/SDI 應用程式框架快速搭建設計。本文示範在 MFC MDI 專案中動態建立 TangramMiniCtrl、載入 XTML 框架定義檔、將 MDI 客戶區嵌入 Tangram 空白視圖,實現可視化佈局配置與執行時動態調整。
TangramMini_i.c、TangramMini_i.h 至專案目錄stdafx.h 匯入:#include "TangramMini_i.c" → #include "TangramMini_i.h" (先 .c 後 .h 避免編譯錯誤)class CMainFrame : public CMDIFrameWnd {
// ...
ITangramMiniB2C* m_pMiniB2C; // 輔助建立 TangramMiniCtrl
ITangramMiniCtrl* m_pMiniCtrl; // 核心控制介面
};
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) {
if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1) return -1;
CoInitialize(NULL); // COM 單元模型初始化
HRESULT hr = CoCreateInstance(CLSID_TangramMiniB2C, NULL,
CLSCTX_INPROC_SERVER, IID_ITangramMiniB2C, (LPVOID*)&m_pMiniB2C);
if (SUCCEEDED(hr) && m_pMiniB2C) {
// 設定父視窗為主框架
m_pMiniB2C->put_TargetHandle((LONG)m_hWnd);
// 取得 TangramMiniCtrl 介面
VARIANT_BOOL bSucceed;
m_pMiniB2C->get_TangramMiniCtrl(&m_pMiniCtrl);
// 載入 XTML 框架定義檔
m_pMiniCtrl->LoadFile(L"test.xtml", &bSucceed);
// 關鍵:將 MDI 客戶區嵌入指定 Tangram 空白視圖
// 參數:空白視圖名稱、MDI 客戶區句柄(0=自動)、MDI 風格(0-3)
m_pMiniCtrl->SetMDIClient(L"Page1_S0001_S0000", 0, 3, &bSucceed);
}
return 0;
}
BOOL SetMDIClient(BSTR strObjName, LONG nMDIHandle, LONG nMDIStyle);
| 參數 | 說明 |
|---|---|
strObjName | XTML 中定義的空白視圖物件名稱 (如 Page1_S0001_S0000) |
nMDIHandle | MDI 客戶區視窗句柄,0 表示自動尋找主框架的 m_hWndMDIClient |
nMDIStyle | 客戶區標籤風格:0=無標籤, 1=底部標籤, 2=頂部標籤, 3=頂部標籤+關閉按鈕 (圖示風格) |
test.xtml 由 TangramMini 設計器 (XTML Designer) 視覺化編輯生成,定義:
<Page name="Page1"><Splitter> 水平/垂直分割<BlankView name="Page1_S0001_S0000"> 供外部視窗嵌入本範例直接使用 SDI 教程中的 test.xtml,展示 TangramMini 跨 SDI/MDI 共用框架定義的能力。

m_pMiniCtrl->SetMDIClient(L"Page1_S0000", 0, 0, &bSucceed);

m_pMiniCtrl->SetWnd(L"BlankViewName", (LONG)hWnd) 將任意 HWND 嵌入指定空白視圖SetCaption(L"Page1", L"主工作區")SetActive(L"Page1")Save() / LoadFile() 實現使用者個性化佈局持久化TangramMini 在 MDI 中的核心價值:將傳統難以視覺化配置的 MDI 客戶區、分割視窗、標籤頁管理,轉化為可視化 XTML 定義 + 幾行 COM 呼叫。開發者專注業務邏輯視窗開發,框架佈局交給設計器與組件處理,大幅降低 MDI 應用開發複雜度。