开发识别屏幕方向的应用程序
适用范围:
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消息。
注意: 如果应用程序有顶层窗口,或使用 SHHandleWMSettingChange、SHInitDialog 和 SHFullScreen 方法创建了窗口,它会同时收到 WM_SIZE 和WM_SETTINGCHANGE 消息。但是,如果应用程序创建了子窗口,子窗口收不到 WM_SIZE 消息,即使子窗口是全屏窗口。
以下 WindowProc 模板的代码示例利用了 WM_SIZE 和 WM_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:竖向图与横向图的屏幕刷新选项
屏幕刷新选项 |
竖向 |
横向 |
---|---|---|
调整内容适应窗口大小 重新调整日历网格单元的大小以适用工作区域。 |
|
|
调整内容适应窗口大小 “内存”设置控制面板将列表框重新设置为最大尺寸,然后重新确定它四周所有界面元素的位置。 |
|
|
更改内容。 “日历”在横向显示模式下一次只显示 8 个月份。 |
|
|
更改布局。 在横向显示模式下,Windows Media Player 的按钮出现在视频内容的一侧,不是在下端。 |
|
|
设计正方形。 日历“选项”对话框的整个内容在两种取向模式下都显示在 240x240 的正方形区域内。 |
|
|
请记住,要尽可能的设计通用布局,这样应用程序可处理任意尺寸和任何宽高比的显示内容。这意味着尽可能避免分开设计横竖向模式。如果必须设计不同的横竖向布局模式,不要简单地因屏幕宽度大于屏幕高度,而假设应用程序能在横向模式下显示。例如,设备屏幕宽可能有 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_1、IDC_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 所示:
这个对话告诉用户,他们要使用的应用程序程序可能无法识别正方形屏幕旋转,因此不能在横向模式下正确显示。只有 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 的应用程序,要求取消关于屏幕方向的假设。使用本文提供的简单指南,您可以编写安装和运行于竖向、横向和正方形屏幕上的应用程序。