`
sabolasi
  • 浏览: 907065 次
文章分类
社区版块
存档分类
最新评论

利用GDI+显示资源文件(Resource)中的JPG图像

 
阅读更多

使用GDI+在程序中显示一幅JPG图像的时候,若文件在硬盘上则操作极为简单:

Image image(L"E://your.JPG");
Graphics graphics(GetDC()->m_hDC);
graphics.DrawImage(&image,0,0);

有趣的是,若图像存在于程序资源中时,要实现相同的效果却麻烦了很多,你说微软的人是不是有些8*%@(^@^):

实现的流程是这样的:

1.先用FindResource,LoadResource,LockResource三个函数得于指向资源的指针(由LockResource返回,假定是lpvoid);

2.通过StgCreateStorageEx创建IStorage,再由IStorage创建一个IStream;

3.调用IStream::Write(lpvoid,size,NULL)将由资源数据写入到IStream中;

4.Image image(m_stream) 注:m_stream为上述过程中创建的IStream对象;

5.余下步骤同上.

下面给出关键代码:(创建一个单文档,在:OnDraw()中实现本例功能)

void CShowJpgFromResView::OnDraw(CDC* /*pDC*/)
{

// ......................

HRSRC hrsrc=::FindResource(::AfxGetInstanceHandle(),

MAKEINTRESOURCE(IDR_JPG1),L"jpg");
HGLOBAL hglobal=::LoadResource(::AfxGetInstanceHandle(),hrsrc);
LPVOID pvoid=::LockResource(hglobal);
DWORD dw=::SizeofResource(::AfxGetInstanceHandle(),hrsrc);

IStorage *m_stor;
::StgCreateStorageEx(L"D://test.stg",STGM_CREATE|STGM_SHARE_EXCLUSIVE|

STGM_READWRITE,STGFMT_STORAGE,0,

0,0,IID_IStorage,(void**)&m_stor);
IStream *m_stream;
m_stor->CreateStream(L"MyStream",STGM_CREATE|STGM_READWRITE|

STGM_DIRECT|STGM_SHARE_EXCLUSIVE,0,0,(IStream**)&m_stream);

m_stream->Write(pvoid,dw,NULL);

Graphics graphics(GetDC()->m_hDC);
Image image(m_stream);
graphics.DrawImage(&image,0,0);

}

---枯海(http://blog.csdn.net/xiaodao1986)

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics