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的图可以包含透明度信息。这里主要介绍wince下PNG图片的显示方法,开发环境是EVC4.0sp4+wince5.0,源程序为实现PNG 显示作为我应用程序的GUI。
在一些多媒体项目中,图片显示是必不可少的,然而EVC的标准win32函数中,用于图片操作的只有LoadBitmap和BitBlt等位图函数,当然,用位图示是速度最快的一种方式,但是由于位图的不压缩性,使图片的体积非常大,使有些项目的开发板中,位图占用了大量的磁盘空间,如果使用JPG,GIF等高压缩比的图片,可以大大缩小程序的体积,然而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根式的数据文件,很是麻烦,这样的就可以直接将资源文件复制到指定的位置很是方便了。
感谢网络上的大侠们的无私奉献!