WEB开发网
开发学院软件开发VC 你有GIF的开发许可吗?PrecSubclassWindow 以及 M... 阅读

你有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

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 创建一个图像。具体实现细节请下载源代码。

上一页  2 3 4 5 6 7 8  下一页

Tags:GIF 开发 许可

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接