在vc中显示bmp图像比较容易,但显示jpg,png等其它格式就没那么容易,一般有几种方法可以考虑,一是用图像控件,但一般要下载并注册,二是采用微软的GDI+接口,对它熟悉的话可以使用,再有就是本文采用的一个方法,就是用COM组件的接口IPicture,具体见例子吧。
IPicture* pPic;
IStream* pStm;
CFile file;
CFileStatus fstatus;
long cb;
if (file.Open(strPathName, CFile::modeRead) &&
file.GetStatus( strPathName, fstatus)&&
((cb = fstatus.m_size) != -1))
{
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb);
LPVOID pvData = NULL;
if (hGlobal != NULL)
{
if ((pvData = GlobalLock(hGlobal)) != NULL)
{
file.Read(pvData, cb);
GlobalUnlock(hGlobal);
CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);
if (SUCCEEDED(OleLoadPicture(pStm, fstatus.m_size,
TRUE,IID_IPicture, (LPVOID*)&pPic)))
{
OLE_XSIZE_HIMETRIC hmWidth;
OLE_YSIZE_HIMETRIC hmHeight;
pPic->get_Width(&hmWidth);
pPic->get_Height(&hmHeight
CRect rect;
GetDlgItem(IDC_STATIC2)->GetClientRect(&rect); //按窗口大小显示
// 按实际大小显示
//double fX,fY;
//fX = (double)pDC->GetDeviceCaps(HORZRES)*(double)hmWidth/((double)pDC->GetDeviceCaps(HORZSIZE)*100.0);
//fY = (double)pDC->GetDeviceCaps(VERTRES)*(double)hmHeight/((double)pDC->GetDeviceCaps(VERTSIZE)*100.0);
if (FAILED(pPic->Render(*pDC, 0, 0, (DWORD)rect.Width(),
(DWORD)rect.Height(), 0, hmHeight, hmWidth, -hmHeight, NULL)))
{
AfxMessageBox("Failed To Render The picture!");
pPic->Release();
}
else
{
AfxMessageBox("Error Loading Picture From Stream!");
}
}
}
}