你有GIF的开发许可吗?PrecSubclassWindow 以及 MFC 中的 EOF
2009-02-21 20:00:10 来源:WEB开发网BOOL CPicture::Load(LPCTSTR pszPathName)
{
Free();
USES_CONVERSION;
m_pImage = Image::FromFile(A2W(pszPathName),
m_bUseEmbeddedColorManagement);
return m_pImage->GetLastStatus()==Ok;
}
这里重要的事情是 GDI+ 使用宽字符,因此你需要用 USES_CONVERSION 和 A2W。旧版 CPicture 提供的 Load 函数可以从 CFile、CArchive、资源ID或流加载图像。所有这些 Load 函数最终都 通过 CPicture::Load(IStream*)加载图像,也就是从流加载图像。但是当我开始用 Image 代替 IPicture,使用 GDI+ 函数从流中加载图像时,什么也不会发生。太糟糕了。问题出在 MFC 的 CArchiveStream 类上,它在 CArchive 上实现了一个流(查看上个月的专栏)。
不知什么原因(有可能 CArchiveStream 没能正确地实现所有 IStream 功能),Image::FromStream 不能在基于 CArchiveStream 的流上正常工作。最糟的是,函数执行正常,但稍后你显示或删除 Image 时却会失败。
针对这个问题,我使用 CreateStreamOnHGlobal 重写了 CPiture::Load(UINT nID)。这个方便的 API 函数可以在一块全局内存上创建一个流。
// 分配全局内存,在上面创建流
HGLOBAL m_hMem = GlobalAlloc(GMEM_FIXED, len);
BYTE* pmem = (BYTE*)GlobalLock(m_hMem);
memcpy(pmem,lpRsrc,len);
IStream* pstm;
CreateStreamOnHGlobal(m_hMem,FALSE,&pstm);
这里的 lpRsrc 已经指向了内存中的图像资源。因此加载图像资源最基本的方法就是,把它拷贝到全局内存里,在全局内存中创建一个流,然后使用 Image::FromStream 创建一个图像。具体实现细节请下载源代码。
- ››开发Android 日历教程
- ››开发学院总结 Win 8实用技巧大全
- ››开发学院原创教程:把win8的IE10放桌面上方法(非...
- ››开发者眼中的Windows Phone和Android
- ››开发学院教你用SQL 语句最快速清空MySQL 数据表的...
- ››开发一个自己的HTML在线编辑器(一)
- ››开发一个自己的HTML在线编辑器(二)
- ››开发者在App Store上赚的钱比在Android Market上多...
- ››开发者应深入学习的10个Android开源应用项目
- ››开发移动 Web Ajax 应用
- ››开发者眼中的iPhone与Android
- ››开发者或想使用的10个Android2.2新特性
更多精彩
赞助商链接