使用继承将移动 PC 意识构建到与设备无关的 Windows Forms 应用程序中。






4.19/5 (8投票s)
轻松地将墨迹、电源、网络和尺寸感知功能集成到 Windows Form 应用程序中。使用“二十一点纸牌游戏入门工具包”作为示例,这是一个不具备移动 PC 意识的应用程序,通过继承下载中包含的 MobilePCAwareForm 来将其转换为移动 PC 应用程序。
图1。
引言
最低限度地讲,移动 PC 应用程序需要有效地管理其支持的平台的电源需求、通信环境、墨迹和外形尺寸限制。本文展示了如何轻松地将墨迹感知、电源感知、电源感知和尺寸感知功能集成到原本与设备无关的 Windows Form 应用程序中,使其更符合移动 PC 应用程序的标准。本文演示使用的与设备无关的 Windows Form 应用程序是 VB.NET 版本的 二十一点纸牌游戏入门工具包 示例应用程序,开发环境是 Visual Basic 2005 Express Edition 或 Visual Studio 2005。该思想是将几个独立的类组合成一个 Windows Form 类,这些类分别管理屏幕尺寸、墨迹、电源和网络连接,而其他与设备无关的应用程序可以轻松地继承这个类。本文强调了这种方法的一些优点!
背景
移动 PC 可以定义为运行完整版 Windows 操作系统(Windows XP、Windows XP 平板电脑版 2005 或 Windows Vista)的小型、可移动、网络感知的计算机,即笔记本电脑/手提电脑、平板电脑或超便携电脑。移动 PC 应用程序是任何设计用于在移动 PC 上运行的应用程序。Todd Landstad 的文章 为 UMPC 或触摸屏 PC 优化您的移动 .NET 3.0 WPF 应用程序 展示了一种将电源和网络感知功能集成到 WPF 应用程序中的方法。在 Windows Form 应用程序中使用 Visual Inheritance 是另一种方法!本示例提供的 MobilePCAwareForm 是 Todd 文章中记录的 C# 类 *PowerNetworkAware.cs* 到 Visual Basic.NET 的移植,而且功能更强大!例如,电源感知支持根据机器剩余电池电量的百分比禁用/启用 CPU 密集型功能。
理解 MobilePCAwareForm
其思想是将所有移动 PC 感知的 Win32 API 调用封装到一个托管的 Windows Form 类 (*MobilePCAwareForm.vb*) 中,以便其他 Windows Form 应用程序可以轻松地从中继承。*MobilePCAwareForm.vb* 包含两个 PictureBox 控件,分别命名为 PowerStausPictureBox 和 NetworkStatusPictureBox,它们是独立的组件,只需要在设计时调整大小和定位。屏幕尺寸感知也内置其中,并在后面更详细地讨论。MobilePCAwareForm 具有灵活性、可扩展性,并且在应用程序代码和移动 PC 感知代码之间实现了清晰的分离。
继承自 MobilePCAwareForm
二十一点纸牌游戏包含三个 Windows 窗体。为简化演示,将 *BlackJackForm.vb* 设置为项目的启动窗体,而另外两个窗体则从项目中排除。请注意,“开箱即用”的游戏存在一些缺陷!在此演示中,只有 *BlackJackForm.vb* 通过继承自 MobilePCAwareForm 来实现移动 PC 意识。这是通过对 *BlackJackForm.vb* 文件进行简单修改来实现的,如下面的代码片段所示。
' Inheritance is just this simple, but the Microsoft.Ink DLL must
' be referenced for ink support!
Public Class BlackJackForm
Inherits MobilePCAwareForm '<== Makes the form Mobile PC aware!
.
.
.
End Class
二十一点纸牌游戏中的电源感知
考虑一个应用程序,该应用程序具有 CPU 密集型的、耗电的代码,在电池电量较低时可能需要暂时关闭,而在电量再次充足时则会恢复。在二十一点纸牌游戏中,这种 CPU 密集型代码由对作者编写的一个图形密集型方法 AnimatePlayerCard()
的调用“模拟”。它用于动画处理从牌堆发牌到玩家的过程。只要电池电量充足(50% 或更高)或连接交流电源,就会调用玩家卡牌动画。在电池电量不足期间,动画将暂停,除非玩家手动覆盖。参见图 1。为保持简单,发给庄家的牌永远不会进行动画处理!电池电量从低到高或从高到低的过渡会触发显示适当格式化的通知气球。由于用户可以覆盖暂停弱电池通知以节省电量并保持动画模式,因此还包含了一个关键电池通知消息,要求玩家关闭应用程序。控制动画的代码在下面的代码片段中的 UpdateUIPlayerCards()
方法中详细说明。
' Place the CPU-intensive method inside an If...Then block.
' The method fires whenever BatteryIsOk() returns True.
' That's it!
Private Sub UpdateUIPlayerCards()
.
.
.
If (pcards.Count = 2) Then
If (BatteryIsOK()) Then AnimatePlayerCard(i) '<=== Modified. Uses an
' inherited property of MobilePCAwareForm.
.
.
.
End If
If (pcards.Count > 2 And i >= pcards.Count - 1) Then
If (BatteryIsOK()) Then AnimatePlayerCard(i) '<=== Modified. Uses an
' inherited property of MobilePCAwareForm.
.
.
.
End If
.
.
.
End Sub
以下是设计时代码片段,它设置了用于暂停 CPU 密集型任务的低电量阈值,该阈值小于或等于电池电量的 50%。
#Region "Design-time Constant(s)"
'Enable/Disable as needed!
.
.
.
' A value of 0.0 will disables the suspending and resuming of any task(s).
Private Const WEAK_BATTERY_LEVEL As Single = 50.0
.
.
#End Region
二十一点纸牌游戏中的墨迹感知
通过允许玩家在发牌前在赌桌上写下他们的名字来展示墨迹感知。单击“发牌”按钮会触发名称识别,并将该文本放置在 playerNameLabel 中,替换默认名称“Player1”。参见图 1。如下面的代码片段所示,使用了两个继承的方法来实现这一点。
注意:为了支持墨迹,您的项目必须至少包含对 Microsoft.Ink DLL 的引用,才能在 Windows Vista 和 Windows Tablet PC 2005 上运行!
Private Sub BlackJackForm_Load(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles MyBase.Load
.
.
.
StartCollectingInk(Me.Handle) '<=== Added. Uses an inherited property of
' MobilePCAwareForm.
End Sub
Private Sub DealBtn_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles dealButton.Click
' Gets the name written on the black jack table.
UpdatePlayerName() '<== Added a private helper method to try to convert
' ink into a the player's name.
.
.
.
End Sub
' Private helper method to update the PlayerNameLabel text.
Private Sub UpdatePlayerNameLabelText()
' Returns recognized text or the empty string.
RecognizeInk() '<=== Added. Uses an inherited property of MobilePCAwareForm.
If (not RecognizedInk() = String.Empty) Then playerNameLabel.Text =
RecognizedInk()
End Sub
屏幕尺寸感知
屏幕尺寸感知已内置到 MobilePCAwareForm 中。它使用以下算法。当窗体加载时,将保存控件的设计时宽度、高度、顶部坐标、左侧坐标和名称,以及窗体设计时的宽度和高度。当窗体重新调整大小时,将利用这些信息根据窗体设计时的大小成比例地重新调整所有控件的大小。为了支持 UMPC,BlackJackForm 的设计时尺寸设置为 800 x 480 像素。在此示例中,窗体的最小尺寸也设置为 800 x 480 像素。窗体的控件已在设计时重新调整了大小和重新定位,以优化触摸屏输入。
测试应用程序
二十一点纸牌游戏在 Windows Vista 和 Windows XP 平板电脑版 2005 上运行良好,只需插入对 Microsoft.Ink DLL 的引用,版本为 1.7 或 6.0。然而,在 Windows XP 家庭版上测试该应用程序时,会弹出一个安装警告消息框,提示该应用程序在没有管理员在计算机的全局程序集缓存 (GAC) 中安装 Microsoft.Ink DLL 的情况下将无法运行。为了克服这个困难,将 Microsoft.Ink 的一个副本(版本 1.7 或 6.0 均可)放置在项目内的 DLL 文件夹中,并指向该文件位置。如下面的图 2 所示,在项目属性的“引用”选项卡中启用了“复制本地”。这使得应用程序可以在没有墨迹支持的情况下在 Windows XP 家庭版下正确安装和流畅运行!
图2。
最后一点需要注意的是,*PowerNetworkAware.cs* 代码移植中的 NetworkChange_NetworkAvailabilityChanged()
事件处理程序和 OnPowerModeChange()
事件处理程序并未按广告宣传的那样工作。运行代码分析器(仅在 Visual Studio 2005 中可用)会发出警告,暗示了这一点。此项目中的代码已得到更正,并且运行正常!