如何在WINCE5.0下显示图片

时间:2022-07-30 17:32:13

    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函数的参数即可实现原图的放大缩小,唯一的缺憾就是显示大图片时速度较慢。