作者:zhoujiamurong | 郵箱:zhoujiamurong@163.com
版權所有,轉載請聯繫作者。
本節將為程序添加專業應用必備的工具欄與狀態欄。作者近期赴西安進修,仍堅持更新,感謝讀者支持。

CToolBar 繼承鏈:CToolBar → CControlBar → CWnd

CStatusBar 同樣繼承自 CWnd
結論:工具欄與狀態欄本質都是窗口(繼承自 CWnd),這符合 Windows「萬物皆窗口」的設計哲學。
#include <afxwin.h>
#include <afxext.h> // MFC 擴展類頭文件
#include "resource.h"
class CMainFrame : public CFrameWnd {
public:
CToolBar m_wndToolBar;
CStatusBar m_wndStatusBar;
CMainFrame() {
Create(NULL, _T("MFC Window"), WS_OVERLAPPEDWINDOW, rectDefault,
NULL, MAKEINTRESOURCE(IDR_MENU1), 0, NULL);
}
// ... 消息映射同前 ...
};
主窗口創建完成後,框架自動調用 OnCreateClient,此時創建子控件最恰當(「皮之不存,毛將焉附」)。
BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) {
// 工具欄按鈕 ID 數組(需對應資源中的位圖按鈕順序)
UINT toolIDs[] = { ID_DISPLAY_UP, ID_DISPLAY_DOWN,
ID_DISPLAY_LEFT, ID_DISPLAY_RIGHT };
// 狀態欄窗格 ID 數組(0 表示分隔符)
UINT statusIDs[] = { 0, ID_INDICATOR_NUM, ID_INDICATOR_CAPS };
// 創建工具欄
m_wndToolBar.Create(this, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_FLYBY);
m_wndToolBar.LoadBitmap(IDB_BITMAP1); // 載入條狀位圖(16x15 單元)
m_wndToolBar.SetButtons(toolIDs, 4); // 綁定按鈕 ID
// 創建狀態欄
m_wndStatusBar.Create(this);
m_wndStatusBar.SetIndicators(statusIDs, 3);
return TRUE;
}
ON_COMMAND 消息映射與 String Table 才會啟用。SetIndicators 的第一個參數 0 代表可變寬度的主窗格,後續為固定寬度指示器(如大寫鎖定、數字鎖定)。下一節我們將添加消息映射讓工具欄按鈕生效,並實現狀態欄顯示滑鼠座標。