Graphics
新一篇: 在mfc编程中创建web风格的图形用户界面(一)
使用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 ); |
现在简单介绍一下CImage图像的提取和显示,这个在很多的网站上都有讲述,随便都能找到的东西,我这里就不再详述,随便找了一个代码:
(1) 创建一个默认的单文档程序项目Ex_Image。 (2) 打开stdafx.h文件中添加CImage类的包含文件atlimage.h。 (3) 在CEx_ImageView类添加ID_FILE_OPEN的COMMAND事件映射程序,并添加下列代码:
void CEx_ImageView::OnFileOpen() { CString strFilter; CSimpleArray<GUID> 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 } |
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); } } |
public: CImage m_Image; |
![vc <wbr>显示PNG 图片点击可在新窗口打开查看](http://www.itku.org/A-A-A/2005/07/17/20050717083244102357_1.gif)
如果这个时候加载透明图层,一般情况是不会显示透明背景的(我想能看到这里的朋友都是为透明所困的人吧),我也是卡在这里很长时间,查阅了大量的资料和网上跑了很多网站,都没有得到满意的答复,以下有些网站资料可以参考:
在网上搜索的结果让人感到很失望,我也开始思考是不是要用其他的方法来处理图片的透明,因为我原来写游戏都一直使用SDK的,在9.0的SDK中绘制透明PNG格式是支持透明的,为什么在2003的.net里他就不支持了呢?我觉得这个问题并不是CImage本身的处理能力问题,而是有的地方我们并设置好。先做一个实验:我调入一张带有透明背景图片,然后通过CImage保存成新的一张PNG,用PHOTOSHOP打开发现背景依然是透明的,这证明我的猜想是正确的,但是为什么就是不显示透明呢?我开始反复查阅MSDN,试图找到问题的根本原因。
WINVER
这里的3个版本相关的内容,但是MSDN上只让我们修改了一出处,是不是问题出在这里呢?修改一下就知道了。
#ifndef WINVER
#ifndef _WIN32_WINNT
#ifndef _WIN32_WINDOWS
编译原来的程序通过,打开带有半透明背景的图片,马上显示背面的网格,OK!问题找到了!打开透明的怎么样呢?结果令人失望,大片的透明背景被绘制成了白色背景,似乎还是没有解决好啊,再看看MSDN,里面有一个TransparentBlt绘制透明,他不是把透明变成白色的了吗?TransparentBlt里面的关键色改成白色绘制,哈哈,透明的图片出来了。