当前位置:C++技术网 > 资讯 > 工具栏控件CToolBarCtrl的使用入门详解

工具栏控件CToolBarCtrl的使用入门详解

更新时间:2015-06-26 12:14:23浏览次数:1+次

    工具栏控件对应的MFC控件类CToolBarCtrl的继承关系图如下:

 CToolBarCtrl的继承关系图

    由上图可以看出,CToolBarCtrl直接继承于CWnd,因此可以知道,CToolBarCtrl对API包装很少,基本上是比较原生的。
    而CToolBar控件类的继承关系图如下:

 CToolBar控件类的继承关系图

    可以看出,CToolBar则是继承于CControlBar的,CControlBar继承于CWnd的,因此,多了一层包装。这样使CToolBar在使用上变得比较容易,可以不用管很多细节。并且在框架窗口程序中,使用CToolBar有很大的优势,因为封装的东西,基本上是为这个准备的。因此也让此控件类使用很方便。
     但是,如果我们只是基于对话框的程序,没有框架,因此使用CToolBar反而变得麻烦,多余的包装对基于对话框的程序并没有什么用处,所以直接采用最基本的控件更为方便。CToolBar在此不多加讨论。
     下面讨论CToolBarCtrl的使用,在对话框中添加一个工具栏控件。因为在对话框中,只是把工具栏当做一个控件而已,只是工具栏集成了各种小控件,处理比较方便,就可以理解成一个控件的容器罢了。此时,我们要对工具栏中的按钮都进行消息响应。
     但是,因为工具栏和普通的控件不一样,不能直接拖拽,没有这种控件,所以,我们需要自己在代码中动态创建了。

创建过程如下:
一、创建工具栏控件对象
     我们创建一个控件类对象。创建对象一般放在类头文件中,代码如下:
 

CToolBarCtrl m_ToolBar;

 

二、创建一个工具栏资源
     在资源视图中,右击添加资源,选择ToolBar,新建,即可创建一个新工具栏,给工具栏设置一个你想要的ID号。然后通过VS中的编辑工具栏,对工具栏中的按钮进行绘制。效果图如下:

编辑工具栏


    这里说明一下,创建的工具栏其实就是一个位图而已。上图最顶部的三个按钮,只是三个分隔好的小图,这里对小图标大小进行了规定,中间有间隔,多个图标就代表了多个按钮。使用时使通过间隔来区分按钮的。这里绘制的只是一个图片中的几个小图标而已。编辑时在工具栏属性对话框中,给按钮填好ID和提示(Prompt)文字,设置好宽高。然后工具栏自动添加一个空白的图标。
     如果要删除图标,用鼠标左键单击图标,拖出工具栏即可。按住左键,把图标向右拖一点空格释放,就会增加一个分隔符。

三、添加工具栏初始化代码
     在你要添加工具栏的窗口(一般是主窗口)的初始化对话框函数中,添加以下代码,使工具栏创建并显示出来。

TBBUTTON Btns[2];// - 工具栏按钮结构体数组
m_ToolBar.Create(WS_CHILD|WS_VISIBLE,CRect(0,0,600,600),this,IDR_TOOLBAR1);// - 创建工具栏
m_ToolBar.SetButtonSize(CSize(32,32));// - 设置按钮大小
m_ToolBar.SetBitmapSize(CSize(32,32));// - 设置图标大小
/* - 给工具栏添加位图 - */
int iFirstBitmap = m_ToolBar.AddBitmap(2,IDR_TOOLBAR1);
/* - 给工具栏第一个按钮设置参数 - */
Btns[0].iBitmap = iFirstBitmap;// - 第一个位图
Btns[0].idCommand = IDT_OPEN;// - 按钮的ID
Btns[0].fsState = TBSTATE_ENABLED;// - 按钮可用
Btns[0].fsStyle = TBSTYLE_BUTTON;// - 普通按钮风格
Btns[0].dwData = 0;// - 无数据 Btns[0].iString = IDS_OPEN;// - 按钮文字String TableID

Btns[1].iBitmap = iFirstBitmap+1;// - 第二个图片
Btns[1].idCommand = IDT_SAVE;
Btns[1].fsState = TBSTATE_ENABLED;
Btns[1].fsStyle = TBSTYLE_BUTTON;
Btns[1].dwData = 0;
Btns[1].iString = IDS_SAVE;

m_ToolBar.AddButtons(2,Btns);// - 将两个按钮添加到工具栏
m_ToolBar.AutoSize();// - 调整工具栏,以合适大小容纳按钮

代码说明:
1.IDT_OPEN和IDT_SAVE是工具栏两个按钮的ID号,从左到右。
2.因为要创建两个按钮,所以创建TBBUTTON数组存放两个按钮的信息。
3.IDR_TOOLBAR1是工具栏的ID,创建时指定ID,然后给工具栏添加位图,也要指定工具栏ID。
4.AddBitmap返回的是位图的第一个图形的索引,后面的数组中的iBitmap的值就是工具栏位图的小图标的索引,加上偏移即可。
5.按钮大小最好和位图大小匹配,设置成一样的大小。否则会引起位图错乱。
6.AutoSize在添加按钮或者删除按钮时一定要调用,否则可能出现按钮只显示部分的情况。此函数会自动以合适的大小调整。没有参数。

四、给工具栏按钮添加响应事件
     因为工具栏不能直接在资源视图中拖拽,因此也就无法使用类向导完成事件自动添加。我们需要手动添加。
在头文件中,添加消息响应函数代码如下:
    afx_msg void OnOpen()
    {
        CHARFORMAT cf;
        cf.cbSize = sizeof(cf);
        cf.crTextColor = RGB(255,0,0);
        cf.dwMask = CFM_COLOR|CFM_BOLD|CFM_FACE|CFM_SIZE;
        cf.dwEffects = CFM_BOLD;
        cf.yHeight = 400;
        memcpy(cf.szFaceName,"楷体",10);
        m_rt.SetWordCharFormat(cf);
    };
    afx_msg void OnSave(){MessageBox(_T("Save"));};

代码说明:
1.这里我是将实现直接放在头文件的函数声明中,便于讲解。推荐分开到CPP文件中实现。
2.消息响应函数前面必须是afx_msg修饰。然后其他的和正常的函数声明一样。
3.函数声明和定义写完后,然后就是添加消息映射。添加的地方在CPP文件中的消息映射宏BEGIN_MESSAGE_MAP和END_MESSAGE_MAP()之间,映射的写法和普通的按钮映射是一样的,如果不会,可以自己拖一个按钮,双击建立一个消息映射,然后参考这个写法写。消息响应写法如下:
 
BEGIN_MESSAGE_MAP(CricheditDlg, CDialog)
ON_BN_CLICKED(IDT_OPEN, &CricheditDlg::OnOpen)
ON_BN_CLICKED(IDT_SAVE, &CricheditDlg::OnSave)
END_MESSAGE_MAP()
// - CricheditDlg是你消息响应的函数所在的类。
  
    到此,所有工作基本就完了。这是基本的创建工具栏。这里是在基于对话框中创建工具栏的实现方法。