天天看点

【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. 附录