Pocket PC 2002 图像查看器开发指南

在本文中,将探讨如何在Pocket PC2002上开发一个图像查看器应用程序。将介绍使用imgdecmp.lib库来加载BMP、JPEG和GIF图像文件的方法,实现“触摸并滚动”功能以方便滚动,以及如何实现全屏视图。此外,还将讨论如何从文档/视图工具栏中移除“新建”按钮,以及如何为视图添加标题栏。

应用程序架构

本应用程序采用了MFC的文档/视图架构,以简化实现过程。位图图片是在派生自CScrollView的类中绘制的,并且特别支持“触摸并滚动”功能。这允许用户使用手写笔通过触摸和拖动来滚动位图。文档不支持保存(毕竟,这是一个查看器),但支持缩放。放大和缩小命令在文档级别支持,尽管可以说它们也可以在视图级别实现。

加载图像

图像是通过一个文档不足的API加载的,该API通过imgdecmp.lib实现。这个库及其头文件都随PPC2002 SDK分发。显然,这是Pocket IE用来从互联网加载其图像的相同机制,这就是为什么它支持数据包架构的原因。至于文件格式,它被报道支持BMP、JPEG和GIF,但可能支持更多。

图像是在CPicViewDoc::Serialize()中加载的。这个过程(见源代码)涉及到调用DecompressImageIndirect()函数,DecompressImageInfo结构和两个回调函数。第一个回调函数-GetImageData()-用于分块读取图像数据,而第二个-ImageProgress()-用于报告图像加载进度。在这个示例中,回调什么也不做(但确实必须存在)。

DecompressImageInfo结构的字段相当自解释,有一个例外:lParam。这是传递给回调函数的参数,使用它来传递一个包含一对值的结构的指针(ReadBmp):从打开的CArchive中检索到的CFile指针,以及图像大小的计数器。对于这个应用程序来说,这不是绝对必要的,因为一个文件只有一个图像,所以传递CFile*在lParam中就足够了。这种技术被使用是因为它允许可扩展性,在文件有多个图像的情况下,比如皮肤文件。在这里不能依赖文件末尾停止渲染位图。

触摸并滚动

这种技术允许通过触摸和拖动序列滚动图像。图像将跟随手写笔,自动滚动。滚动条也是存在并活跃的。

为了实现这种效果,视图处理OnLButtonDown()和OnMouseMove()(见代码)。第一个存储触摸点,第二个计算滚动向量。然后这个向量在ScrollTo()方法中使用,其中计算新的滚动位置。注意,这段代码是直接从MFC的源代码中适应的,以避免使用CScrollView::ScrollToPosition()时得到的不愉快的“锯齿状”滚动。这个方法不允许同时在x和y方向上滚动。

全屏视图

Pocket PC2002中,全屏功能是通过SHFullScreen API实现的。这个函数允许应用程序将其主窗口定位在通常由系统控制的区域,如SIP和任务栏。实现这一点的代码在CMainFrame::OnFullScreen()处理程序中。为了支持全屏切换,通过触摸并按住命令提供了一个上下文菜单。这个菜单允许进入和退出全屏模式,以及发出放大和缩小命令。

新建按钮

因为这只是查看器,所以使用Vassili Philippov设计的技术从主菜单中移除了“新建”按钮。原始文章在这里:

如何从命令栏中移除新建按钮?

标题栏

更新日期:2003年10月27日。示例应用程序现在支持一个标题栏,用于显示图像的文件名。这个标题栏可以通过菜单选项,在“工具”下隐藏或显示。

这个标题栏是通过CCeTitleBar类实现的,这是一个派生自CControlBar的窗口。它只是在预定义的字体和颜色中显示标题文本。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485