CStatusBarCtrl 封裝了 Windows 公共控件庫(Comctl32.dll)中的狀態欄控件,位於父窗口底部的水平條帶,可分割為多個窗格顯示狀態信息、提示文本、進度指示等。相比框架類 CStatusBar,CStatusBarCtrl 提供更底層、精細的控制能力。
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;
}
| 風格 | 效果 |
|---|---|
CCS_BOTTOM | 固定在父窗口底部(默認) |
CCS_TOP | 固定在頂部 |
CCS_NODIVIDER | 無頂部分隔線 |
CCS_NOHILITE | 無高亮邊框 |
SBARS_SIZEGRIP | 右下角顯示調整大小手柄 |
SBARS_TOOLTIPS | 窗格支持工具提示 |
| 函數 | 用途 | 關鍵參數 |
|---|---|---|
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;
}
| 特性 | CStatusBar (框架類) | CStatusBarCtrl (控件封裝) |
|---|---|---|
| 創建方式 | CreateEx + SetIndicators | Create + SetParts |
| 窗格標識 | 命令 ID(如 ID_INDICATOR_CAPS) | 零基索引 |
| 自動更新 | 閒置時自動更新指示器(CAPS/NUM/SCRL) | 需手動更新 |
| 彈出菜單 | 支持右鍵顯示窗格顯示/隱藏菜單 | 無內建支持 |
| 適用場景 | 標準 MDI/SDI 主框架狀態欄 | 自定義視圖、對話框、工具窗口嵌入狀態欄 |
SetParts 已調用,窗格索引正確,父窗口 RecalcLayout 已調用。WM_SIZE 時調用 CStatusBarCtrl::SetParts 重新計算,或依賴框架 RecalcLayout。GetStockObject(DEFAULT_GUI_FONT)。SBARS_TOOLTIPS 風格,調用 SetTipText 設置文本。HICON 需為有效句柄,尺寸建議 16x16,圖標生命周期需長於狀態欄。CStatusBarCtrl 提供了對狀態欄控件的完整底層控制,適合非標準框架場景或需要精細定製的應用。掌握窗格劃分、文本/圖標/提示設置、鼠標交互響應等核心技能,可構建專業級狀態顯示界面。標準 MDI/SDI 應用優先使用框架類 CStatusBar 以獲得自動指示器更新等便利功能。