VC下可以使用 IPicture接口来实现图片显示及放大缩小等功能,具体实现代码:
BOOL LoadPic(char* picName,HDC hdc,DWORD l, DWORD t,DWORD w, DWORD h)
{
IPicture *pPic;
IStream *pStm;
CFileStatus fstatus;
CFile file;
LONG cb;
if(file.Open(picName,CFile::modeRead)&&
file.GetStatus(picName, fstatus)&&
((cb = fstatus.m_size) != -1))
{
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb);
LPVOID pvData = NULL;
if(hGlobal != NULL)
{
if((pvData = GlobalLock(hGlobal)) != NULL)
{
file.ReadHuge(pvData, cb);
GlobalUnlock(hGlobal);
CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);
//HRESULT hr = OleLoadPicturePath(wszPath, (LPUNKNOWN)NULL, 0, 0, IID_IPicture,(VOID**)&pPic);
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);
pPic->Render(hdc,l,t,w, h,0,hmHeight,hmWidth,-hmHeight,NULL);
pPic->Release();
}
else
{
return FALSE;
}
}
}
}
else
{
return FALSE;
}
return TRUE;
}
Picture只需要调整Render函数的参数即可实现放大缩小功能,前一个rect是目标矩形,后一个rect是源矩形,调整前一个rect实现缩小,改后一个rect实现放大,需要注意的是后一个rect的单位是0.01mm且坐标系和前一个rect不同。
但是EVC不支持OleLoadPicture和OleLoadPicturePath函数,改用IImage接口实现。IImage是WinCE5.0之后才加入的COM组件,能更为方便显示图片。
用IImage来显示图片很简单,调用几个函数就可以了:
IImage * m_pImage;
IImagingFactory * m_pImagingFactory;
HRESULT hr;
//COM初始化
if (FAILED(hr = CoInitializeEx(NULL, COINIT_MULTITHREADED)))
goto END;
//创建COM实例
if(FAILED(hr = CoCreateInstance(CLSID_ImagingFactory,NULL,CLSCTX_INPROC_SERVER,IID_IImagingFactory,(void**) &m_pImagingFactory)))
goto END;
//从文件中创建图片
if(FAILED(hr = m_pImagingFactory->CreateImageFromFile(TEXT("测试.bmp"), &m_pImage)))
goto END;
//绘制图片
if(FAILED(hr = m_pImage->Draw(hdc,&rcWnd,NULL)))
goto END;
END:
//释放资源
if(m_pImage != NULL)
{
m_pImage->Release();
m_pImage = NULL;
}
if(m_pImagingFactory != NULL)
{
m_pImagingFactory->Release();
m_pImagingFactory = NULL;
}
CoUninitialize();
只要将srcRect参数赋值NULL即可显示整副图片,如要显示部分需要设置srcrect的值,和picture::Render一样 这里的srcrect也是以0.01mm为单位的,可以调用IImage::GetImageInfo接口获得原图信息转换为mm。其放大缩小的实现与Render类似。
在这里我遇到了一个问题,在EVC的模拟器上运行时,IImage使用完全正常,但是在WINCE5.0平台上使用时却不能显示图片,把srcrect设为NULL才能在平台上正常显示,但是这样不能实现图片放大功能。模拟器与平台使用同一内核,设置完全一样,我怀疑与IImage::Draw的第2个rect参数有关系,可能是2个rect的坐标系或单位不统一导致的。
这时我换了一种方法,创建一个内存DC,把图片用IImage::Draw按原图大小贴到内存DC上,再使用StretchBlt接口把内存DC里的图片贴到屏幕上,设置StretchBlt函数的参数即可实现原图的放大缩小,唯一的缺憾就是显示大图片时速度较慢。