更新时间:2015-06-26 12:14:23浏览次数:1+次
工具栏控件对应的MFC控件类CToolBarCtrl的继承关系图如下:
由上图可以看出,CToolBarCtrl直接继承于CWnd,因此可以知道,CToolBarCtrl对API包装很少,基本上是比较原生的。
而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();// - 调整工具栏,以合适大小容纳按钮
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"));};
BEGIN_MESSAGE_MAP(CricheditDlg, CDialog)
ON_BN_CLICKED(IDT_OPEN, &CricheditDlg::OnOpen)
ON_BN_CLICKED(IDT_SAVE, &CricheditDlg::OnSave)
END_MESSAGE_MAP()
// - CricheditDlg是你消息响应的函数所在的类。
相关资讯