Windows mobile如何显示PNG和GIF图片

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下的图片显示问题解决。

还有问题就是:

1.头文件的包含次序.
     #include "initguid.h"一定要在#include "imaging.h"之后.如果不包含"initguid.h"或在#include "imaging.h"之前,则编译时会出现错误:
     TempApp.obj : error LNK2001: unresolved external symbol CLSID_ImagingFactory
     TempApp.obj : error LNK2001: unresolved external symbol IID_IImagingFactory  
   
    2."Ole32.lib"需要pragma
     如果"Ole32.lib"没有pragma的话,那么编译的时候将会出现如下错误:
     TempApp.obj : error LNK2019: unresolved external symbol __imp_CoUninitialize referenced in function "void __cdecl Open(void)" (?Open@@YAXXZ)
     TempApp.obj : error LNK2019: unresolved external symbol __imp_CoCreateInstance referenced in function "void __cdecl Open(void)" (?Open@@YAXXZ)
     TempApp.obj : error LNK2019: unresolved external symbol __imp_CoInitializeEx referenced in function "void __cdecl Open(void)" (?Open@@YAXXZ)
     MIPSIIDbg/TempApp.exe : fatal error LNK1120: 3 unresolved externals

  如果将IImage组件用类的形式封装,那么在头文件的包含顺序就更有讲究.

   
     如果将IImage组件用类的形式封装,那么在头文件的包含顺序就更有讲究.
    
     这个是一个完整的能通过编译的例子:
    


//    
// TempApp.cpp : Defines the entry point for the application.
//
//

#include "stdafx.h"
#include "imgtest.h"

 


int WINAPI WinMain(    HINSTANCE hInstance,
                    HINSTANCE hPrevInstance,
                    LPTSTR    lpCmdLine,
                    int       nCmdShow)
{
     // TODO: Place code here.

    CImgTest imgTest;
    imgTest.Open();
    return 0;
}
//
// ImgTest.h: interface for the CImgTest class.
//
//

#ifndef IMGTEST_H
#define IMGTEST_H

#include "imaging.h"

class CImgTest 
{
public:
    void Open();
    CImgTest();
    virtual ~CImgTest();

protected:
    IImage * pImage;
    IImagingFactory * pImagingFactory;
};

#endif //#ifndef IMGTEST_H

//
// ImgTest.cpp: implementation of the CImgTest class.
//
//

#include "stdafx.h"
#include "initguid.h"
#include "ImgTest.h"


#pragma comment (lib,"Ole32.lib")


CImgTest::CImgTest()
{

}

CImgTest::~CImgTest()
{

}

void CImgTest::Open()
{


    HRESULT hr;

    if (FAILED(hr = CoInitializeEx(NULL, COINIT_MULTITHREADED)))
    { 
        goto END;
    }

    if(FAILED(hr = CoCreateInstance(CLSID_ImagingFactory,NULL,CLSCTX_INPROC_SERVER,IID_IImagingFactory,(void**) &pImagingFactory)))
    {
        goto END;
    }

    if(FAILED(hr = pImagingFactory->CreateImageFromFile(TEXT("测试.bmp"), &pImage)))
    {
        goto END;
    }


END:
    if(pImage != NULL)
    {
        pImage->Release();
        pImage = NULL;
    }

    if(pImagingFactory != NULL)
    {
        pImagingFactory->Release();
        pImagingFactory = NULL;
    }

    CoUninitialize();
}

 

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/faintbook/archive/2009/03/24/4019963.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值