首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

VC++ 技巧:移除浮動工具列「關閉」按鈕的自定義類實現

     編輯:VC 教學

需求場景

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

效果展示

無關閉按鈕的浮動工具列
圖一 無「關閉」按鈕的浮動工具列

核心原理

  1. 工具列浮動時,MFC 建立 CMiniFrameWnd 作為父視窗包裹工具列
  2. 2. CMiniFrameWnd 擁有 `WS_SYSMENU` 樣式,產生關閉按鈕 3. 攔截工具列 ON_WM_WINDOWPOSCHANGED,判斷是否進入浮動狀態 4. 取得父視窗 (`m_pDockBar->GetParent()`),確認為 `CMiniFrameWnd` 後呼叫 ModifyStyle(WS_SYSMENU, 0) 移除系統選單 5. 用成員變數 `m_bMenuRemoved` 防重複修改,停靠時恢復旗標

完整代碼實現

ToolBarEx.h

#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()
};

ToolBarEx.cpp

#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;
    }
}

專案整合步驟

  1. 用 Class Wizard 新增 `CToolBarEx` 類,基類選 `CToolBar`
  2. 2. 在 `MainFrm.h` 將 `m_wndToolBar` 類型改為 `CToolBarEx` 3. 包含 `ToolBarEx.h`,編譯執行

技術細節補充

  • 為何不用 `WM_SIZE`? 僅尺寸改變觸發 `WM_SIZE`,位移不觸發;浮動涉及位置+尺寸變化,`WM_WINDOWPOSCHANGED` 更可靠。
  • 多工具列場景:每個工具列獨立處理,互不干擾。
  • 替代方案:重寫 `CFrameWnd::OnCreate` 中 `EnableDocking` 後攔截 `WM_NCCREATE` 修改 `CREATESTRUCT`,但較繁瑣。
  • 用戶體驗提示:隱藏關閉鈕時,建議提供右鍵選單「顯示/隱藏工具列」或快捷鍵,避免用戶無法恢復。

結語

繼承 `CToolBar` + 攔截 `WM_WINDOWPOSCHANGED` + 修改 `CMiniFrameWnd` 樣式,以極少代碼實現精準控制。此模式同樣適用於隱藏最小化/最大化按鈕、自定義標題列高度等進階需求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved