在开发移动客户端应用程序时,经常需要在设备上显示用户自定义的图像。为了实现这一功能,参考了一些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,包括:
可以根据这些定义以及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"));
}