关闭

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

4130人阅读 评论(0) 收藏 举报

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/

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

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

VC++中bmp图象的显示

前段时间想用VC的对话框来动态地显示一副BMP位图,查了很多篇文章发现都写的很复杂(而且貌似许多都是复制粘贴而来),真正有价值的不多.其实VC显示BMP文件是很方便的,所有的代码加在一起也不过五六行而...
  • u012252959
  • u012252959
  • 2017-03-22 19:23
  • 684

VC打开并缩放显示位图(.BMP)文件的方法

VC打开并缩放显示位图(.BMP)文件的方法 最近一个项目需要进行位图操作,网上找了一大堆资料,但发现都是以前VC6.0版本的抄来抄去,而且大多数使用了复杂的位图结构。所以自己通过查阅MSD...
  • lxw907304340
  • lxw907304340
  • 2015-05-05 14:19
  • 1342

VC++6.0实现真彩工具条

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

VC 创建具有提示功能的工具栏

类CToolBar的对象是带有一行位图按钮和可选分隔线的控件条。这些按钮可以像普通按钮、核选按钮或单选按钮那样动作。 Visual C++提供了两种创建一个工具条的方法。要使用资源编辑器(Resou...
  • tanyouliang
  • tanyouliang
  • 2013-05-08 14:56
  • 1324

VC6.0读取BMP图像信息到BYTE数组

From:http://blog.sina.com.cn/s/blog_8bdd25f80101900h.html
  • SSJJRRRR
  • SSJJRRRR
  • 2014-09-20 20:44
  • 889

VC++图片控件(Picture Control)显示资源位图(BMP)、文件位图(BMP)、其它格式文件图片(JPG\PNG\BMP)的方法

在VC++ MFC编程中,我们常使用Picture Control图片控件来显示图像。下面简单归纳几种显示不同的方式: 第一种、资源位图方式显示BMP图片 如果要显示的是一张BMP位图,则可以采用这种...
  • margin1988
  • margin1988
  • 2015-01-08 17:08
  • 3590

使用VC++绘制坐标系

首先打开VC++,新建一个单文档应用程序; 按下图,为View类添加消息处理函数,变更单文档窗体背景色为黑色; 在菜单中添加如下菜单; 为菜单添加消息处理函数;添加在View类...
  • bcbobo21cn
  • bcbobo21cn
  • 2016-03-22 19:22
  • 1871

VC 6.0 MFC 读取并显示图片和彩色转灰度

关于MFC读取BMP图片,相信对于很多初学者都是一头雾水,找不着头绪。那么就让我浅浅地说一说到底怎么样读取并显示BMP图片吧。因为我也是初学,摸索学习了四五天,由于有些MFC基础,因此大概理清了MFC...
  • changgouliuyue5
  • changgouliuyue5
  • 2015-11-02 13:25
  • 2511

vc平台下将数组里的数据画成曲线

在VC++6.0下,随机生成一组数据,存在数组里,再描点画成折线
  • weiwen12138
  • weiwen12138
  • 2017-07-01 16:58
  • 167

【VC6.0】直线的橡皮筋绘图技术

在我们在使用微软的绘图程序时。当要画一条直线,先用鼠标确定起始位置,然后鼠标在屏幕上来回移动时,我们会发现,这条直线就像橡皮筋一样,随着鼠标在屏幕中的位置,长短和终点都随之变化。我们在编制自己的程序时...
  • lilian_lilith
  • lilian_lilith
  • 2014-07-17 10:47
  • 731
    个人资料
    • 访问:12114740次
    • 积分:90298
    • 等级:
    • 排名:第16名
    • 原创:718篇
    • 转载:169篇
    • 译文:16篇
    • 评论:3068条
    学习经历
    中科院、百度、创新工场、小米、阿里巴巴、米扑科技

    期货从业资格证(2017.03)
    基金从业资格证(2016.11)
    证券投资顾问证(2016.9)
    证券从业资格证(2016.6)
    系统架构设计师(2013)
    软件设计师(2008)
    CSDN创业专访

    程序员创业邦
    QQ群: 239292073
    青春,每一个有梦想的人

    资深产品经理人
    QQ群: 338142405
    思与行,人人都是产品经理

    爱脚本,爱技术
    QQ群: 320296250
    (已满)
    python、ruby、php、go、shell

    程序人生的平凡生活
    QQ群: 282297696
    (已满)
    汇聚百度、小米、微软、腾讯、
    创新工场、阿里巴巴、日本雅虎
    个人博客
    博客专栏
    博客公告
    本博客内容,由米扑博客精心整理
    欢迎交流,欢迎转载,大家转载注明出处,禁止用于商业目的。

    文章分类