天天看点

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

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

  一、引言

  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:竖向图与横向图的屏幕刷新选项

屏幕刷新选项   竖向          横向

    

  ●调整内容适应窗口大小

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

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

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

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

  ●更改内容

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

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

  ●更改布局

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

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

  ●设计正方形

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

  日历“选项”对话框的整个内容在两种取向模式下都显示在 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 所示:

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

图 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 的应用程序,要求取消关于屏幕方向的假设。使用本文提供的简单指南,您可以编写安装和运行于竖向、横向和正方形屏幕上的应用程序。