MFC CDialogBar 需掛載於 CFrameWnd 衍生類(如 CMainFrame)才能正常運作。對話框專案(CDialog 基礎)缺乏 Frame 視窗,直接建立 CDialogBar 會失敗。本文提供一個可復用的 CStTbar 類別,透過建立隱藏的 CMiniFrameWnd 容器,在對話框中完美嵌入 CDialogBar,支援停靠、浮動、工具提示等完整功能。
// 1. 迷你框架視窗:轉發命令訊息給父視窗(對話框)
class CMyMiniFrm : public CMiniFrameWnd {
BOOL OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo) {
BOOL br = GetParent()->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo); // 先讓父視窗處理
CMiniFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo); // 再走預設流程
return br;
}
};
// 2. 靜態控制項衍生類:作為 DialogBar 的佔位符與建立器
class CStTbar : public CStatic {
CMyMiniFrm* m_minifrm;
CDialogBar m_wndMyDialogBar;
void PreSubclassWindow() {
CStatic::PreSubclassWindow();
CRect rt; GetWindowRect(&rt); GetParent()->ScreenToClient(&rt);
ShowWindow(SW_HIDE); // 隱藏佔位符
m_minifrm = new CMyMiniFrm();
m_minifrm->Create(AfxRegisterWndClass(0), _T(""), WS_VISIBLE|WS_CHILD, rt, GetParent());
// 建立 DialogBar 掛載到 m_minifrm
if (!m_wndMyDialogBar.Create(m_minifrm, GetDlgCtrlID(),
CBRS_RIGHT|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_HIDE_INPLACE, CG_ID_VIEW_MYDIALOGBAR)) {
TRACE0("Failed to create dialog bar\n"); return;
}
m_wndMyDialogBar.EnableDocking(CBRS_ALIGN_LEFT|CBRS_ALIGN_RIGHT);
m_minifrm->EnableDocking(CBRS_ALIGN_ANY);
// 依佔位符寬高決定初始停靠方向
if (rt.Width() > rt.Height()) m_minifrm->DockControlBar(&m_wndMyDialogBar, CBRS_ALIGN_LEFT);
else m_minifrm->DockControlBar(&m_wndMyDialogBar, CBRS_ALIGN_RIGHT);
m_minifrm->RecalcLayout();
}
// 轉發閒置更新訊息給 DialogBar
void PreTranslate(MSG* pMsg) {
if (m_wndMyDialogBar.IsWindowVisible())
m_wndMyDialogBar.OnUpdateCmdUI(m_minifrm, TRUE);
}
// 清理
~CStTbar() {
if (m_minifrm) { m_minifrm->DestroyWindow(); delete m_minifrm; }
}
};
CStTbar.h/.cpp 加入專案IDC_MY_DIALOGBAR(或自訂),大小即為 DialogBar 初始區域CStTbar,變數名如 m_wndNavBarIDD_MY_DIALOGBAR,並用類別向導建立對應類別 CMyDialogBar : public CDialogCStTbar::PreSubclassWindow 中將 CG_ID_VIEW_MYDIALOGBAR 對應到 IDD_MY_DIALOGBAR,或修改 Create 參數直接指定資源 ID

OnCmdMsg 先讓父對話框處理,保證按鈕/選單命令正常觸發PreTranslate 呼叫 OnUpdateCmdUI 讓工具列按鈕狀態(啟用/禁用/勾選)正常運作CMyMiniFrm 在 OnNcDestroy 自動 delete this,CStTbar 解構時銷毀框架視窗完整原始碼請參考本文配套下載。此方案在 VC6.0+Win2000 驗證通過,亦適用於新版 MFC。