65.9K
CodeProject 正在变化。 阅读更多。
Home

将注册表查看器应用程序从 Pocket PC 移植到 SmartPhone 2002

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.83/5 (6投票s)

2002年5月16日

CPOL

6分钟阅读

viewsIcon

61024

downloadIcon

110

注册表查看器示例从用户界面设计到实现细节的移植过程。

引言

有很多 Windows CE 3.0 应用程序可以证明对 Smartphone 2002 平台很有用。该平台基于 Windows CE 3.0,这是一个对软件移植的好兆头。然而,这个新的移动平台有很多特定之处。内容区域小、缺乏触摸屏和其他用户界面概念是软件开发人员潜在的问题。平台之间的主要区别在 《面向 Pocket PC 开发人员的 Smartphone 2002 简介》一文中进行了概述。

为了体验新平台的移植方面,我决定移植一个现有的不使用 MFC 的 Pocket PC 应用程序。Pocket PC 2002 SDK 提供了一个简单的注册表查看器示例,名为“PSPCMonkey”。本文描述了该应用程序从用户界面设计到实现细节的移植过程。

本文还演示了一些 Smartphone 2002 平台特有的技术

  • 处理新的菜单栏资源,包括解决与之相关的已知问题的变通方法。
  • 创建可扩展的编辑框和列表框。
  • 实现“返回”键支持。
  • 创建具有标准 Smartphone 2002 外观的标签。
Original registry viewer on Pocket PC The registry viewer after porting to Smartphone 2002

开始

最先的想法是未经任何修改地将应用程序编译到 Smartphone 2002 平台。它纯粹使用 API 编写,因此我们很有可能从编译器获得不错的结果……

 WCE configuration toolbar

正如预期的那样,我们获得了 0 个错误、0 个警告的完美结果。让我们运行应用程序,在 Smartphone 2002 端看看。

First run at Smartphone 2002

结果看起来不太好。快速审查应用程序后,发现需要进行以下几项工作:

  • 列表框:根据 Smartphone 2002 指南,列表框应只包含一行。
  • 菜单栏:应用程序应包含自己的菜单栏。
  • 返回键:应用程序应支持“返回”键。
  • 按钮:Smartphone 2002 不支持按钮。
  • 内容区域:控件不适合内容区域。对话框可以使用垂直滚动条来放置所有控件。
  • 标签:标签应看起来像标准的 Smartphone 2002 标签。
  • 标题栏:标题栏应显示应用程序名称。消息框的标题不应太长。
  • 控件行为:没有触摸屏。

用户界面设计

用户界面设计是移植最重要的方面。应考虑小内容区域、缺少触摸屏和另一套控件。用户界面设计将分为几个步骤。

Main window Expanded list control Expanded edit box

布局设计

在 Smartphone 2002 屏幕上放置控件的主要规则是“一个控件应占据一行”。建议使用标签来指示控件显示的信息类型。标签应直接放在控件上方。

控件

根据 Smartphone 2002 指南,列表框应只包含一行。导航可以通过两种方式进行:使用带有左右按钮的旋转控件和使用列表的扩展视图。列表的扩展视图在我们的情况下非常有用,因为列表中可能有许多项。

Smartphone 2002 平台不支持按钮。一个好的解决方案是用菜单栏中的项来替换它们。

菜单栏的动作按钮(左软键)将取代鼠标点击。用户将使用此键进入注册表项。第二个软键通常用于菜单,但我们的简单应用程序没有菜单。因此,菜单栏中将只有一个额外的键,即“返回”项,它将替换原始应用程序中的“返回/向上”按钮。

行为

应用程序的用户界面通常依赖于鼠标(触笔)事件。Smartphone 2002 由于没有触摸屏,无法产生点击。在我们的例子中,我们有一个非常简单的应用程序,但它没有触摸屏就无法工作!问题在于列表框使用点击事件进行导航。我们将用菜单栏中的特殊菜单项来替换这些点击。

实现

可扩展列表和编辑框

我们需要减小列表框的高度,并添加旋转控件用于项选择和扩展。以下资源代码创建了一个具有所需功能的列表框。

  LISTBOX      IDL_LISTBOX,4,15,131,10, WS_TABSTOP | WS_VISIBLE | 
               LBS_NOINTEGRALHEIGHT
  CONTROL      "", IDC_UPDOWN, UPDOWN_CLASS, WS_VISIBLE | 
               UDS_AUTOBUDDY | UDS_HORZ | UDS_ALIGNRIGHT | 
               UDS_ARROWKEYS | UDS_SETBUDDYINT | UDS_WRAP | 
               UDS_EXPANDABLE, 0,0,0,0

以下资源代码创建了一个可扩展的编辑框。由于这是一个查看器应用程序,因此应用了只读标志。

  EDITTEXT     IDE_TEXTOUT,4,70,131,12,ES_MULTILINE | 
               ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_READONLY | 
               WS_TABSTOP
  CONTROL      "", IDC_UPDOWN, UPDOWN_CLASS, UDS_AUTOBUDDY | 
               UDS_ALIGNRIGHT | UDS_EXPANDABLE | UDS_NOSCROLL, 
               0, 0, 0, 0

菜单栏

菜单栏资源是一个新资源,资源编辑器无法正确处理它。菜单栏资源存在 2 个已知问题:未定义的 I_IMAGENONE 关键字以及资源编辑器将菜单栏资源转换为二进制格式。您可以在 本文 中找到有关该问题和变通方法的更多详细信息。

为了解决这些问题,我将菜单栏资源放在一个单独的自定义资源文件中。为此,我创建了一个单独的文本文件,并在其中添加了以下菜单栏代码。

  IDR_MENUBAR RCDATA
  BEGIN
   IDR_MAINMENU, 
   2,            
   I_IMAGENONE, IDM_ENTER, TBSTATE_ENABLED, TBSTYLE_BUTTON | 
       TBSTYLE_AUTOSIZE, IDS_ENTER, 0, NOMENU,
   I_IMAGENONE, IDM_BACK, TBSTATE_ENABLED, TBSTYLE_BUTTON | 
       TBSTYLE_AUTOSIZE, IDS_BACK, 0, NOMENU,            
  END

然后我将文件保存为 PSPCMonkey.rc2 并将其添加到项目中。最后一步是通过 View->Resource Includes 菜单项将此文件添加到编译时资源包含中。

这种方法解决了此自定义资源的问题。现在,菜单栏资源无法在资源编辑器中编辑;它应作为文本文件进行编辑。

我们还需要将菜单栏中使用的字符串添加到我们的字符串表中。

  STRINGTABLE DISCARDABLE 
  BEGIN
    IDS_BACK                "Back"
    IDS_ENTER               "Enter"
  END

返回键

返回键应将用户带回上一个屏幕。在编辑控件中,它也充当退格键。我们应用程序中的所有编辑框都是只读的,因此在主窗口中按下返回键应隐藏我们的应用程序。建议每次执行应用程序时都将用户返回到“全新”状态。因此,返回键将关闭我们的对话框。

要实现此行为,我们不应在对话框中覆盖返回键。在这种情况下,返回键会向对话框发送 WM_COMMAND/IDANCEL。我们只需要在 DialogProc 的主开关中添加标准的处理程序。

  // ...
  case WM_COMMAND:
    switch (LOWORD(wParam))
    {
      // User chose to close the dialog
      case IDCANCEL:  //Handles the BACK KEY
        EndDialog(hDlg, TRUE);
        break;
      // ...

标题栏

由于任务栏的大小有限,应用程序标题应简短明了。标题也可以更改为子窗口。例如,消息框将在标题栏中显示其标题。在我们的应用程序中,标题栏将为 ​​主窗口显示“Registry Editor”,为包含错误消息的消息框显示“Error”。

Labels

标准的 Smartphone 2002 应用程序(例如,收件箱)对标签使用 11 磅粗体的 Nina 字体,而不是当前的对话框字体。以下代码创建了此字体。

  HFONT CreateLabelFont()
  {
    LOGFONT lf;
    memset(&lf, 0, sizeof(LOGFONT));
    HDC hdc = ::GetDC(NULL);
    lf.lfHeight = -11 * GetDeviceCaps(hdc, LOGPIXELSY) / 72;
    ::ReleaseDC(NULL, hdc);
    lf.lfWeight = FW_SEMIBOLD;
    return CreateFontIndirect(&lf);
  }
		

现在,我们可以在 WM_INITDIALOG 处理程序中将创建的字体分配给标签。

  g_hLabelFont = CreateLabelFont();
::SendDlgItemMessage(hDlg, IDC_STATIC1, WM_SETFONT, 
    (int) g_hLabelFont, 0);
::SendDlgItemMessage(hDlg, IDC_STATIC2, WM_SETFONT, 
    (int) g_hLabelFont, 0);
::SendDlgItemMessage(hDlg, IDC_STATIC3, WM_SETFONT, 
    (int) g_hLabelFont, 0);
::SendDlgItemMessage(hDlg, IDC_STATIC4, WM_SETFONT, 
    (int) g_hLabelFont, 0);
		

并在不再需要时销毁字体(在 WM_DESTROY 处理程序中)。

  case WM_DESTROY:
    DeleteObject(g_hLabelFont);
    break;
		

结论

从编译器的角度来看,将不使用 MFC 的 Windows CE 应用程序移植到 Smartphone 2002 平台很容易。然而,移植并不那么容易。工作将花费在用户界面设计上。您应该为小内容区域设计窗口;考虑新控件、不消耗鼠标点击的新行为、返回按钮和标题栏。

似乎大多数应用程序都应保持其可用性。我们失去了触摸屏、相当大的内容区域和一些控件,但我们获得了可扩展的列表框和编辑框、旋转控件、可滚动对话框以及许多硬件键。我认为,对于那些可以在 Smartphone 2002 平台上像在 Pocket PC 平台上一样有用的应用程序来说,这些新方面应该可以弥补失去的方面。

© . All rights reserved.