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

VC++ 精華教程:MFC 入門系列(四)—— 工具欄與狀態欄實現

     編輯:VC++

作者:zhoujiamurong | 郵箱:zhoujiamurong@163.com
版權所有,轉載請聯繫作者。

前言

本節將為程序添加專業應用必備的工具欄與狀態欄。作者近期赴西安進修,仍堅持更新,感謝讀者支持。

類別分析:CToolBar 與 CStatusBar

CToolBar 繼承體系
CToolBar 繼承鏈:CToolBar → CControlBar → CWnd

CStatusBar 繼承體系
CStatusBar 同樣繼承自 CWnd

結論:工具欄與狀態欄本質都是窗口(繼承自 CWnd),這符合 Windows「萬物皆窗口」的設計哲學。

實現步驟

1. 定義成員變量並創建窗口

#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);
    }
    // ... 消息映射同前 ...
};

2. 在 OnCreateClient 中初始化(關鍵時機)

主窗口創建完成後,框架自動調用 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;
}

關鍵技術細節

  • 位圖切割:工具欄使用單一條狀位圖,按 16×15 自動切割為各按鈕圖標。
  • 按鈕啟用條件:工具欄按鈕初始灰色不可用,必須提供對應的 ON_COMMAND 消息映射與 String Table 才會啟用。
  • 狀態欄窗格:SetIndicators 的第一個參數 0 代表可變寬度的主窗格,後續為固定寬度指示器(如大寫鎖定、數字鎖定)。

下一節我們將添加消息映射讓工具欄按鈕生效,並實現狀態欄顯示滑鼠座標。

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