工具栏

1.基于对话框的工具栏:

效果图:

(1)首先在主对话框类中添加CToolBar类型的成员,属性设置为protected

class CToolBarDemoDlg : public CDialogEx
{
//省略
protected:
    CToolBar m_ToolBar;
//省略
};

(2)在资源视图中添加一个工具栏资源

这里添加了4个工具栏按钮...,工具栏ID命名为了IDR_TOOLBAR1,工具栏中4个按钮我分别命名为了ID_BUTTON_RED,ID_BUTTON_PINK,ID_BUTTON_BLUE,ID_BUTTON_YELLOW.

在Resource.h的形式如下,可以看到值是连续的...

#define ID_BUTTON_RED                   32771
#define ID_BUTTON_PINK                  32772
#define ID_BUTTON_BLUE                  32773
#define ID_BUTTON_YELLOW                32774

(3)在主对话框的初始化函数OnInitDialog创建工具栏对象,加载工具栏资源,显示工具栏

 1 BOOL CToolBarDemoDlg::OnInitDialog()
 2 {
 3     //省略
 4     //1.创建工具栏对象
 5     //2.加载工具栏资源
 6     if (!m_ToolBar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP | 
 7         CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
 8         !m_ToolBar.LoadToolBar(IDR_TOOLBAR1))
 9     {
10         TRACE0("Failed to create toolbar\n");
11         return -1;
12     }
13         
14     //显示工具栏
15     RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);
16     //省略  
17 }

此时编译运行的效果如下:

可以看出效果并不美观,那么如何给工具栏中的按钮添加美观的位图呢?

(4)在网上找自己喜欢的位图资源,我一般在http://www.easyicon.net/这个网站寻找位图...

这里我找了4张英雄联盟的位图资源...,将这几张位图导入到资源视图中

在Resource.h的形式如下,可以看到值也是连续的...

1 #define IDI_ICON1                       131
2 #define IDI_ICON2                       132
3 #define IDI_ICON3                       133
4 #define IDI_ICON4                       134

(5)在主对话框中添加一个CImageList类型的成员,属性设置为protected

1 class CToolBarDemoDlg : public CDialogEx
2 {
3 //省略
4 protected:
5     CImageList m_ImageList;
6 //省略
7 };

(6)在主对话框的初始化函数OnInitDialog创建CImageList对象,并向其中添加位图资源,然后绑定到工具栏

 1 BOOL CToolBarDemoDlg::OnInitDialog()
 2 {
 3     //省略
 4     //创建图像列表对象,宽度,高度均为48,32位色,背景透明
 5     m_ImageList.Create(48,48,ILC_COLOR32|ILC_MASK, 0,0);
 6 
 7     //向图像列表中循环添加4张位图    
 8     for (int i=0; i<4;i++)
 9     {
10         m_ImageList.Add(::LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1+i)));
11     }
12     
13     //创建工具栏对象,加载工具栏资源
14     if (!m_ToolBar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP | 
15         CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
16         !m_ToolBar.LoadToolBar(IDR_TOOLBAR1))
17     {
18         TRACE0("Failed to create toolbar\n");
19         return -1;
20     }
21 
22     //定义一个数组,存放工具栏中按钮的ID
23     UINT nArray[4];
24     for (int i=0;i<4;i++)
25     {
26         nArray[i]=ID_BUTTON_RED+i;
27     }
28 
29     //给工具栏绑定按钮数组
30     m_ToolBar.SetButtons(nArray,4);
31 
32     //设置按钮大小,按钮上显示的位图大小
33     m_ToolBar.SetSizes(CSize(55,55),CSize(48,48));
34 
35     //将图像列表绑定到工具栏
36     m_ToolBar.GetToolBarCtrl().SetImageList(&m_ImageList);
37     
38     //显示工具栏
39     RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);
40     //省略
41 }

编译运行的效果:

(7)给工具栏上面的按钮添加消息响应

首先在消息映射宏之间添加相应的项

1 BEGIN_MESSAGE_MAP(CToolBarDemoDlg, CDialogEx)
2     ON_COMMAND(ID_BUTTON_RED, &CToolBarDemoDlg::OnRed)
3     ON_COMMAND(ID_BUTTON_PINK, &CToolBarDemoDlg::OnPink)
4     ON_COMMAND(ID_BUTTON_BLUE, &CToolBarDemoDlg::OnBlue)
5     ON_COMMAND(ID_BUTTON_YELLOW, &CToolBarDemoDlg::OnYellow)
6 END_MESSAGE_MAP()

然后在主对话框类中添加消息响应函数的声明

1 class CToolBarDemoDlg : public CDialogEx
2 {
3     //省略 
4     afx_msg void OnRed();
5     afx_msg void OnPink();
6     afx_msg void OnBlue();
7     afx_msg void OnYellow();
8     //省略
9 };

接着在主对话框类的实现文件中添加消息响应函数的实现代码

 1 void CToolBarDemoDlg::OnRed()
 2 {
 3     AfxMessageBox(_T("单击了剑魔"));
 4 }
 5 
 6 void CToolBarDemoDlg::OnPink()
 7 {
 8     AfxMessageBox(_T("单击了狐狸"));
 9 }
10 
11 void CToolBarDemoDlg::OnBlue()
12 {
13     AfxMessageBox(_T("单击了刀妹"));
14 }
15 
16 void CToolBarDemoDlg::OnYellow()
17 {
18     AfxMessageBox(_T("单击了女警"));
19 }

2.基于单文档或者多文档的工具栏:

其实基于单文档或多文档的工具栏的创建与基于对话框的大同小异

只不过基于单文档或多文档的工具栏可以悬浮显示

工具栏可悬浮的关键:

1         //工具栏可停靠
2         m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
3     
4         //主框架窗口可被停靠
5         EnableDocking(CBRS_ALIGN_ANY);
6     
7         //停靠过去
8         DockControlBar(&m_wndToolBar);

 3.工具栏的显示与隐藏:

效果图:

基于对话框的工具栏:

 1 void CToolBarDemoDlg::OnBnClickedBtnCtb()
 2 {    
 3     if (m_ToolBar.IsWindowVisible())
 4     {
 5         m_ToolBar.ShowWindow(SW_HIDE);
 6     }
 7     else
 8     {
 9         m_ToolBar.ShowWindow(SW_SHOW);
10     }
11 }

基于单文档或多文档的工具栏:

    if (m_ToolBar.IsWindowVisible())
    {
        m_ToolBar.ShowWindow(SW_HIDE);
    }
    else
    {
        m_ToolBar.ShowWindow(SW_SHOW);
    }
    
    //重新布局工具栏的位置
    RecalcLayout();

 

posted @ 2015-03-23 12:12  (安于此生)  阅读(283)  评论(0编辑  收藏  举报