一、创建普通toolbar
1. 新建一MFC程序,在Dlg头文件中添加一个CToolBar类的成员变量CToolBar m_Toolbar;
2. 然后在头文件中定义工具栏命令ID。
#define ID_BUTTON1 501
#define ID_BUTTON2 502
#define ID_BUTTON3 503
3. 在资源对话框中,新建一toolbar.然后创建3个按钮。
注意:在VS 2008中添加按钮操作是对当前按钮的ID属性赋值,系统会自动出现一个新的按钮。
4. 修改按钮的ID分别为ID_BUTTON1、ID_BUTTON2、ID_BUTTON3,也可以修改按钮的大小,用画笔工具修改按钮的样子。
5. 然后就可以初始化toolbar了:
m_Toolbar.Create(this);//创建工具栏控件
m_Toolbar.LoadToolBar(IDR_TOOLBAR1);//装载工具栏资源
//该函数用于显示工具栏,并根据窗口大小自动调整工具栏的位置
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);
6. 添加按钮的相应事件:
首先在头文件中声明事件处理函数:
afx_msg void Button1Click();
在.cpp文件中声明COMMAND 事件的消息函数映射:ON_COMMAND(ID_BUTTON1,CToolbarNewDlg::Button1Click)
在.cpp中实现Button1Click函数即可。
二、创建真彩色toolbar
1.首先向工程中导入6张位图(格式为bmp),大小为32*32,颜色为32位。ID分别默认为IDB_BITMAP1, IDB_BITMAP2……
2.在Dlg头文件中添加两个变量:
CToolBar m_Toolbar;
CImageList m_ImageList;
3.在头文件中添加宏定义:
#define ID_BUTTON1 501
#define ID_BUTTON2 502
#define ID_BUTTON3 503
#define ID_BUTTON4 504
#define ID_BUTTON5 505
#define ID_BUTTON6 506
4.添加初始化代码:
m_ImageList.Create(32,32,ILC_COLOR32|ILC_MASK,1,1);
//图片大小必须一致,参数分别表示图片的像素32*32,32位真彩色。
CBitmap bmp;
for(int i=0;i<6;i++)
{
//使用现有位图为bmp赋值
bmp.LoadBitmap(IDB_BITMAP1+i);
m_ImageList.Add(&bmp,RGB(255,255,255));
bmp.DeleteObject();
}
UINT nArray[6];
for(i=0;i<6;i++)
{
nArray[i]=ID_BUTTON1+i;
}
m_Toolbar.CreateEx(this);
//创建工具栏控件,CreateEx函数创建的工具栏,默认有浮动按钮属性
m_Toolbar.SetButtons(nArray,6);
//创建六个工具按钮,并依次设置ID号,对应nArray数组的元素
//相当于完成了一中手动为按钮设置ID的工作。
m_Toolbar.SetSizes(CSize(40,40),CSize(32,32));
//函数第一个是按钮大小,第二个是图像大小,按钮必须比图像要大,具体是按钮的要比图像的宽大7或者以上,高6
m_Toolbar.GetToolBarCtrl().SetImageList(&m_ImageList);//设置图像
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);
显示效果:
三、为toolbar添加背景位图
1. MFC提供了一个类CReBar,这是一个容器类,可以向这个类中添加工具栏,编辑框,下拉列表等等。在头文件中添加一个CReBar类的变量:CReBar m_Rebar;
2.导入一张位图,作为工具栏背景,ID为ID_TOOLBACK.
3.在上边代码中RepositionBars语句之前添加如下代码:
m_Rebar.Create(this);//创建窗口(控件)
m_Rebar.AddBar(&m_Toolbar);//将m_Toolbar绑定到CReBar上
m_Rebar.RedrawWindow();//重画窗口
REBARBANDINFO info;//设置CReBar的样式
info.cbSize=sizeof(info);
info.fMask=RBBIM_BACKGROUND;
m_Toolbar.ModifyStyle(0,TBSTYLE_TRANSPARENT);
//设置工具栏背景色透明,以便显示CReBar的底色
info.hbmBack=LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_TOOLBACK));
//加载位图
m_Rebar.GetReBarCtrl().SetBandInfo(0,&info);
4.如果要为button设置文字的话,可以使用CToolBar类的SetButtonText函数,但是此函数必须放在setSize函数之前,否则无法显示文字;而且要设置toolbar的高度足够,以便显示文字。
5.运行效果如下:
6.问题:
我按上述方法进行操作后,CReBar已经创建,但是背景色不知道为何添加不上。如果有谁解决了此问题,望不吝赐教。
四、添加鼠标停留事件
1.首先在头文件中添加一字符串变量:CString str;
2.在m_Toolbar调用CreateEX函数后,添加语句:
m_Toolbar.EnableToolTips();//激活信息提醒功能
3.在头文件中添加TTN_NEEDTEXT消息处理函数:
BOOL OnDisplay(UINT id, NMHDR *pNMHDR, LRESULT *pResult)
4.在.cpp中添加消息映射宏:
ON_NOTIFY_EX(TTN_NEEDTEXT,0,CToolbarNewDlg::OnDisplay)
5.实现OnDisplay代码:
TOOLTIPTEXT *pTTT=(TOOLTIPTEXT *)pNMHDR;
UINT nID=pNMHDR->idFrom;//获取工具栏按钮ID
UINT nIndex=m_Toolbar.CommandToIndex(nID);//根据按钮ID获取索引
switch(nID)
{
case ID_BUTTON1: str="旅行社";break;
case ID_BUTTON2: str="宾馆";break;
case ID_BUTTON3: str="招聘";break;
default : str="";
}
pTTT->lpszText=str.GetBuffer(str.GetLength());//设置按钮提示信息
pTTT->hinst=AfxGetResourceHandle();
return TRUE;
五、使用ICON构建toolbar
1.与用bmp图像构建toolbar一样,只是向m_ImageList中添加图片的方式有些不同:
for(int i=IDI_ICON1;i<=IDI_ICON6;i++)
m_ImageList.Add(AfxGetApp()->LoadIcon(i));//添加图标
六、设置toolbar热点图标
1.准备两套图标,一套为正常显示,一套为鼠标放上去后热点显示的图标。
2.工具栏必须具有TBSTYLE_FLAT(浮动按钮)属性,这在创建时已经默认拥有。
3.在头文件中额外定义ImageList:CmageList m_hotImageList;
4.以下语句添加在与_ImageList创建过程相应的位置即可:
m_hotImageList.Create(48,48,ILC_COLOR24|ILC_MASK,1,1);
m_hotImageList.Add(AfxGetApp()->LoadIcon(IDI_HOT1+i));
m_toolbar.GetToolBarCtrl().SetHotImageList(&m_hotImageList);
5.这样,当鼠标放上去时,就会显示另一种样子。
七、CToolBarCtrl工具栏控制类
1.用法跟CToolBar相似:
BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );
dwStyle:工具栏控件的风格
rect:工具栏位置和区域
pParentWnd:工具栏父窗口句柄(属于哪个窗口)
nID:工具栏控件ID号
AddButtons用于往工具栏添加一组按钮:
BOOL AddButtons( int nNumButtons, LPTBBUTTON lpButtons );
nNumButtons:要添加的按钮数量 也就是函数第二个参数数组大小。
lpButtons:一个TBBUTTON结构数组的地址
TBBUTON结构定义如下:
typedef struct _TBBUTTON
{
int iBitmap;
// 按钮显示的图片索引,没有图像为NULL,
int idCommand;
// 与此按钮相关联的命令标识符,fsStyle具有TBSTYLE_SEP属性时,该项必须为0
BYTE fsState; // 按钮的状态标志
BYTE fsStyle; //按钮风格
DWORD dwData; // 用户定义的数据
int iString; // 按钮显示的文本内容索引,无为NULL。
} TBBUTTON;
2.使用CToolBarCtrl添加一个工具条的过程:
CImageList m_ImageList;
CToolBarCtrl m_TBarCtrl;
TBBUTTON button[4];
m_ImageList.Create(32,32,ILC_COLOR32|ILC_MASK,0,0);
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON1));
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON2));
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON3));
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON4));
m_TBarCtrl.Create(WS_CHILD|WS_VISIBLE,CRect(0,0,0,0),this,1200);
m_TBarCtrl.SetImageList(&m_ImageList);
for(int i=0;i<4;i++)
{
button[i].fsState=TBSTATE_ENABLED;
button[i].fsStyle=TBSTYLE_BUTTON;
button[i].iBitmap=i;
}
m_TBarCtrl.AddButtons(4,button);
m_TBarCtrl.AutoSize();
m_TBarCtrl.SetStyle(TBSTYLE_FLAT|CCS_TOP);
3.为按钮创建响应事件函数
TBBUTON结构里有一个成员idCommand,这个成员跟菜单项的ID值一样,用于标识工具栏按钮项,也就是说idCommand是工具栏项ID号,就是最前面设置工具栏资源时,选择一个按钮,然后按回车,弹出一个对话框,里面有一个ID项,跟这个是一样的。
在上边的for循环中,添加button[i].idCommand=ID_BUTTON1+i;为按钮设置ID
然后添加COMMAND事件函数即可。