使用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);}