Pocket PC 2002 的图片查看器






4.79/5 (19投票s)
使用 imgdecmp.lib 并附带一些额外功能。

引言
这是一个非常简单的图片查看器,演示了您可能想在自己的 Pocket PC 2002 项目中使用的一些实现细节。这些细节包括:
- 使用 imgdecmp.lib加载 BMP、JPEG 和 GIF 图像文件。
- 实现“点击和滚动”以方便滚动。
- 实现全屏视图。
- 从文档/视图工具栏中删除“新建”按钮。
- 为视图添加标题栏(新增)
应用程序架构
此应用程序使用 MFC 的文档/视图体系结构来简化实现。位图图片绘制在 CScrollView 派生类中,并具有对“点击和滚动”功能的特殊支持。这允许用户通过点击和拖动笔来滚动位图。文档不允许保存(毕竟,这是一个查看器),但支持缩放。缩放命令在文档级别得到支持,尽管可以说,它们也可以在视图级别实现。
加载图片
图像通过一个文档稀少的 API 加载,该 API 通过 imgdecmp.lib 实现。该库及其头文件均随 PPC2002 SDK 分发。显然,这与 Pocket IE 从 Internet 加载其图像所使用的机制相同,这就是为什么它支持数据包架构的原因。至于文件格式,据报告支持 BMP、JPEG 和 GIF,但可能支持更多。
图像在 CPicViewDoc::Serialize() 中加载。该过程(请参见源代码)涉及调用 DecompressImageIndirect() 函数、DecompressImageInfo 结构和两个回调函数。第一个回调函数 - GetImageData() - 用于分块读取图像数据,而第二个回调函数 - ImageProgress() - 用于报告图像加载进度。在此示例中,回调函数不执行任何操作(但确实,它必须存在)。
DecompressImageInfo 结构中的字段相当自明,但有一个例外:lParam。这是传递给回调函数的参数,我使用它来传递指向包含一对值的结构(ReadBmp)的指针:从打开的 CArchive 检索到的 CFile 指针,以及图像大小的计数器。这对于此应用程序并非严格必要,因为一个文件只有一个图像,因此在 lParam 中传递 CFile* 就足够了。此技术用于可扩展性,以防文件包含多个图像,例如皮肤文件。在这里,您不能依赖文件结尾来停止渲染位图。
点击和滚动
此技术允许通过点击和拖动序列来滚动图像。图像将跟随笔,自动滚动。滚动条也存在且可用。
为了实现这种效果,视图会处理 OnLButtonDown() 和 OnMouseMove()(请参见代码)。前者存储点击点,后者计算滚动向量。然后,该向量用于 ScrollTo() 方法,在该方法中计算新的滚动位置。请注意,此代码直接改编自 MFC 的源代码,以避免使用 CScrollView::ScrollToPosition() 时出现的令人不快的“锯齿状”滚动。此方法不允许同时在 x 和 y 方向上滚动。
全屏视图
在 Pocket PC 2002 中,全屏功能通过 SHFullScreen API 实现。此函数允许应用程序将其主窗口定位在通常由系统控制的区域上,例如 SIP 和任务栏。实现此功能的代码位于 CMainFrame::OnFullScreen() 处理程序中。为了支持全屏切换,可以通过长按命令访问上下文菜单。此菜单允许您进入和退出全屏模式,以及发出放大和缩小命令。
新建按钮
由于这只是一个查看器,因此使用 Vassili Philippov 设计的技术从主菜单中删除了 **新建** 按钮。原始文章在此处:如何从命令栏中删除新建按钮?
标题栏
更新于 2003 年 10 月 27 日。示例应用程序现在支持一个标题栏,用于显示图像的文件名。可以通过菜单选项“工具”下的选项来隐藏或显示此标题栏。
此标题栏通过 CCeTitleBar 类实现,该类是 CControlBar 派生窗口。它仅以预定义的字体和颜色显示标题文本。
使用此类非常简单(请参见源代码)。该窗口在视图的 OnCreate 处理程序中创建,并在 OnDestroy 中销毁。视图的 OnUpdate 处理程序用于设置标题文本(文档文件名)。标题栏的显示和隐藏在视图的 OnShowTitle 处理程序中完成。


