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

Microsoft

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

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

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

本页内容

引言
更改屏幕方向
应用程序窗口如何识别屏幕方向
刷新屏幕内容
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 的应用程序,要求取消关于屏幕方向的假设。使用本文提供的简单指南,您可以编写安装和运行于竖向、横向和正方形屏幕上的应用程序。