随笔 - 2, 文章 - 73, 评论 - 60, 引用 - 0
数据加载中……

开发识别屏幕方向的应用程序

开发识别屏幕方向的应用程序
发布日期 : 8/17/2004 | 更新日期 : 8/17/2004

Microsoft

适用范围:
Windows Mobile™ 2003 第二版软件
基于 Windows Mobile™ 的 Pocket PC

摘要:了解基于 Windows Mobile 的设备如何在横竖向模式下显示、该功能的后台情况、为该功能开发移动应用程序的相关信息、开发者指南中新的建议和示例。

请从 Microsoft 下载中心下载 Crossword.msi

本页内容

引言 引言
更改屏幕方向 更改屏幕方向
应用程序窗口如何识别屏幕方向 应用程序窗口如何识别屏幕方向
刷新屏幕内容 刷新屏幕内容
RelayoutDialog RelayoutDialog
原有应用程序的特性 原有应用程序的特性
安装警告消息 安装警告消息
结论 结论

引言

Windows Mobile 2003 第二版软件为 Pocket PC 引入了新的功能,使基于 Windows Mobile 的设备可在横竖向两种模式下显示。在有些设备中,横向是默认的显示模式。此外,用户将能在使用中让屏幕在两种方向之间切换,而不必重新设置设备。

本文提供了有关该功能的后台信息、并介绍了开发适用于横竖向屏幕的移动应用程序的相关信息。此外,还向开发者提供了新的指南(包括一些建议和示例)供参考。

更改屏幕方向

通常,屏幕方向仅在用户使用“屏幕方向”控制面板,或按下某硬件按钮来旋转屏幕时才改变。

此外,应用程序也可通过 ChangeDisplaySettingsEx 函数以编程方式更改屏幕方向。该函数使用方法见 MSDN 中“Rotating the Content of the Screen”(旋转屏幕内容的方向)一文。例如,如果使用的应用程序只能在竖向模式下操作,则可通过编程改变屏幕方向。但是,如果屏幕方向的改变很突然,通过编程改变屏幕方向会让用户搞不清楚。应用程序应始终要求用户在旋转屏幕前确认显示模式。

为了在竖向模式下显示,将 dmDisplayOrientation 字段中的 DEVMODE 结构设置为 DMDO_0。对于右手横向模式,使用 DMDO_270。对于左手横向模式,使用 DMDO_90。

应用程序窗口如何识别屏幕方向

屏幕方向如果改变,或当“输入面板”出现时,应用程序的所有全屏顶层窗口都要适应新的取向。

注意: 如果窗口的上、左、右坐标在工作区域边界之上或之外,该窗口被认为是全屏窗口。工作区域是标题栏下的整个屏幕区域。顶层窗口是无父窗口的窗口,即有一个 NULL 父窗口。

如果窗口大小改变,窗口将收到 WM_SIZE 通知。WM_SIZE 消息的 lParam 参数的低位字指定了客户端区域的新宽度,高位字指定了客户端区域的新高度。应用程序应识别窗口大小的改变,并相应地更新窗口布局。此外,也应重新确定所包含任何子窗口的布局。

如果应用程序没有全屏窗口,它收不到 WM_SIZE 通知。相反,它应在 wParam 参数设置为 SETTINGCHANGE_RESET 时监听 WM_SETTINGCHANGE消息。

注意: 如果应用程序有顶层窗口,或使用 SHHandleWMSettingChangeSHInitDialogSHFullScreen 方法创建了窗口,它会同时收到 WM_SIZEWM_SETTINGCHANGE 消息。但是,如果应用程序创建了子窗口,子窗口收不到 WM_SIZE 消息,即使子窗口是全屏窗口。

以下 WindowProc 模板的代码示例利用了 WM_SIZEWM_SETTINGCHANGE 消息。

    switch (uMessage)
    {
        case WM_SIZE:
            // 重新计算所有子窗口的布局;重新设置
            // 列出视图和编辑框的大小,重新确定按钮、
            // 静态文字和其他控件的位置。
            break;
        case WM_SETTINGCHANGE:
            if (SETTINGCHANGE_RESET == wParam) {
                // 屏幕方向改变。此时
                // 执行 WM_SIZE 不能执行的处理,
// 如重新调整全屏子窗口的大小,对
// 顶层窗口调用 MoveWindow 等等。
// 如果不需要处理 WM_SETTINGCHANGE 消息,可以
// 忽略它。
            }
            break;
      }

刷新屏幕内容

使用 Windows Mobile 2003 第二版软件时,Pocket PC 的最小显示区域是 240 个像素高和 240 个像素宽。编程人员应保证应用程序在最低配置下可用。常见问题是,菜单在竖向显示模式下可能符合要求,但在横向显示模式不符合要求。如果这样,需要在两个菜单之间重新排列菜单项。

刷新应用程序的屏幕内容时,可以使用下列 4 个编程选项:

  • 调整内容适应窗口大小

  • 更改内容

  • 更改布局

  • 设计所有布局通用的 240x240 正方形。

1 显示了各方法(调整内容适应窗口大小有两个示例)在 Pocket PC 的 Windows Mobile 软件中刷新屏幕内容的示例:

表 1:竖向图与横向图的屏幕刷新选项

屏幕刷新选项

竖向

横向

调整内容适应窗口大小

重新调整日历网格单元的大小以适用工作区域。

 

screen_orientation_awareness01

 

screen_orientation_awareness02

调整内容适应窗口大小

“内存”设置控制面板将列表框重新设置为最大尺寸,然后重新确定它四周所有界面元素的位置。

 

screen_orientation_awareness03

 

screen_orientation_awareness04

更改内容。

“日历”在横向显示模式下一次只显示 8 个月份。

 

screen_orientation_awareness05

 

screen_orientation_awareness06

更改布局。

在横向显示模式下,Windows Media Player 的按钮出现在视频内容的一侧,不是在下端。

 

screen_orientation_awareness07

 

screen_orientation_awareness08

设计正方形。

日历“选项”对话框的整个内容在两种取向模式下都显示在 240x240 的正方形区域内。

 

screen_orientation_awareness09

 

screen_orientation_awareness10

请记住,要尽可能的设计通用布局,这样应用程序可处理任意尺寸和任何宽高比的显示内容。这意味着尽可能避免分开设计横竖向模式。如果必须设计不同的横竖向布局模式,不要简单地因屏幕宽度大于屏幕高度,而假设应用程序能在横向模式下显示。例如,设备屏幕宽可能有 321 个像素,而屏幕高有 320 个像素。在这样的设备上,应用程序也许能以横竖向两种模式显示,应选择应用程序最适用或首选的模式,这可能是竖向模式。

RelayoutDialog

在 CrosswordSample 应用程序中,有一个函数是 RelayoutDialog,它可帮助重新设置、重新定位对话框中的子控件。例如,假设对话框有两个对话模板,一个用于横向,一个用于竖向。如果这两个模板中的控件相同,且有相同的控件 ID,则可使用下列代码作为 WM_SIZE 处理程序:

case WM_SIZE:
RelayoutDialog(g_hInst, hDlg, InWideMode() ?
MAKEINTRESOURCE(IDD_TOOLS_OPTIONS_1_WIDE) :
MAKEINTRESOURCE(IDD_TOOLS_OPTIONS_1));

注意: 定义为 IDC_STATIC 的控件具有相同的控件 ID,所以如果有多个 IDC_STATIC控件,应当把它们重命名为 IDC_STATIC_1IDC_STATIC_2等。

如果静态控件在新布局中也发生了变换,RelayoutDialog 会同时更新静态控件的文本和位图。

原有应用程序的特性

当用户在基于 Windows Mobile 2003 第二版的 Pocket PC 上运行旧应用程序时,用户还保留了以往在竖向模式下的经验,但竖向模式与横向模式的经验将有所不同。在横向模式下,对话框的下半部分可能跑出屏幕底线之外。为了解决这个问题,系统将显示一个垂直滚动条,允许用户滚动屏幕。只有存在常出现于竖向屏幕底部的控件时,才出现垂直滚动条。如果不出现,则不出现滚动条。

应用程序是否是“原有”应用程序,取决于可执行文件头中的子系统版本。默认情况下,使用 Windows Mobile 2003 SDK 编译的应用程序中的子系统版本号为 4.20 或更低版本号,在将来版本的 Pocket PC SDK 中子系统版本号为 4.21 或更高版本号。子系统版本号为 4.20 或低于 4.20 时被认为是旧应用程序,可以看见滚动条。

知道了这种特性,用户就能通过滚动条看见隐藏的图像(假设不能直接看见的图像和控件)。此外,您仍可以使用这种技术快速存储或检索图像,但应在屏幕的左侧完成这项工作。

理想情况下,对话框不应需要滚动条。为此,最好的方法是:使对话框控件在竖向模式下不被“输入面板”覆盖,故最好设计 240x240 的最低分辨率。

安装警告消息

当在基于 Windows Mobile 的可旋转屏幕的 Pocket PC 上安装了旧应用程序时,将出现以下消息,如 11 所示:

screen_orientation_awareness11

11 :安装警告消息

这个对话告诉用户,他们要使用的应用程序程序可能无法识别正方形屏幕旋转,因此不能在横向模式下正确显示。只有 VersionMin 值(它指定应用程序支持的最低操作系统版本号)低于 4.21,才显示这个对话。

由于将 VersionMin 设置为 4.21 将阻止把应用程序安装在基于旧 Windows Mobile 的 Pocket PC 上,所以建议把BuildMax 值(不常用)设置为表 2 中的值,禁用此消息:

表 2:BuildMax 值

0xA0000000

应用程序支持正方形屏幕(240x240 像素)。

0xC0000000

应用程序支持屏幕旋转。

0xE0000000

应用程序支持正方形屏幕旋转。

这些参数可通过编辑 INF 文件的 [CEDevice] 部分(cabwiz 用来生成 CAB 文件)来更改。有关 INF 文件格式的详细信息,请参阅 MSDN 文档。

结论

开发基于 Windows Mobile 2003 第二版软件的 Pocket PC 的应用程序,要求取消关于屏幕方向的假设。使用本文提供的简单指南,您可以编写安装和运行于竖向、横向和正方形屏幕上的应用程序。

 

posted on 2008-01-23 11:30 郭天文 阅读(718) 评论(0)  编辑 收藏 引用 所属分类: Windows Mobile


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理