Toolbar控件:32位真彩色大图标

9 篇文章 0 订阅

一、创建普通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*3232位真彩色。
    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控件:32位真彩色大图标 - WelKangm - WelKangm的博客
 

 

三、为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.运行效果如下:

Toolbar控件:32位真彩色大图标 - WelKangm - WelKangm的博客
 

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事件函数即可。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值