如何在WINCE5.0下显示图片

来源:互联网 发布:go并发编程实战 下载 编辑:程序博客网 时间:2024/05/17 00:51
 
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函数的参数即可实现原图的放大缩小,唯一的缺憾就是显示大图片时速度较慢。

如果是显示图片的话,用EVC自带的API就可以了SHLoadImageFile(Filename);
C++中可以使用SHLoadImageFile(Filename)函数;需要Include "aygshell.h"
代码如下:
假设这段代码在OnDraw()函数中,并且FileName值已正确给定.可以加载显示jpg,gif类型的图片.
FileName为CString类型.

if(Filename!="")
{
CBitmap bitmap;

bitmap.Attach(SHLoadImageFile(Filename));
BITMAP bmpInfo;

bitmap.GetBitmap(&bmpInfo);
CDC bitmapDC;

bitmapDC.CreateCompatibleDC(pDC);
CBitmap* pOldBitmap = bitmapDC.SelectObject(&bitmap);

pDC->BitBlt(0,0,bmpInfo.bmWidth,bmpInfo.bmHeight,&bitmapDC,0,0,SRCCOPY);
bitmapDC.SelectObject(pOldBitmap);
bitmap.DeleteObject();
}


如果要处理并保存JPG图片,用Independent Jpeg Group的JpegLib就可以.

原创粉丝点击