当前位置: 首页 > news >正文

【转】在VC++下实现高彩色工具条2011-05-19 14:35引言

【转】在VC++下实现高彩色工具条
2011-05-19 14:35

引言 

  一些Windows系统自带程序如资源管理器、Internet   Explorer等程序的工具条看上去和其他一些程序的工 

具条不太一样,在颜色上要漂亮许多。其实这些程序的工具条上的图标均为256色,而普通应用程序在工具栏上 

所显示图标的颜色通常只有16色,这就决定了后者在视觉上远没有前者美观。由于Windows随系统而带的程序也 

是由开发人员编写的应用程序,这就说明通过程序编码可以实现256色甚至更多色彩的图标在工具栏上的显示。 

为此笔者经过摸索,通过MFC编程在应用程序中实现了高彩色工具条。现将实现的主要方法介绍如下,以飨广大 

读者。 

  基本设计思路 

  在实现高彩色工具条之前,先研究一下普通16色的工具条的实现过程,并从中总结出改进方法。在VC的资 

源视图中工具条是一个资源名为IDR_MAINFRAME的Toolbar型资源,并可通过在编辑按钮上的图标来完成工具条 

上图标的绘制。虽然在资源视图中工具条上各按钮的图标是相互独立的,但在存储时并非像图标一样保存为ico 

格式文件而是以bmp位图格式保存在磁盘上的。该位图是一个由工具条上的按钮图标组成的长条型位图图像,中 

间没有任何缝隙,在程序运行和在资源视图对工具条进行编辑时该图像首先装载到一个图像列表中,然后工具 

栏根据索引依次从图像列表中将图像显示到工具条的各个按钮上。由于VC限制工具栏上的图标不能超出16色, 

因此不论是在资源视图直接编辑位图还是用复制粘贴等手段均无法获取超出256色的工具条(注:用复制粘贴的 

方法虽然在编辑视图中可以暂时显示出256色的图标,但在程序运行时仍会退化成16色)。 

  由于不能在资源视图中通过编辑Toolbar资源实现16色以上的图标,加之工具条在显示时有并不直接从 

Toolbar获取图标而是从图像列表中读取,因此可以通过其他一些图像处理软件做好类似于工具条的bmp图像( 

仅颜色比普通工具条bmp图像丰富,其余完全一样),并以位图的形式加入到程序资源。在使用时,先将其读取 

到图像列表,这样图像列表中用于显示到工具条上的图标的颜色就可以是256、24位、甚至32位色的了。由于工 

具条缺省时将直接加载资源名为IDR_MAINFRAME的Toolbar型资源作为图标的来源,因此还必须通过 

SetImageList()函数将含有高彩色工具条位图的图像列表指定为工具条的图标来源。 

  真彩工具条的实现 

  由于工具条的创建是在主框架类的OnCreate()函数中完成的,因此高彩色图像的装载和图像列表的替换 

工作必须也在此进行。在进行程序设计之前,需要做好各种准备工作,比如高彩色工具条位图的绘制、高彩色 

位图加入到资源等。绘制工具条位图时,必须控制好图像的尺寸,如需要有N个边长为   M的图标,那么需要绘制 

的位图尺寸为长=N*M;宽=M。真彩位图在加入到工程之后就不能再在VC的资源视图中进行编辑了。由于这个彩 

色位图仅起到美化界面的作用,因此具体对的事件响应等工作还要通过设置原有的Toolbar资源来完成。 

  准备工作就绪后,先要把工具条位图装载到图像列表,这样才能被工具条做获取。在作这一步时,必须用 

::LoadImage()函数去加载工具条位图,并通过宏MAKEINTRESOURCE()来指定具体要加载哪一个资源位图: 

HBITMAP   hbm   =   (HBITMAP)::LoadImage(AfxGetInstanceHandle(), 
MAKEINTRESOURCE(IDB_TOOLBAR),   //加载IDB_TOOLBAR 
IMAGE_BITMAP,   //按位图格式 
0,0,   //   cx,cy 
LR_CREATEDIBSECTION   |   LR_LOADMAP3DCOLORS   ); 

LoadImage返回一个位图句柄HBITMAP,但在MFC下使用CBitmaps会更加方便,可创建一个 
CBitmap对象并用Attach()成员函数将它与位图句柄联系起来: 

CBitmap   bm; 
bm.Attach(hbm);     

  MFC加载工具栏位图时使用了一个内部函数AfxLoadSysColorBitmap()将缺省颜色设定为16色,因此为了 

显示16色以上的图像,必须在调用图像列表类CImageList的Create()函数创建图像列表时对图像清单做进一 

步的处理: 

m_ilToolBar.Create(32,32,ILC_COLOR8,   4,   4); 
m_ilToolBar.Add(&bm,(CBitmap*)NULL);   

  这里用ILC_COLOR8标明了创建的图像列表是256色的,在VC的commctrl.h中对其有定义,并且还提供有其他 

几种颜色位深度的预定义: 

#define   ILC_COLOR4   0x0004   //16色 
#define   ILC_COLOR8   0x0008   //256色 
#define   ILC_COLOR16   0x0010   //16位色 
#define   ILC_COLOR24   0x0018   //24位色 
#define   ILC_COLOR32   0x0020   //32位色   

  如果使用的工具条位图只有256色(对于多数程序这样已经足够),则显然没有必要再使用更高级别的位深 

度定义。最后一步,也是最关键的一步,必须通过SetImageList()函数指定工具条m_wndToolBar的图标来源 

不再是原来缺省的图像列表而是含有高彩色位图的图像列表m_ilToolBar: 

m_wndToolBar.GetToolBarCtrl().SetImageList(&m_ilToolBar);   

  到此为止就可以通过MFC在自己编写的程序中实现类似于IE等软件的漂亮的工具条了。下图就是笔者用上述 

方法得到的程序界面:   

  小结 

  本文通过对作为工具条图标来源的图像列表的替换,实现了在普通MFC应用程序中具备了以往只有Windows 

系统自带程序才具备的高彩色工具条。较好地美化了程序的界面。本文程序在Windows   98下,由Microsoft   

Visual   C++   6.0编译通过。   


转载于:https://www.cnblogs.com/yxsylyh/archive/2011/11/04/vctoolbar.html

相关文章:

  • XenApp无法获取ICA文件
  • ruby on rails 之旅 第一章 ubuntu11.10安装
  • [体感游戏]关于体感游戏的一些思考(二) --- POV和基本场景
  • Java炸弹人实现及源码
  • 开发帮助文档Api
  • System.Windows.Forms.TabControl控件有关
  • Verilog 状态机写法 ( 转载,先看看到底好不好)
  • 轻量级的网页Rank算法,365Rss.cn的Rank技术解释以及算法讨论(一)
  • netapp学习(十三)---Snapshot基础知识(上)
  • 关于css浏览器的兼容问题
  • 关于静态方法和实例方法的一些误区。
  • DES加密解密
  • Synchronized及其实现原理
  • 唯一索引与主键索引的比较
  • Apache Commons Beanutils 三 (BeanUtils、ConvertUtils、CollectionUtils...)
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • 5、React组件事件详解
  • happypack两次报错的问题
  • iOS小技巧之UIImagePickerController实现头像选择
  • Redis在Web项目中的应用与实践
  • storm drpc实例
  • 初探 Vue 生命周期和钩子函数
  • 构建工具 - 收藏集 - 掘金
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 开发基于以太坊智能合约的DApp
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 嵌入式文件系统
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 树莓派 - 使用须知
  • 微信小程序:实现悬浮返回和分享按钮
  • 为视图添加丝滑的水波纹
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • scrapy中间件源码分析及常用中间件大全
  • 阿里云重庆大学大数据训练营落地分享
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • (11)MATLAB PCA+SVM 人脸识别
  • (26)4.7 字符函数和字符串函数
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (poj1.3.2)1791(构造法模拟)
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (全注解开发)学习Spring-MVC的第三天
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (译) 函数式 JS #1:简介
  • (转)Linq学习笔记
  • .libPaths()设置包加载目录
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .NET 的程序集加载上下文
  • .NET框架
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)
  • ??javascript里的变量问题