我们先新建一个对话框工程(单文档默认有工具栏,其他操作是一样的,这里就以对话框为例子了)

我们切换到资源视图,点击右键,添加资源

选择ToolBar 然后点新建按钮

多了一个ToolBar的文件夹,我们展开它

在IDR_TOOLBAR1上点右键 属性 给他改个有意义的名字

然后双击IDR_TOOLBAR1,可以看到下图的窗口,上面的A是可以在工具栏上的每一个东西上面写字,默认只有一个,当你给第一个写了字 或者画了东西,他会再创建一个出来,

我们在工具栏上分别写上dbgpro.com 如下图

好了 至此,工具栏资源已经创建完毕,怎么让他显示出来呢~

先给对话框类添加一个成员

CToolBar m_wndToolBar;

然后在对话框的初始化函数添加创建以及显示工具栏的代码

if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD |
WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS |
CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_TOOLBARDEMO))
{
EndDialog(IDCANCEL);
}
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST, 0);
m_wndToolBar.MoveWindow(10, 10, 500, 25, 1);
RepositionBars()函数–显示工具栏、状态栏 具体参数和用法请查MSDN

运行看看 工具栏是不是可以显示了

但是,点工具栏上的按钮还是没反应,为什么呢,因为我们还没写消息响应函数,我们切换到资源视图,双击工具条,

这里的 D B G P R O . C O M每一个按钮都是可以右键 然后属性 改ID的,我们先改个 id 我打算 改成 IDC_D 、IDC_B……这样的


然后我们在类视图,找到我们的对话框类,然后右键 类向导


在类向导对话框中,找到我们的对话框类,然后找到工具栏按钮的ID,添加COMMAND消息的处理函数



在消息处理函数中添加我们的代码



运行看看效果

工具栏上面的按钮可以跟菜单的ID一样,这样 点击工具栏上的按钮和点击某个菜单的功能就是一样的了,如果工具栏某个按钮和菜单ID一样,写了菜单的消息响应 就可以不用写工具栏按钮的消息处理函数了

工具栏的停靠

       在创建好工具栏后,如果想要停靠工具栏,也需要添加相应的停靠代码。工具栏停靠的步骤及需要调用的函数如下(前两个步骤可以颠倒顺序):

       1. 在框架窗口中启用停靠。

           若要将工具栏停靠到某个框架窗口,则必须启用该框架窗口(或目标)以允许停靠。可以在CFrameWndEx类中调用下面的成员函数来实现:

           BOOL EnableDocking(DWORD dwDockStyle);

           该函数采用一个DWORD参数,用来指定框架窗口的哪个边可以接受停靠,可以有四种取值:CBRS_ALIGN_TOP(顶部)、CBRS_ALIGN_BOTTOM(底部)、CBRS_ALIGN_LEFT(左侧)、CBRS_ALIGN_RIGHT(右侧)。如果希望能够将控制条停靠在任意位置,将CBRS_ALIGN_ANY作为参数传递给EnableDocking。

       2. 工具栏启用停靠。

           框架窗口启用停靠准备好后,必须以相似的方式准备工具栏。为想要停靠的每一个工具栏CMFCToolBar对象调用下面的函数:

           virtual void EnableDocking(DWORD dwAlignment);

           允许工具栏停靠到框架窗口,并指定工具栏应停靠的目标边。此函数指定的目标边必须与框架窗口中启用停靠的边匹配,否则工具栏无法停靠,为浮动状态。

       3. 停靠工具栏。

           当用户试图将工具栏放置在允许停靠的框架窗口某一边时,需要框架CFrameWndEx类调用以下函数:

           void DockPane(CBasePane* pBar,UINT nDockBarID=0,LPCRECT lpRect=NULL);

           参数pBar为要停靠的控制条的指针,参数nDockBarID为要停靠的框架窗口某条边的ID,可以是以下四种取值:AFX_IDW_DOCKBAR_TOP、AFX_IDW_DOCKBAR_BOTTOM、AFX_IDW_DOCKBAR_LEFT、AFX_IDW_DOCKBAR_RIGHT。

 CToolBar类的主要成员函数

 virtual BOOL CreateEx(
                 CWnd* pParentWnd,
                 DWORD dwCtrlStyle = TBSTYLE_FLAT,
                 DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP,
                 CRect rcBorders = CRect(0, 0, 0, 0),
                 UINT nID = AFX_IDW_TOOLBAR
        );

       创建工具栏对象。参数pParentWnd为工具栏父窗口的指针。参数dwCtrlStyle为工具栏按钮的风格,默认为TBSTYLE_FLAT,即“平面的”。参数dwStyle为工具栏的风格,默认取值WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP,由于是主框架窗口的子窗口,所以要有WS_CHILD和WS_VISIBLE风格,CBRS_ALIGN_TOP风格表示工具栏位于父窗口的顶部, 各种风格可以参见MSDN的Toolbar Control and Button Styles中的定义。参数rcBorders为工具栏边框各个方向的宽度,默认为CRect(0, 0, 0, 0),即没有边框。参数nID为工具栏子窗口的ID,默认为AFX_IDW_TOOLBAR。

       BOOL LoadBitmap(UINT nIDResource);

       为工具栏加载位图。参数nIDResource为位图资源的ID。成功则返回TRUE,否则返回FALSE。注意,这里的位图资源应当为每个工具栏按钮都提供位图,如果图片不是标准大小(16像素宽,15像素高),则需要调用SetSizes成员函数调整按钮大小和图片大小。

       BOOL LoadToolBar(UINT nIDResource);

       加载由nIDResource指定的工具栏。参数nIDResource为要加载的工具栏的资源ID。成功则返回TRUE,否则返回FALSE。

       void SetSizes(SIZE sizeButton,SIZE sizeImage);

       设置工具栏按钮的大小和图片的大小。参数sizeButton为工具栏按钮的像素大小。参数sizeImage为图片的像素大小。

       void SetButtonStyle(int nIndex,UINT nStyle);

       设置工具栏按钮或分隔线的风格,或者为按钮分组。参数nIndex为将要进行设置的按钮或分隔线的索引。参数nStyle为按钮风格,可以是以下取值:

       TBBS_BUTTON   标准按钮(默认)
       TBBS_SEPARATOR   分隔条 
       TBBS_CHECKBOX   复选框 
       TBBS_GROUP   标记一组按钮的开始
       TBBS_CHECKGROUP   标记一组复选框的开始
       TBBS_DROPDOWN   创建下拉列表按钮
       TBBS_AUTOSIZE   按钮的宽度根据按钮文本计算,而不基于图片大小 
       TBBS_NOPREFIX   按钮的文本没有快捷键前缀

       UINT GetButtonStyle(int nIndex) const;

       获取工具栏按钮或分隔条的风格。风格可参考SetButtonStyle。参数nIndex为按钮或分隔条的索引。

       BOOL SetButtonText(int nIndex,LPCTSTR lpszText);

       设置工具栏按钮的文本。参数nIndex为工具栏按钮的索引。参数lpszText为指向要设置的文本字符串的指针。设置成功则返回TRUE,否则返回FALSE。

       CString GetButtonText(int nIndex) const;

       获取工具栏按钮上显示的文本。参数nIndex为工具栏按钮的索引。