天天看點

【MFC】對話框中建立工具欄

00. 目錄

文章目錄

  • 00. 目錄
  • 01. 案例概述
  • 02. 開發環境
  • 03. 關鍵技術
  • 04. 程式設計
  • 05. 秘笈心法
  • 06. 源碼下載下傳
  • 07. 附錄

01. 案例概述

使用MFC向導可以建立基于文檔視圖結構的應用程式也可以建立基于對話框的應用程式,向導預設生成的文檔視圖結構的應用程式帶有工具欄,而對話框的應用程式沒有帶任何工具欄,本執行個體示範如何在對話框中建立工具欄,效果如下圖所示。

【MFC】對話框中建立工具欄

02. 開發環境

系統環境:​Windows 10​

開發環境:​Visual Studio 2019​

03. 關鍵技術

MFC提供了工具欄類​

​CToolBarCtrl​

​來建立工具欄。建立工具欄使用Create方法,向工具欄中添加按鈕使用AddButtons方法。

​Create方法:​

BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );
傳回值:如果成功則傳回非零值;否則傳回零。

參數: 
    dwStyle 指定工具條控件的風格。工具條必須總是具有WS_CHILD風格。另外,你可以為工具條指定在
    說明部分描述的工具條風格和視窗風格的任意組合。  

    rect 随意指定該工具條控件的尺寸和位置。它可以是一個CRect對象或一個RECT結構。  
    pParentWnd 指定工具條控件的父視窗。它不能是NULL。  
    nID 指定工具條控件的ID。      

​AddButtons方法​

BOOL AddButtons( int nNumButtons, LPTBBUTTON lpButtons );
功能
    該方法是用來設定工具欄上的按鈕。
參數描述
    nNumButtons:工具欄按鈕的數量。
    lpButtons:TBBUTTON結構體類型的指針。TBBUTTON結構體中包含了工具欄按鈕的指令ID值、圖示索引、按鈕名稱等資料成員。      

04. 程式設計

(1)建立一個基于對話框的應用程式。

(2)在CDialogToolBarDlg類中定義一個CToolBarCtrl對象和一個CImageList對象。

private:
  CToolBarCtrl m_ToolBarCtrl;
  CImageList m_ImageList;      

(3)在自定義函數InitToolBar中動态建立工具欄,函數實作代碼如下。

//初始化工具欄
void CMy3ToolBarDlg::InitToolBar()
{
  CString strPath;
  HICON hIcon;

  //建立圖像清單
  m_ImageList.Create(32, 32, ILC_COLOR32 | ILC_MASK, 0, 0);

  //向圖像清單中添加圖示
  for (int i = 0; i < 10; i++)
  {
    //擷取圖檔的路徑
    strPath.Format(TEXT(".\\res\\ico\\%02d.ico"), i);
    //加載圖示
    hIcon = (HICON)::LoadImage(NULL, strPath, IMAGE_ICON, 32, 32, LR_LOADFROMFILE);

    m_ImageList.Add(hIcon);
  }

  //建立工具欄
  m_ToolBarCtrl.Create(WS_CHILD | WS_VISIBLE, CRect(0, 0, 0, 0), this, 154231);
  //工具欄支援自動化
  m_ToolBarCtrl.EnableAutomation();
  //設定工具欄的圖像清單
  m_ToolBarCtrl.SetImageList(&m_ImageList);

  TBBUTTON button[11];

  for (int j = 0; j < 11; j++)
  {
    button[j].dwData = 0;
    //工具欄按鈕為可用
    button[j].fsState = TBSTATE_ENABLED;
    //工具欄按鈕樣式
    button[j].fsStyle = TBSTYLE_BUTTON;
  }

  //設定工具欄按鈕的指令ID值
  button[0].idCommand = ID_ADDDATA;
  //設定圖示索引
  button[0].iBitmap = 0;
  //設定工具欄按鈕名稱
  button[0].iString = m_ToolBarCtrl.AddStrings(TEXT("添加"));


  //設定工具欄按鈕的指令ID值
  button[1].idCommand = ID_UPDATEDATA;
  //設定圖示索引
  button[1].iBitmap = 1;
  //設定工具欄按鈕名稱
  button[1].iString = m_ToolBarCtrl.AddStrings(TEXT("修改"));


  //設定工具欄按鈕的指令ID值
  button[2].idCommand = ID_DELETEDATA;
  //設定圖示索引
  button[2].iBitmap = 2;
  //設定工具欄按鈕名稱
  button[2].iString = m_ToolBarCtrl.AddStrings(TEXT("删除"));

  button[3].fsStyle = TBSTYLE_SEP;


  //設定工具欄按鈕的指令ID值
  button[4].idCommand = ID_FIRSTDATA;
  //設定圖示索引
  button[4].iBitmap = 3;
  //設定工具欄按鈕名稱
  button[4].iString = m_ToolBarCtrl.AddStrings(TEXT("第一條"));


  //設定工具欄按鈕的指令ID值
  button[5].idCommand = ID_PREVIOUSDATA;
  //設定圖示索引
  button[5].iBitmap = 4;
  //設定工具欄按鈕名稱
  button[5].iString = m_ToolBarCtrl.AddStrings(TEXT("上一條"));


  //設定工具欄按鈕的指令ID值
  button[6].idCommand = ID_NEXTDATA;
  //設定圖示索引
  button[6].iBitmap = 5;
  //設定工具欄按鈕名稱
  button[6].iString = m_ToolBarCtrl.AddStrings(TEXT("下一條"));


  //設定工具欄按鈕的指令ID值
  button[7].idCommand = ID_LASTDATA;
  //設定圖示索引
  button[7].iBitmap = 6;
  //設定工具欄按鈕名稱
  button[7].iString = m_ToolBarCtrl.AddStrings(TEXT("末一條"));

  button[8].fsStyle = TBSTYLE_SEP;

  //設定工具欄按鈕的指令ID值
  button[9].idCommand = ID_SAVEDATA;
  //設定圖示索引
  button[9].iBitmap = 7;
  //設定工具欄按鈕名稱
  button[9].iString = m_ToolBarCtrl.AddStrings(TEXT("儲存"));


  //設定工具欄按鈕的指令ID值
  button[10].idCommand = ID_CANCELDATA;
  //設定圖示索引
  button[10].iBitmap = 8;
  //設定工具欄按鈕名稱
  button[10].iString = m_ToolBarCtrl.AddStrings(TEXT("取消"));

  //向工具欄中添加按鈕
  m_ToolBarCtrl.AddButtons(11, button);
  //自動調整工具欄的大小
  m_ToolBarCtrl.AutoSize();
  //設定工具欄的樣式
  m_ToolBarCtrl.SetStyle(TBSTYLE_FLAT | CCS_TOP);

}


BOOL CMy3ToolBarDlg::OnInitDialog()
{
  CDialogEx::OnInitDialog();

  // 将“關于...”菜單項添加到系統菜單中。

  // IDM_ABOUTBOX 必須在系統指令範圍内。
  ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  ASSERT(IDM_ABOUTBOX < 0xF000);

  CMenu* pSysMenu = GetSystemMenu(FALSE);
  if (pSysMenu != nullptr)
  {
    BOOL bNameValid;
    CString strAboutMenu;
    bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
    ASSERT(bNameValid);
    if (!strAboutMenu.IsEmpty())
    {
      pSysMenu->AppendMenu(MF_SEPARATOR);
      pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
    }
  }

  // 設定此對話框的圖示。  當應用程式主視窗不是對話框時,架構将自動
  //  執行此操作
  SetIcon(m_hIcon, TRUE);     // 設定大圖示
  SetIcon(m_hIcon, FALSE);    // 設定小圖示

  // TODO: 在此添加額外的初始化代碼
  InitToolBar();

  return TRUE;  // 除非将焦點設定到控件,否則傳回 TRUE
}      

05. 秘笈心法

​工具欄的建立方法​

CToolBarCtrl類是建立工具欄控件的類,而CToolBar類是建立工具欄的類,CToolBar類包含了CToolBarCtrl類,文檔視圖結構通常使用CToolBar類來建立工具欄,CToolBar類可以直接通過加載位圖來生成工具欄,也可以調用CToolBarCtrl對象進行工具欄的設定。

06. 源碼下載下傳

07. 附錄