MFC 預設浮動工具列標題列含「關閉」按鈕 (WS_SYSMENU)。某些專業軟體 (如全螢幕監控、嵌入式操作面板) 需禁止用戶誤關工具列。本文通過繼承 CToolBar 並處理 WM_WINDOWPOSCHANGED,動態修改父框架視窗樣式實現隱藏關閉鈕。

圖一 無「關閉」按鈕的浮動工具列
CMiniFrameWnd 作為父視窗包裹工具列CMiniFrameWnd 擁有 `WS_SYSMENU` 樣式,產生關閉按鈕
3. 攔截工具列 ON_WM_WINDOWPOSCHANGED,判斷是否進入浮動狀態
4. 取得父視窗 (`m_pDockBar->GetParent()`),確認為 `CMiniFrameWnd` 後呼叫 ModifyStyle(WS_SYSMENU, 0) 移除系統選單
5. 用成員變數 `m_bMenuRemoved` 防重複修改,停靠時恢復旗標
#pragma once
class CToolBarEx : public CToolBar {
DECLARE_DYNAMIC(CToolBarEx)
public:
CToolBarEx();
virtual ~CToolBarEx();
protected:
BOOL m_bMenuRemoved = FALSE; // 關閉鈕移除狀態旗標
afx_msg void OnWindowPosChanged(WINDOWPOS FAR* lpwndpos);
DECLARE_MESSAGE_MAP()
};
#include "StdAfx.h"
#include "ToolBarEx.h"
IMPLEMENT_DYNAMIC(CToolBarEx, CToolBar)
BEGIN_MESSAGE_MAP(CToolBarEx, CToolBar)
ON_WM_WINDOWPOSCHANGED()
END_MESSAGE_MAP()
CToolBarEx::CToolBarEx() {}
CToolBarEx::~CToolBarEx() {}
void CToolBarEx::OnWindowPosChanged(WINDOWPOS FAR* lpwndpos) {
CToolBar::OnWindowPosChanged(lpwndpos);
if (IsFloating()) { // 浮動狀態
if (m_pDockBar && !m_bMenuRemoved) {
CWnd* pParent = m_pDockBar->GetParent();
if (pParent->IsKindOf(RUNTIME_CLASS(CMiniFrameWnd))) {
pParent->ModifyStyle(WS_SYSMENU, 0, 0); // 移除系統選單
m_bMenuRemoved = TRUE;
}
}
}
else if (m_bMenuRemoved) { // 重新停靠
m_bMenuRemoved = FALSE;
}
}
繼承 `CToolBar` + 攔截 `WM_WINDOWPOSCHANGED` + 修改 `CMiniFrameWnd` 樣式,以極少代碼實現精準控制。此模式同樣適用於隱藏最小化/最大化按鈕、自定義標題列高度等進階需求。