转载自 ewook
最终编辑 ewook

应该是一个老生常谈的问题了,仍然决定写一写的原因是:在网上搜一搜,讲得有效易懂的还真没发现(可能是大虾们都懒得去写。。。)

动机:传统的VC工具栏只支持16色的图标,且不能添加文字。

要点:CToolBarCtrl类的使用。先引用MSDN上的话(翻译水平比较菜,见谅!)

使用CToolBarCtrl类,一般遵从以下几个步骤:
           1.构造一个CToolBarCtrl对象。
            2.调用Create函数创建Windows工具条通用控件并与CToolBarCtrl对象相关联。
           3.确定工具条上的按钮如何显示:
               (1)使用位图图像。调用AddBitmap向工具条添加按钮位图
              (2)使用图像列表里面显示的图像。调用SetImageList函数、SetHotImageList函数、SetDisabledImageList函数指定图像列表
              (3)作用字符串标签。调用AddString和(或)AddStrings函数为工具栏添加字符串
           4.调用AddButtons函数为工具条添加按钮结构
           5.如果需要为不是CFrameWnd的拥有窗口添加工具提示,需要在工具条拥有窗口中传递TTN_NEEDTEXT消息,该消息在CToolBarCtrl: Handling Tool Tip Notifications中有所描述。

步骤:1.将要作为工具栏图标的位图或图标导入到VC资源管理器中。

2.在C***Dlg类为添加两个成员变量:CImageList m_ImageList,CToolBarCtrl m_ToolBar

3.在OnInitDialog()函数中添加如下代码:

/***************************************创建工具栏********************************************/
CBitmap bm;
UINT Resource[3]={IDB_BITMAP1,IDB_BITMAP2,IDB_BITMAP3};          //位图ID数组
int i;

m_ImageList.Create(32,32,ILC_COLOR24|ILC_MASK,0,0);                  //创建Image List
m_ToolBar.Create(TBSTYLE_FLAT | CCS_TOP | WS_CHILD | WS_VISIBLE | WS_BORDER | CCS_ADJUSTABLE,CRect(0,0,0,0),this,IDR_TOOLBAR);                    //创建Toolbar Control
m_ToolBar.SetBitmapSize(CSize(32,32));

for(i=0;i<3;i++)
{
   bm.LoadBitmap(Resource[i]);
   m_ImageList.Add(&bm,(CBitmap *)NULL);
   bm.Detach();
}

m_ToolBar.SetImageList(&m_ImageList);

TBBUTTON Buttons[3];                                                      //定义TBBUTTON结构体数组
CString str;

for(i=0;i<3;i++)
{
   str.LoadString(IDS_FILE+i);                                                //IDS_FILE是在String Table中添加的String
   Buttons[i].iString=m_ToolBar.AddStrings(str);
   Buttons[i].dwData=0;
   Buttons[i].fsState=TBSTATE_ENABLED;
   Buttons[i].fsStyle=TBSTYLE_BUTTON;
   Buttons[i].iBitmap=i;
   Buttons[i].idCommand=IDS_FILE+i;                                   //按钮命令响应
}
m_ToolBar.AddButtons(3,Buttons);
m_ToolBar.AutoSize();

m_ToolBar.ShowWindow(SW_SHOW);
/***************************************创建工具栏********************************************/

3.最终效果如图:

注解:TBBUTTON是定义工具条按钮的结构体,声明如下:

typedef struct _TBBUTTON {
int iBitmap;// zero-based index of button image
int idCommand;  // command to be sent when button pressed
BYTE fsState;     // button state--see below
BYTE fsStyle;     // button style--see below
DWORD dwData;     // application-defined value
int iString;// zero-based index of button label string
} TBBUTTON;
调用AddButtons函数向工具栏添加按钮。函数原型如下:
BOOL AddButtons( int nNumButtons, LPTBBUTTON lpButtons );

其中nNumButtons是要添加的按钮数目,lpButtons是指向TBBUTTON结构体的指针。

[VC]基于对话框程序,自定义工具栏(支持真彩色图标,可添加文字)相关推荐

  1. MFC应用真彩色图标资源

    在MFC编程的过程中,我们经常会使用icon和bitmap,例如:给树节点加上一个图标,工具条,按钮上放置一个图片等. 但VC的资源编辑器是不支持真彩色图标.为了能制作真彩色图标,需要如下三步: (1 ...

  2. vc 基于对话框实现工具条提示显示

    在用基于对话框的MFC里面,这时我们在工具栏的属性页下的提示是不会显示的,需要加入下面的东东,我已完成,可以,大家可以参考下: 1.在***dlg.h中加入: afx_msg    BOOL OnTo ...

  3. VC 在经典 MFC 框架下使用真彩色工具栏

    VS2008 sp1 以后有了 BCG 的包,可以使用 CMFCToolbar 来加载真彩色工具栏.但是在经典 MFC 框架下,默认还只是 16 色的工具栏,通过下面的方法就可以加载真彩工具栏了.直接 ...

  4. 如何设置自定义任务栏图标_如何为任何应用程序自定义Windows 7任务栏图标

    如何设置自定义任务栏图标 Would you like to change out the icons on your taskbar with a beautiful set of icons th ...

  5. 基于FFmpeg 实现RTSP, 音视频编解码,视频流添加文字,音视频合成MP4

    前言: 最近闲这没事,整理了一下之前开发过的音视频编解码库,主要基于ffmpeg,实现音视频的编解码.视频流添加文字,音视频同步到MP4等功能.有需要的小伙伴可以参考参考,如果写的有什么不对的地方,欢 ...

  6. 铁路12306微信小程序发布:支持余票查询、添加行程,让出行变得更加方便,你觉得了

    12月26日消息,今天,中国铁路12306推出了微信小程序App,用户需要使用微信号登录,12306小程序的界面十分整洁,可以进行余票查询.时刻表查询.正晚点查询等. 另外12306小程序还已经上线了 ...

  7. 小程序自定义Tabber,使其图标突出

    1.首先需要在app.json中配置一个tabbar "tabBar": {"custom": true,"color": "#0 ...

  8. 微信小程序自定义组件使用阿里矢量图标库图标

    有时候我们有这一种需求:在使用组件的时候,希望能传入自己写的class样式. 测试了一番,直接传递class参数是无效的,那我们怎么做呢? 开始实践 仔细查阅了官方文档,发现是可以的. 我们首先在组件 ...

  9. 解决微信小程序自定义tabbar跳转页面图标闪动问题

    情况一    如果你的tabbar对应的页面是component,那就在component下面加上 其中的selected是该tab页面对应的索引值 pageLifetimes: {show() {i ...

最新文章

  1. Gmapping从开始到放弃—写一个TF 广播
  2. 新概念机房运维监控三大新理念
  3. tomcat 多实例启动脚本
  4. 单细胞数据整合方法 | Comprehensive Integration of Single-Cell Data
  5. 每天一道LeetCode-----计算给定范围内所有数的与运算结果
  6. 在一周之内,快速看完整部教材,列出你不懂的5-10个问题。
  7. Java SimpleTimeZone setEndRule()方法与示例
  8. linux设备驱动模块引用和依赖
  9. VLAN TAG 实例
  10. Web安全之点击劫持
  11. 小程序mpvue图片绘制水印_基于mpvue小程序使用echarts画折线图的方法示例
  12. Shell.FlyoutHeader
  13. Tip: Unicode Debug和Debug有什么区别?
  14. 数字图像处理-知识点总结
  15. pytorch实现segnet_pytorch版segnet复现实践
  16. h3c交换机端口加入vlan命令_h3c交换机vlan配置划分命令
  17. 网络流 24 题, 餐巾计划问题 (最小费用流 )
  18. 7-2 jmu-python-汇率兑换
  19. 南京地图njmaps使用,以公众版为例
  20. 一个老工程师的工作经历和思考

热门文章

  1. 吴恩达深度学习4.2练习_Convolutional Neural Networks_the Happy House(Keras)
  2. 吴恩达深度学习4.1练习_Convolutional Neural Networks_Convolution_model_StepByStep_1
  3. Can't create handler inside thread that has not called Looper.prepare()
  4. 玩转matlab之一维 gauss 数值积分公式及matlab源代码
  5. element-ui table多选CheckBox参数解析
  6. 费尔德曼的百吉饼实验:人类的诚实程度其实超出你的想象!
  7. Bzoj1034 [ZJOI2008]泡泡堂BNB
  8. [考试]20150903
  9. 错误提示:error LNK2001: unresolved external symbol public: static int person::weight (?weight@person@@
  10. python--openpyxl模块使用, 对excel表格的操作