



全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
PNG透明背景显示之路 在VC7.1中 MFC图形处理类里有一个强大的成员-CImage,这个类提供了从外部磁盘中调入一个JPEG、GIF、BMP和PNG格式的图像文件加以显示,而 且这些文件格式可以相互转换。由于CImage在不同的Windows操作系统中其某些性能是不一样的,因此在使用时要特别注意。例 如,CImage:PlgBlt和CImage:MaskBlt只能在 Windows NT 4.0 或更高版本中使用,但不能运行在Windows 95/98 应用程序中。CImage:AlphaBlend和CImage:TransparentBlt也只能在 Windows 2000/98或其更高版本中使用。即使在Windows 2000运行程序还必须将stdafx.h文件中的WINVER和_WIN32_WINNT的预定义修改成0x0500才能正常使用。使用CImage的一般方法使用CImage的一般方法是这样的过程:(1) 打开应用程序的stdafx.h文件添加CImage类的包含文件:#include atlimage.h(2) 定义一个CImage类对象,然后调用CImage:Load方法装载一个外部图像文件。(3) 调用CImage:Draw方法绘制图像。Draw方法具有如下定义:BOOL Draw( HDC hDestDC, int xDest, int yDest,int nDestWidth, int nDestHeight, int xSrc, int ySrc,int nSrcWidth, int nSrcHeight );BOOL Draw( HDC hDestDC, const RECT& rectDest, const RECT& rectSrc );BOOL Draw( HDC hDestDC, int xDest, int yDest );BOOL Draw( HDC hDestDC, const POINT& pointDest );BOOL Draw( HDC hDestDC, int xDest, int yDest,int nDestWidth, int nDestHeight );BOOL Draw( HDC hDestDC, const RECT& rectDest ); 其中,hDestDC用来指定绘制的目标设备环境句柄,(xDest, yDest)和pointDest用来指定图像显示的位置,这个位置和源图像的左上角点相对应。nDestWidth和nDestHeight分别指定图 像要显示的高度和宽度,xSrc、ySrc、nSrcWidth和nSrcHeight用来指定要显示的源图像的某个部分所在的位置和大小。 rectDest和rectSrc分别用来指定目标设备环境上和源图像所要显示的某个部分的位置和大小。需要说明的是,Draw方法 综合了StretchBlt、TransparentBlt和AlphaBlend函数的功能。默认时,Draw的功能和StretchBlt相同。但当 图像含有透明色或Alpha通道时,它的功能又和TransparentBlt、AlphaBlend相同。因此,在一般情况下,我们都应该尽量调用 CImage:Draw方法来绘制图像。现在简单介绍一下CImage图像的提取和显示,这个在很多的网站上都有讲述,随便都能找到的东西,我这里就不再详述,随便找了一个代码:(1) 创建一个默认的单文档程序项目Ex_Image。(2) 打开stdafx.h文件中添加CImage类的包含文件atlimage.h。(3) 在CEx_ImageView类添加ID_FILE_OPEN的COMMAND事件映射程序,并添加下列代码:void CEx_ImageView:OnFileOpen()CString strFilter;CSimpleArrayGUID aguidFileTypes;HRESULT hResult;/ 获取CImage支持的图像文件的过滤字符串hResult = m_Image.GetExporterFilterString(strFilter,aguidFileTypes,_T( All Image Files) );if (FAILED(hResult) MessageBox(GetExporterFilter调用失败!);return;CFileDialog dlg(TRUE, NULL, NULL, OFN_FILEMUSTEXIST, strFilter);if(IDOK != dlg.DoModal() return;m_Image.Destroy();/ 将外部图像文件装载到CImage对象中hResult = m_Image.Load(dlg.GetFileName();if (FAILED(hResult) MessageBox(调用图像文件失败!);return;/ 设置主窗口标题栏内容CString str;str.LoadString(AFX_IDS_APP_TITLE);AfxGetMainWnd()-SetWindowText(str + - +dlg.GetFileName();Invalidate(); / 强制调用OnDraw(4) 定位到CEx_ImageView:OnDraw函数处,添加下列代码: void CEx_ImageView:OnDraw(CDC* pDC)CEx_ImageDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);if (!m_Image.IsNull() m_Image.Draw(pDC-m_hDC,0,0);(5) 打开Ex_ImageView.h文件,添加一个公共的成员数据m_Image: public:CImage m_Image;(6) 编译并运行。单击打开工具按钮,在弹出的对话框中指定一个图像文件后,单击打开按钮,其结果如图7.21所示。 如果这个时候加载透明图层,一般情况是不会显示透明背景的(我想能看到这里的朋友都是为透明所困的人吧),我也是卡在这里很长时间,查阅了大量的资料和网上跑了很多网站,都没有得到满意的答复,以下有些网站资料可以参考:供CImage类显示的半透明PNG文件处理方法在高兴之余,也很不理解使用CImage类如何显示背景是透明的png格式图片在网上搜索的结果让人感到很失望,我也开始思考是不是要用其他的方法来处理图片的透明,因为我原来写 游戏都一直使用SDK的,在9.0的SDK中绘制透明PNG格式是支持透明的,为什么在2003的.net里他就不支持了呢?我觉得这个问题并不是 CImage本身的处理能力问题,而是有的地方我们并设置好。先做一个实验:我调入一张带有透明背景图片,然后通过CImage保存成新的一张PNG,用 PHOTOSHOP打开发现背景依然是透明的,这证明我的猜想是正确的,但是为什么就是不显示透明呢?我开始反复查阅MSDN,试图找到问题的根本原因。 在MSDN种介绍CImage:Draw 的段落并不多,如果在编译应用程序时将 _WIN32_WINNT 的值设置为等于或大于 0x0500,则 Draw 将在运行 Windows 2000 和 Windows 98 以及更高版本的系统上自动处理透明。它在 Windows NT 4.0 和 Windows 95 上同样有效,但没有透明支持。我们现用的系统是XP,按照MSDN说的,应该是自动处理透明,为什么我们就不自动呢?其中一句话引起了我的注意 如果编译应用程序时将 _WIN32_WINNT 的值设置为小于 0x0500,则 Draw 有效,但它在运行 Windows 2000 和 Windows 98 以及更高版本的系统上将不自动处理透明 这句话在本文开篇的时候我已经用蓝色标注出来了,这行字是Draw是否自动处理透明的关键,但是我早就把_WIN32_WINNT改成0x0500了,为什么还不行呢?我又重新查看了stdafx.h中需要修改的部分:WINVER / 允许使用 Windows 95 和 Windows NT 4 或更高版本的特定功能。_WIN32_WINNT / 允许使用 Windows NT 4 或更高版本的特定功能。_WIN32_WINDOWS / 允许使用 Windows 98 或更高版本的特定功能。这里的3个版本相关的内容,但是MSDN上只让我们修改了一出处,是不是问题出在这里呢?修改一下就知道了。#ifndef WINVER / 允许使用 Windows 95 和 Windows NT 4 或更高版本的特定功能。#define WINVER 0x0500 /为 Windows98 和 Windows 2000 及更新版本改变为适当的值。#endif#ifndef _WIN32_WINNT / 允许使用 Windows NT 4 或更高版本的特定功能。#define _WIN32_WINNT 0x0500 / 为 Windows98 和 Windows 2000 及更新版本改变为适当的值。#endif #ifndef _WIN32_WINDOWS / 允许使用 Windows 98 或更高版本的特定功能。#define _WIN32_WINDOWS 0x0510 /为
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年五金制品行业跨境电商风险评估与控制报告
- 药品采购收货管理制度
- 药店内部区域管理制度
- 药店日常卫生管理制度
- 药店药师考勤管理制度
- 薪酬福利台账管理制度
- 设备安全运行管理制度
- 设备日常卫生管理制度
- 设备状态标志管理制度
- 设备维护维修管理制度
- 蒸汽机的原理
- 信用修复申请书
- 人教版初中物理实验目录详表
- 糖尿病周围血管病变课件
- (完整版)政府工程项目代建管理方案(范本)
- 2023年江苏省苏州大学医学部药学院统招博士后招收(共500题含答案解析)高频考点题库参考模拟练习试卷
- 2023年全国高考语文乙卷作文“一花独放不是春百花齐放春满园”写作
- 《国家中药饮片炮制规范》全文
- 合作方案介绍文案
- 年部级优课马克思主义在中国的传播
- 检验科生物安全防护知识培训试题及
评论
0/150
提交评论