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






3.83/5 (6投票s)
注册表查看器示例从用户界面设计到实现细节的移植过程。
引言
有很多 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 外观的标签。
![]() |
![]() |
开始
最先的想法是未经任何修改地将应用程序编译到 Smartphone 2002 平台。它纯粹使用 API 编写,因此我们很有可能从编译器获得不错的结果……
正如预期的那样,我们获得了 0 个错误、0 个警告的完美结果。让我们运行应用程序,在 Smartphone 2002 端看看。
结果看起来不太好。快速审查应用程序后,发现需要进行以下几项工作:
- 列表框:根据 Smartphone 2002 指南,列表框应只包含一行。
- 菜单栏:应用程序应包含自己的菜单栏。
- 返回键:应用程序应支持“返回”键。
- 按钮:Smartphone 2002 不支持按钮。
- 内容区域:控件不适合内容区域。对话框可以使用垂直滚动条来放置所有控件。
- 标签:标签应看起来像标准的 Smartphone 2002 标签。
- 标题栏:标题栏应显示应用程序名称。消息框的标题不应太长。
- 控件行为:没有触摸屏。
用户界面设计
用户界面设计是移植最重要的方面。应考虑小内容区域、缺少触摸屏和另一套控件。用户界面设计将分为几个步骤。
![]() |
![]() |
![]() |
布局设计
在 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 平台上一样有用的应用程序来说,这些新方面应该可以弥补失去的方面。