在移动设备上显示用户定义图像的方法

在开发移动客户端应用程序时,经常需要在设备上显示用户自定义的图像。为了实现这一功能,参考了一些CodeProject上的代码,并将它们结合在一起,形成了一组非常有用的库。由于这些库的原始版本和文档都可以在CodeProject网站上找到,因此本文不会重复介绍它们。

细节

主要工作是将原始的CXImage库修改,使其能够在PocketPC上编译(使用eVC 3.0)。这需要一些#define更改和#ifdef来排除任何try...catch代码。选择返回false。

由于PNG库使用函数指针,发现eVC在调试和发布版本之间修改了函数签名。除非按照以下方式修改这些函数的签名,否则返回时堆栈会被破坏:

#if defined (_WIN32_WCE) && !defined (_DEBUG) #define _CDECL_MODE_ __cdecl #else #define _CDECL_MODE_ #endif static void _CDECL_MODE_ user_write_data(png_structp png_ptr, png_bytep data, png_size_t length)

修改了DibSectionLite,包括:

  • CodeProject上发布的所有建议的修复(包括16位、24位图像)
  • 裁剪。需要在屏幕上平移一个平面图图像,裁剪在只显示图像的一部分时非常快。
  • 原始的Load和Save现在接受CFile或CString。对于内存图像(CMemFile)非常有用。
  • 通过CXImage加载图像。

可以根据这些定义以及CXImage中的定义来添加支持和缩小/扩大可执行文件大小:

#define DIBSECTION_SUPPORT_BMP 1 #define DIBSECTION_SUPPORT_GIF 1 // 专利! #define DIBSECTION_SUPPORT_JPG 1 #define DIBSECTION_SUPPORT_PNG 1 // ... #define DIBSECTION_SUPPORT_J2K 0 // Beta // 完全损坏的图像... 这可能需要一些工作。 #define DIBSECTION_SUPPORT_JBG 1 // 专利!见 ../jbig/patents.htm

以下是新的加载方法:

BOOL LoadPNG(LPCTSTR lpszFileName); BOOL LoadJPG(LPCTSTR lpszFileName); BOOL LoadBMP(LPCTSTR lpszFileName); BOOL LoadGIF(LPCTSTR lpszFileName); BOOL LoadMNG(LPCTSTR lpszFileName); BOOL LoadICO(LPCTSTR lpszFileName); BOOL LoadTIF(LPCTSTR lpszFileName); BOOL LoadTGA(LPCTSTR lpszFileName); BOOL LoadPCX(LPCTSTR lpszFileName); BOOL LoadWBMP(LPCTSTR lpszFileName); BOOL LoadWMF(LPCTSTR lpszFileName); BOOL LoadJ2K(LPCTSTR lpszFileName); BOOL LoadJBG(LPCTSTR lpszFileName);

构建和测试

代码可以构建为一组.LIB文件。可以编译并构建PocketPCTest应用程序,用于设备。它并不复杂,只是一个练习器。根据需要取消PocketPCTestView.cpp中相应行的注释。

测试应用程序包括以下定义:

CDIBSectionLite m_image;

要绘制图像,请使用以下代码:

void CPocketPCTestView::OnDraw(CDC* pDC) { CPocketPCTestDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: 添加原生数据的绘制代码 m_image.Draw(pDC, CPoint(0, 0)); } CPocketPCTestView::CPocketPCTestView() { // TODO: 在这里添加构造代码 m_image.LoadPNG(_T("\\test.png")); // 24位颜色OK m_image.LoadPNG(_T("\\test-pal.png")); // 256色OK m_image.LoadJPG(_T("\\test.JPG")); // ok m_image.LoadBMP(_T("\\test.BMP")); // ok m_image.LoadGIF(_T("\\test.GIF")); // ok m_image.LoadICO(_T("\\test.ICO")); // ok m_image.LoadTGA(_T("\\test.TGA")); // ok m_image.LoadPCX(_T("\\test.PCX")); // ok m_image.LoadJBG(_T("\\test.JBG")); // ok // 这不是原始代码。 // m_image.LoadMNG(_T("\\test.MNG")); // WMF和PocketPC不太兼容(GetEnhMetaFilePaletteEntries不支持操作系统)。 // m_image.LoadWMF(_T("\\test.WMF")); // 太多__cdecl问题,见头文件 // m_image.LoadTIF(_T("\\test.TIF")); // 图像完全损坏... 这可能需要一些工作。 // m_image.LoadWBMP(_T("\\test.WBMP")); // 图像完全损坏... 这可能需要一些工作。 // m_image.LoadJ2K(_T("\\test.J2K")); }
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485