WINCE 如何显示PNG和GIF图片

    技术2025-06-15  19

    忙活了一整天,终于找到显示PNG和GIF格式图片的方法了,相当HAPPY!!!!!!!!!!!     wince的开发过程中,经常要涉及到GUI等开发,其强大的功能依赖于微软各种动态库和组件的支持,特别我最近在做仿IPHONE效果的UI时,有很多花稍的图片,只能用PNG格式的图片来实现,这里主要介绍wince下各种图片的显示方法,开发环境是VS2005+wince5.0,源程序为实现PNG和GIF的解码和显示函数。    在一些多媒体项目中,图片显示是必不可少的,然而EVC的标准win32函数中,用于图片操作的只有LoadBitmap和BitBlt等位图函数,当然,用位图示是速度最快的一种方式,但是由于位图的不压缩性,使图片的体积非常大,使有些项目的开发板中,位图占用了大量的磁盘空间,如果使用JPG,GIF等高压缩比的图片,可以大大缩小程序的体积,然而EVC没有直接支持这些图片操作的函数,我们可以使用微软提供的组件去实现这个功能。    首先,在EVC的项目中导入图片资源,导入的类名可使用图片的压缩格式,比方说,要导入JPG?片,可定类名为"JPG",如果是GIF,就是"GIF",这样,在编译内核的时候,图片作为资源可直接在内核中使用,然后开始写代码://***************************************************************************************//函数: LoaResourceImage//目的: 解码并显示PNG图片//参数说明:hwnd:传入句柄,lpName:资源文件名,lpType:资源文件类名(unicode),//         i:保留,后面参数为RECT//***************************************************************************************void LoaResourceImage(HWND hwnd,LPCWSTR lpName,LPCWSTR lpType,int i,       int left,int right,int bottom,int top){    HDC       hdc;    HRSRC     hr;    DWORD    dwsize;    HGLOBAL    hg;    LPSTR    lp; HMODULE hModule_Current = GetModuleHandle(NULL);    hr = FindResource(hModule_Current,lpName,lpType);    dwsize = SizeofResource(GetModuleHandle(NULL),hr);    hg = LoadResource(GetModuleHandle(NULL),hr);    lp = (LPSTR)LockResource(hg);    hdc = GetDC(hwnd);    RECT    rect; rect.bottom = bottom;    rect.top = top;    rect.right = right;    rect.left = left;    DrawImage(hdc,lp,dwsize,&rect);    DeleteObject(hr);}    LoadResourceImage函数主要将图片导入内存,使用这个函数,只要将图片的ID,图片的类名,以及要显示图片的坐标位置输入即可,下面主要是显示的函数代码://******************************************************************************//函数: DrawImage//目的: 显示PNG图片//参数说明:hdc:HDC,buffer:数据流BUFFER,size:资源大小,//         rect:RECT//******************************************************************************void DrawImage(HDC hdc,const void *buffer,UINT size,LPCRECT rect){    IImagingFactory *pImageFactory = NULL;    IImage        *pImage = NULL;    CoInitializeEx(NULL,COINIT_MULTITHREADED);    if(SUCCEEDED(CoCreateInstance(CLSID_ImagingFactory,                      NULL,                      CLSCTX_INPROC_SERVER,                      IID_IImagingFactory,                      (void **)&pImageFactory))) {    if(SUCCEEDED(pImageFactory->CreateImageFromBuffer(buffer,size,DISPOSAL_NONE,&pImage)))        {   pImage->Draw(hdc,rect,NULL);   pImage->Release();        }        pImageFactory->Release();    } CoUninitialize();}    这里使用了微软的组件的调用,然后在指定位置显示,当然,只要组件中支持相应的图片解码,这种方法就可以使用,目前,大多数的解码,wince5.0都可以解,这样wince下的图片显示问题解决。

    最新回复(0)