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

MFC CStatusBarCtrl 狀態欄控件完整開發指南

     編輯:VC 教學

狀態欄控件概覽

CStatusBarCtrl 封裝了 Windows 公共控件庫(Comctl32.dll)中的狀態欄控件,位於父窗口底部的水平條帶,可分割為多個窗格顯示狀態信息、提示文本、進度指示等。相比框架類 CStatusBar,CStatusBarCtrl 提供更底層、精細的控制能力。

創建與初始化

1. 動態創建


CStatusBarCtrl m_wndStatusBar;

// 在 OnCreate 或 OnInitialUpdate 中創建
BOOL CMyView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CView::OnCreate(lpCreateStruct) == -1) return -1;

    CRect rect(0, 0, 0, 0); // 初始矩形,稍後調整
    DWORD dwStyle = WS_CHILD | WS_VISIBLE | CCS_BOTTOM | SBARS_SIZEGRIP;
    
    if (!m_wndStatusBar.Create(dwStyle, rect, this, AFX_IDW_STATUS_BAR))
    {
        TRACE0("狀態欄創建失敗\n");
        return -1;
    }

    // 設置窗格劃分(3個窗格,右邊界坐標)
    int nParts[] = { 150, 300, -1 }; // -1 表示最後一個窗格延伸至右邊
    m_wndStatusBar.SetParts(3, nParts);

    // 設置邊框間距(水平、垂直、矩形間距)
    m_wndStatusBar.SetBorders(2, 2, 2);

    // 初始文本
    m_wndStatusBar.SetPaneText(0, _T("就緒"));
    m_wndStatusBar.SetPaneText(1, _T("行: 1, 列: 1"));
    m_wndStatusBar.SetPaneText(2, _T("INS"));

    return 0;
}

2. 風格標誌說明

風格效果
CCS_BOTTOM固定在父窗口底部(默認)
CCS_TOP固定在頂部
CCS_NODIVIDER無頂部分隔線
CCS_NOHILITE無高亮邊框
SBARS_SIZEGRIP右下角顯示調整大小手柄
SBARS_TOOLTIPS窗格支持工具提示

核心功能 API

函數用途關鍵參數
SetParts設置窗格數量及右邊界nParts 數組,-1 表示自動延伸
GetParts獲取窗格右邊界坐標輸出數組
SetPaneText設置窗格文本索引(0 基)、文本、是否高亮
GetPaneText獲取窗格文本索引、緩衝區、長度
GetRect獲取窗格矩形區域索引、輸出 RECT
SetBorders設置邊框間距水平、垂直、矩形間距
GetBorders獲取邊框間距輸出三個 int
SetIcon設置窗格圖標索引、HICON
SetTipText設置工具提示文本索引、提示文本(需 SBARS_TOOLTIPS)

實戰技巧:滑鼠座標實時顯示

在 CView 派生類中處理 WM_MOUSEMOVE,更新狀態欄:


void CMyView::OnMouseMove(UINT nFlags, CPoint point)
{
    // 1. 客戶區坐標轉邏輯坐標(視圖縮放/滾動環境下必須)
    CClientDC dc(this);
    OnPrepareDC(&dc);
    dc.DPtoLP(&point);

    // 2. 獲取主框架狀態欄指針
    CFrameWnd* pFrame = (CFrameWnd*)AfxGetMainWnd();
    CStatusBar* pStatusBar = (CStatusBar*)pFrame->GetDescendantWindow(AFX_IDW_STATUS_BAR);
    
    if (pStatusBar)
    {
        CString strPos;
        strPos.Format(_T("X: %d  Y: %d"), point.x, point.y);
        pStatusBar->SetPaneText(0, strPos); // 第 0 個窗格
    }

    CView::OnMouseMove(nFlags, point);
}

進階應用:響應鼠標點擊事件

狀態欄發送 WM_NOTIFY 通知 NM_CLICK/NM_RCLICK,可在父窗口處理:


// 在框架類消息映射
ON_NOTIFY(NM_CLICK, AFX_IDW_STATUS_BAR, OnStatusBarClick)
ON_NOTIFY(NM_RCLICK, AFX_IDW_STATUS_BAR, OnStatusBarRClick)

void CMainFrame::OnStatusBarClick(NMHDR* pNMHDR, LRESULT* pResult)
{
    NMMOUSE* pMouse = (NMMOUSE*)pNMHDR;
    int nPane = pMouse->dwItemSpec; // 被點擊窗格索引
    
    if (nPane == 2) // 第三個窗格:切換 INSERT/OVR 模式
    {
        CStatusBar* pBar = (CStatusBar*)GetDescendantWindow(AFX_IDW_STATUS_BAR);
        CString str = pBar->GetPaneText(2);
        pBar->SetPaneText(2, str == _T("INS") ? _T("OVR") : _T("INS"));
    }
    *pResult = 0;
}

MFC 框架類 CStatusBar vs CStatusBarCtrl

特性CStatusBar (框架類)CStatusBarCtrl (控件封裝)
創建方式CreateEx + SetIndicatorsCreate + SetParts
窗格標識命令 ID(如 ID_INDICATOR_CAPS)零基索引
自動更新閒置時自動更新指示器(CAPS/NUM/SCRL)需手動更新
彈出菜單支持右鍵顯示窗格顯示/隱藏菜單無內建支持
適用場景標準 MDI/SDI 主框架狀態欄自定義視圖、對話框、工具窗口嵌入狀態欄

常見問題排查

  • 窗格文本不顯示:確認 SetParts 已調用,窗格索引正確,父窗口 RecalcLayout 已調用。
  • 尺寸不正確:處理 WM_SIZE 時調用 CStatusBarCtrl::SetParts 重新計算,或依賴框架 RecalcLayout。
  • 高 DPI 模糊:清單清單啟用 DPI 感知,使用系統字體 GetStockObject(DEFAULT_GUI_FONT)。
  • 工具提示不彈出:創建時需包含 SBARS_TOOLTIPS 風格,調用 SetTipText 設置文本。
  • 圖標不顯示:HICON 需為有效句柄,尺寸建議 16x16,圖標生命周期需長於狀態欄。

總結

CStatusBarCtrl 提供了對狀態欄控件的完整底層控制,適合非標準框架場景或需要精細定製的應用。掌握窗格劃分、文本/圖標/提示設置、鼠標交互響應等核心技能,可構建專業級狀態顯示界面。標準 MDI/SDI 應用優先使用框架類 CStatusBar 以獲得自動指示器更新等便利功能。

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