承接前兩篇,本教程將簡單對話框升級為具備「視窗尺寸自適應、分頁標題自定義、啟動預設分頁、框架狀態儲存/還原」的軟體雛形。
// ClassWizard 添加 WM_SIZE 訊息處理
void CTutorial1Dlg::OnSize(UINT nType, int cx, int cy) {
CDialog::OnSize(nType, cx, cy);
if (IsWindow(m_wndMiniCtrl.m_hWnd)) {
m_wndMiniCtrl.MoveWindow(0, 0, cx, cy, FALSE);
}
}
BOOL CTutorial1Dlg::OnInitDialog() {
// ... 既有初始化 ...
CRect rt;
GetClientRect(&rt);
m_wndMiniCtrl.MoveWindow(0, 0, rt.Width(), rt.Height(), FALSE);
return TRUE;
}
OnFileExit COMMAND 處理void CTutorial1Dlg::OnFileExit() {
m_wndMiniCtrl.Save(); // 儲存框架狀態 (分頁位置、視窗安裝等)
CDialog::OnOK(); // 正常關閉對話框
}
對話框屬性 → General → Menu: IDR_MENU1
BOOL SetCaption(LPCTSTR strObjName, LPCTSTR strCaption);
m_wndMiniCtrl.SetCaption(_T("page1"), _T("Main"));
m_wndMiniCtrl.SetCaption(_T("page2"), _T("About"));
strObjName:XTML 中定義的頁面/空白視圖物件名稱strCaption:新標題文字BOOL SetActive(LPCTSTR strObjName);
m_wndMiniCtrl.SetActive(_T("page1")); // 確保每次啟動顯示 Main 頁
CAboutDlg : public CDialog,Style=Child, Border=None,隱藏 OK 按鈕CAboutDlg* m_pAboutDlg;m_pAboutDlg = new CAboutDlg(this);
m_pAboutDlg->Create(IDD_ABOUT_DIALOG, this);
m_wndMiniCtrl.SetWnd(_T("page2"), (long)m_pAboutDlg->GetSafeHwnd());
// 注意:安裝後可 delete m_pAboutDlg,視窗由 TangramMini 管理
// 若需保持指標可不 delete,但在 OnDestroy 中需 DestroyWindow


| 方法 | 用途 | 參數 |
|---|---|---|
MoveWindow(x,y,cx,cy) | 調整 TangramMiniCtrl 本身大小 | 標準 MFC 視窗方法 |
Save() | 持久化框架狀態 | 無 |
SetCaption(objName, caption) | 修改分頁/視圖標題 | 物件名、新標題 |
SetActive(objName) | 設定啟動顯示分頁 | 物件名 |
SetWnd(objName, hWnd) | 安裝視窗到空白視圖 | 物件名、HWND |
短短幾個 API 呼叫,賦予對話框專業軟體級介面能力:自適應佈局、分頁管理、狀態持久化、模組化視窗組合。這正是 TangramMini 「低代碼框架、高靈活業務」的設計哲學體現。