VC怎样把一副自己画的图存成BMP格式和在VC++下实现高彩色工具条

转载 2009年12月12日 13:28:00

VC怎样把一副自己画的图存成BMP格式

int SaveBmp(HANDLE hData,LPSTR filename)
{
BITMAPFILEHEADER bfh;
BITMAPINFOHEADER *lpbi=(BITMAPINFOHEADER*)hData;

bfh.bfType=0x4D42; //BM
bfh.bfSize=sizeof(bfh)+GlobalSize(hData);
bfh.bfReserved1=bfh.bfReserved2=0;
int colors=1<biBitCount;
if(colors>256) colors=0;
bfh.bfOffBits=sizeof(bfh)+lpbi->biSize+colors*sizeof(RGBQUAD);

HANDLE hFile=CreateFile(filename,GENERIC_WRITE
,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,NULL);
if(hFile)
{
DWORD write;
WriteFile(hFile,&bfh,sizeof(bfh),&write,NULL);
WriteFile(hFile,lpbi,GlobalSize(hData),&write,NULL);
int i=sizeof(hData);
CloseHandle(hFile);
return true;
}
return false;
}

 

转载声明:本文转自http://wmnmtm.blog.163.com/blog/static/38245714200962910294950/

===================================================================

 

在VC++下实现高彩色工具条

 

  引言

  一些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/

===================================================================

举报

相关文章推荐

MFC bmp彩色工具栏

1.bmp基本概念  (1)色位   色位即色彩位数,指每个像素点上颜色的数据位数(bit),有色彩深度、色彩精度等等多种称法,以24位为例,表示R.G.B每原色用8位二进制数据表示,最多可表达2...
  • whucv
  • whucv
  • 2012-08-17 11:29
  • 1280

VC++6.0实现真彩工具条

版权声明:本文为博主原创文章,未经博主允许不得转载。 最近在用VC++6.0做一个毕业设计,想要实现一个24bit位图真彩的工具条。经过努力,花了5个多小时(太笨了!),总算是把它给搞了出来。做...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

VC++6.0实现真彩工具条

最近在用VC++6.0做一个毕业设计,想要实现一个24bit位图真彩的工具条。经过努力,花了5个多小时(太笨了!),总算是把它给搞了出来。做了一个Demo运行截图如下: 鼠标放到工具栏按钮上时会高亮...
  • bcypxl
  • bcypxl
  • 2013-12-20 21:48
  • 1875

VC真彩工具条

作者:skyformat99 下载源代码 例子程序最终效果图:   一直在寻找制作一个 24bit 及以上真彩工具条的简单有效方法,在各种VC站点都找到了很多有关这方面的文章...

VC下把HBITMAP保存为bmp图片

转载自 http://blog.csdn.net/Tr0j4n/archive/2009/10/02/4627175.aspx#  //VC下把HBITMAP保存为bmp图片 BOOL Save...

在 VC++6.0 中将 JPG 格式图片转换成 BMP 格式

思路:利用 GDI+来完成 难点: (1)配置 GDI 开发环境,添加配置代码 (2)在当文档程序中添加转换代码 注意:本文档由 ybdesire 参考网上资料撰写完成,代码已经做过测试,可直接...

MFC工具栏bmp彩色图标

1.bmp基本概念  (1)色位   色位即色彩位数,指每个像素点上颜色的数据位数(bit),有色彩深度、色彩精度等等多种称法,以24位为例,表示R.G.B每原色用8位二进制数据表示,最多可表达2...

VC++工具栏显示真彩色位图资源

问题:  论坛中有很多人提出:基于Windows的程序如资源管理器(Explorer.exe),IE等都能显示出漂亮的工具栏图像和图标。但是,用MFC开发的应用程序一般都只能显示16色的工具栏图像...

VC++图片透明处理

原始图片: 处理过程及结果 >>(编个号)   假设希望把图片中绿色的部分透明掉  1>原图(图1)保存至临时DC中(用hOrigin表示) m_cbmp.LoadBit...

VC下的小工具

VC6.0附带工具软件 (1)ActiveX Control Test Container称为“ActiveX 控件测试容器”,顾名思义,此工具的主要功能就是测试ActiveX 控件,可以通过改变A...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)