Wince下显示png图的有一个方法--COM组件编程

Wince下显示png图的方法

 

嵌入式领域小混混  O(_)O  华清远见:牛牛猛

点击链接加我好友!

http://student.csdn.net/invite.php?u=111047&c=758a60d66d3a92d1

欢迎大家去我CSDN博客上踩踩

http://blog.csdn.net/mistyeyed

和我的主页

wince的开发过程中,经常要涉及到GUI等开发,其强大的功能依赖于微软各种动态库和组件的支持, IPHONE效果的UI令我们眼花缭乱,有很多花稍的图片,和动态的显示效果,给用户带来超爽的用户体验。

PNG格式的图片来实现这样的效果是个不错的注意,因为PNG的图可以包含透明度信息。这里主要介绍wincePNG图片的显示方法,开发环境是EVC4.0sp4+wince5.0,源程序为实现PNG 显示作为我应用程序的GUI

    在一些多媒体项目中,图片显示是必不可少的,然而EVC的标准win32函数中,用于图片操作的只有LoadBitmapBitBlt等位图函数,当然,用位图示是速度最快的一种方式,但是由于位图的不压缩性,使图片的体积非常大,使有些项目的开发板中,位图占用了大量的磁盘空间,如果使用JPGGIF等高压缩比的图片,可以大大缩小程序的体积,然而EVC没有直接支持这些图片操作的函数,我们可以使用微软提供的组件COM去实现这个功能。

我们可以将我们图片资源文件放到SD卡或是flash中存贮,用的时候直接去存贮设备里调用就可以了,这样方便程序的UI的更新。

 

(1)       确保你的系统已经添加了组件:

PNG Decoder

Internet Explorer PNG Image Decoder

当然了既然是COM编程,所以COM组件还是必须要加进来的哦

 

(2)       EVC中编写如下的函数:

//----------------------------------------------------------------------

// DrawImage - Display png picture.

//

void DrawImage(HWND hWnd, HDC hdc, LPCWSTR lpResourceName, int left, int top, int right, int bottom)

{

         HRSRC hrRes;

         HGLOBAL hGlobal;

         LPSTR lpRes;

         DWORD dwSize;

         RECT rect;

         HRESULT hr ; //·µ»Ø½á¹û

 

 

         HMODULE hModule_Current;

         IImagingFactory *pImageFactory = NULL;               //Image工厂对象接口

         IImage *pImage = NULL;                                                        //Image对象接口

 

//³õʼ»¯COM×é¼þ¶ÔÏó

         if (FAILED(hr = CoInitializeEx(NULL, COINIT_MULTITHREADED)))

    {

 

                   MessageBox (NULL, TEXT("COINIT_MULTITHREADED ERROR!"), TEXT("´íÎó"), MB_TOPMOST | MB_OK);

        

         return;

 

    }

 

         hModule_Current = GetModuleHandle (NULL);                                  //获得文件句柄

         hrRes = FindResource (hModule_Current, lpResourceName, RT_RCDATA); //查找资源´

         dwSize = SizeofResource (GetModuleHandle (NULL), hrRes);         //获得资源文件大小

         hGlobal = LoadResource (GetModuleHandle (NULL), hrRes);         //加载文件                        

         lpRes = (LPSTR)LockResource (hGlobal);                                               //锁定资源文件

        

 

         rect.bottom = bottom;

         rect.top = top;

         rect.right = right;

         rect.left = left;

 

         if (SUCCEEDED (CoCreateInstance (CLSID_ImagingFactory,           //创建图像对象

                                                                                    NULL,

                                                                                    CLSCTX_INPROC_SERVER,

                                                                                    IID_IImagingFactory,

                                                                                    (void **)&pImageFactory)))

         {

                   if (SUCCEEDED (hr=pImageFactory->CreateImageFromFile (lpResourceName, &pImage)))         //从文件中创建对象

         //(SUCCEEDED (pImageFactory->CreateImageFromBuffer (lpRes, dwSize, DISPOSAL_NONE, &pImage))) //从缓存中创建对象,不知道为啥不行,没仔细看                                           

                   {                

                            hdc = GetDC(hWnd);

                            pImage->Draw (hdc, &rect, NULL);                                                                          //显示图像

//                         UnlockResource (hGlobal);

                            pImage->Release ();

                   }

                   pImageFactory->Release ();

         }       

        

         CoUninitialize ();                                            //释放COM资源

 

         DeleteObject (hrRes);

}

    上面的方法是个不错的方式,原来最项目时总是要把图像转化成raw根式的数据文件,很是麻烦,这样的就可以直接将资源文件复制到指定的位置很是方便了。

感谢网络上的大侠们的无私奉献!

 

你可能感兴趣的:(编程,image,null,嵌入式,微软,WinCE)