惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

GbyAI
GbyAI
J
Java Code Geeks
雷峰网
雷峰网
WordPress大学
WordPress大学
宝玉的分享
宝玉的分享
云风的 BLOG
云风的 BLOG
V
Visual Studio Blog
V
Vulnerabilities – Threatpost
S
Securelist
The Hacker News
The Hacker News
The Register - Security
The Register - Security
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Help Net Security
Help Net Security
G
Google Developers Blog
Hugging Face - Blog
Hugging Face - Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
M
MIT News - Artificial intelligence
AI
AI
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
The GitHub Blog
The GitHub Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Schneier on Security
Schneier on Security
N
Netflix TechBlog - Medium
T
The Blog of Author Tim Ferriss
Google DeepMind News
Google DeepMind News
Hacker News - Newest:
Hacker News - Newest: "LLM"
H
Hacker News: Front Page
博客园 - 司徒正美
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
B
Blog
Microsoft Azure Blog
Microsoft Azure Blog
大猫的无限游戏
大猫的无限游戏
Security Latest
Security Latest
Engineering at Meta
Engineering at Meta
N
News and Events Feed by Topic
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
酷 壳 – CoolShell
酷 壳 – CoolShell
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
T
Threat Research - Cisco Blogs
U
Unit 42
V
V2EX
V2EX - 技术
V2EX - 技术
L
LINUX DO - 最新话题
aimingoo的专栏
aimingoo的专栏
Microsoft Security Blog
Microsoft Security Blog
Recorded Future
Recorded Future
P
Privacy & Cybersecurity Law Blog
美团技术团队
小众软件
小众软件
F
Fortinet All Blogs

博客园 - 海阔天

【原创】Self-Contained Container(自包含容器) Kindle 转换器 Win32 多线程学习笔记 海天软件自动安装工具 cd /d %~dp0是什么意思啊? (转)STL vector 容器介绍 . vc编译错误pass it through SDKPAINT的处理方法 [转]修改SDI主窗口Title (转)VC中让CListBox带有复选框 (转)电脑程序员才能看懂的笑话 (转)专业的程序员需要具备的思考能力:写一个程序需要注意多少细节问题 (转)另一篇:VC导出数据到EXCEL (转)我的10个开发原则 [转]STL中map用法详解 [转]创业前应先做出一个好的非盈利产品 单元测试 版本控制 VC编程心得 (原创)日志处理(修改)
【转】在VC++下实现高彩色工具条2011-05-19 14:35引言
海阔天 · 2011-11-04 · via 博客园 - 海阔天

引言 

  一些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编译通过。