引言
一些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编译通过。
转载声明:本文转自http://wmnmtm.blog.163.com/blog/static/382457142009629101818484/
===================================================================
相关推荐
在VC++开发环境中,创建和实现高彩色工具条是一个对用户界面进行美化的重要技术。工具条(ToolBar)是Windows应用程序中常见的控件,通常用于放置快捷按钮,方便用户快速访问常用功能。传统的工具条通常使用系统默认...
在VC++6.0中将JPG格式图片转换成BMP格式主要依赖于Microsoft的GDI+库。GDI+是Windows图形设备接口的一个扩展,提供了丰富的图形处理能力,包括图像加载、绘制和保存等功能。以下是一份详细的步骤指南: **一、配置...
在计算机图形处理领域,图像文件格式的转换是一个常见的任务。本篇主要讲解如何使用VC++编程语言将BMP(位图)格式的图像文件转换为JPG(JPEG)格式。BMP是一种无损的图像存储格式,而JPG则是一种有损但更高效的压缩...
《VC++6.0 实现的画线程序源代码解析》 在计算机编程领域,图形用户界面(GUI)的应用越来越广泛,其中画线功能作为基本的交互方式之一,被广泛应用于各种应用程序中。本篇文章将深入探讨使用VC++6.0实现的画线程序...
在VC++环境中,创建BMP图片涉及图像处理和文件I/O操作。BMP(Bitmap)是一种常见的位图格式,用于存储未压缩的图像数据。在本文中,我们将深入探讨如何使用VC++编程语言来创建BMP图片,以及TestSaveBmp源码中可能...
在图像处理领域,将彩色图像转换为黑白图像(也称为灰度图像)是一种常见的操作。在VC++中,可以通过编程实现这一过程。本篇将详细解释如何使用VC++进行彩色图像到灰度图像的转换,并探讨相关的编程概念和技术。 ...
在VC++编程环境中,制作真彩工具条是一项常见的任务,特别是在开发Windows应用程序时。真彩工具条能够提供高质量的图像,提升用户界面的视觉效果。本文将深入探讨如何使用Visual C++来创建这样的工具条,并结合提供...
在VC++环境中,将24位彩色BMP图像转换为8位灰度图像涉及到色彩空间的转换和位图处理技术。在这个过程中,我们通常会利用RGB颜色模型的特性,将红、绿、蓝三个通道的色彩信息转换为单一的灰度值。下面将详细介绍这个...
在VC++ 6.0环境下,开发一个BMP图像读取和灰度化的程序涉及到对位图文件格式的理解以及图像处理的基本算法。首先,我们来深入理解BMP图像格式。 BMP(Bitmap)是Windows操作系统中的一种位图图形文件格式,它存储的...
在VC++环境中,打开并显示BMP图片是一个基础的图形用户界面编程任务,通常涉及到Windows API函数和MFC(Microsoft Foundation Classes)库的使用。BMP是微软操作系统中的一种位图图像格式,它包含了图像的颜色数据和...
然而,这种方式的局限性在于它不能生成带有拖动条(gripper)的复杂浮动工具条,且在VC5.0中存在一个已知的问题,即在拖动工具条时,系统无法正确刷新,导致工具条在新位置和原位置同时显示。这个问题在VC6.0及更高...
在VC++6.0环境下开发图像处理程序时,我们需要理解几个关键的概念和技术,这包括图形设备接口(GDI)和Windows消息处理。本教程将详细解释如何利用VC++6.0来实现打开图像的功能,同时介绍自定义DIB类的设计与实现。 ...
VC 和 VC++ 是微软公司提供的两个不同的编程工具,尽管它们经常被混淆使用。VC,全称为Visual C,是指微软的Visual Studio中专门用于C语言开发的组件。而VC++,即Visual C++,是一个集成开发环境(IDE),专门用于...
总之,这个项目为开发者提供了一种工具,能够方便地将不同格式的图像转换为BMP格式,适用于在VC++环境下进行图形资源的管理和使用。通过研究这个源代码,可以深入了解图像处理的基本原理,以及在C++中如何操作二进制...
在VC++环境中,图像处理是一项常见的任务,尤其是对于 BMP(Bitmap)格式的图像,它是Windows操作系统最基础的位图图像格式。本篇文章将详细介绍如何利用VC++实现BMP图像的读取与保存功能。 首先,我们需要理解BMP...
本项目"VC++实现录屏截屏"旨在利用VC++的强大功能,结合MFC和OpenCV库,创建一个能够实现屏幕捕获和录屏功能的应用程序。 首先,让我们深入了解一下截屏部分。在描述中提到,截屏功能是通过微软官方提供的示例代码...
本实例演示如何使用VC++将BMP图片存入Access数据库,注意Access字段的类型及长度值,测试时请注意,要运行程序必须将数据库文件userinfo.mdb与可执行文件放在一起,如果在vc开发环境中运行,则需要将该数据库文件...
资源中是一个vs2008sp1 IDE中VC++ MFC 图片控件(Picture Control)显示资源位图(BMP)、文件位图(BMP)、其它格式文件图片(JPG\PNG\BMP)的实例,可供参考。
总结起来,在VC++中实现BMP图的背景透明,主要依赖于`TransparentBlt()`函数,通过设置一个透明色并确保源BMP图的背景颜色与其一致,从而达到透明显示的目的。这种方法在处理多个图像叠加显示时非常有用,可以避免...