三個常見 UI 控制需求的 MFC 實作方案。
於 OnInitDialog 或建構函式中執行:
// 方法一:ModifyMenu
CMenu* pSysMenu = GetSystemMenu(FALSE);
pSysMenu->ModifyMenu(SC_CLOSE, MF_BYCOMMAND | MF_GRAYED);
// 方法二:EnableMenuItem (推薦,語意更清晰)
CMenu* pSysMenu = GetSystemMenu(FALSE);
pSysMenu->EnableMenuItem(SC_CLOSE, MF_BYCOMMAND | MF_GRAYED);
MF_GRAYED 使選單項變灰不可用;若需完全隱藏可用 MF_REMOVE。
建立 CToolBar 衍生類 (如 CMyToolBar),重寫滑鼠按下/雙擊訊息:
void CMyToolBar::OnLButtonDown(UINT nFlags, CPoint point) {
if (IsFloating()) {
CWnd* pDockBar = GetParent();
CWnd* pMiniFrame = pDockBar->GetParent(); // CMiniFrameWnd
pMiniFrame->ModifyStyle(WS_SYSMENU, 0); // 移除系統選單
pMiniFrame->ShowWindow(SW_HIDE); // 重繪生效
pMiniFrame->ShowWindow(SW_SHOW);
}
CToolBar::OnLButtonDown(nFlags, point);
}
void CMyToolBar::OnLButtonDblClk(UINT nFlags, CPoint point) {
if (IsFloating()) {
CWnd* pDockBar = GetParent();
CWnd* pMiniFrame = pDockBar->GetParent();
pMiniFrame->ModifyStyle(WS_SYSMENU, 0);
pMiniFrame->ShowWindow(SW_HIDE);
pMiniFrame->ShowWindow(SW_SHOW);
}
CToolBar::OnLButtonDblClk(nFlags, point);
}
重寫 PreCreateWindow 移除 WS_MAXIMIZEBOX 風格:
BOOL CMyFrameWnd::PreCreateWindow(CREATESTRUCT& cs) {
cs.style &= ~WS_MAXIMIZEBOX;
return CFrameWnd::PreCreateWindow(cs);
}
Visual C++ 6.0 / Visual Studio 2005+ / MFC 所有版本通用。