创建触摸屏界面,例如数字键盘






4.57/5 (13投票s)
本文将使用数字键盘作为示例,说明如何创建触摸屏界面。
引言
本文旨在演示如何为 WinForms 创建触摸屏界面,以数字键盘为例。
本文并非旨在深入讨论 UI 原则或良好的编程实践。它仅仅是为了为希望开发触摸屏应用程序,并想知道如何入门的人提供一个起点。
背景
为什么重复造轮子? 在过去的几年里,我需要为仓库环境创建各种触摸屏界面。 最近,有人(本地)问我如何开始编写触摸屏程序。本文旨在帮助某人入门。
为什么使用数字键盘? 仅仅因为这种界面在我们设计的环境中被使用最频繁。
使用代码
代码分为两部分,tsNumericKeypad
,即实际的界面,以及 tsNumericKeypadTest
。
- 从 NumericKeypad 开始,它是一个基本的键盘,处理点击事件。 其中有一些技巧。 在为触摸屏编程时,我发现处理
MouseUp
事件是最好的。 原因是人们经常会错过他们想要点击的按钮。 也许他们像我一样手指粗,或者他们只是个冒失鬼。 无论哪种方式,通过处理MouseUp
事件而不是MouseDown
或MouseClick
事件,你都给用户一个移动手指的机会。 这在使用附加触摸屏时尤其重要,因为这会导致视差。 - 处理单个按钮没什么特别的。 对于数字按钮,键盘只是将数字连接到保存数据的变量上(我们为示例创造性地命名为
data
)。
Public Sub NumericMouseUp(ByVal sender As Object, ByVal e As EventArgs) _
Handles Button0.MouseUp, Button1.MouseUp, Button2.MouseUp, _
Button3.MouseUp, Button4.MouseUp, Button5.MouseUp, _
Button6.MouseUp, Button7.MouseUp, Button8.MouseUp, Button9.MouseUp
If sender Is Button0 And vData = "0" Then
Exit Sub
End If
Data += sender.text
End Sub
还有清除和退格按钮,它们会适当地修改数据。
Private Sub buClear_MouseUp(ByVal sender As Object, _
ByVal e As System.Windows.Forms.MouseEventArgs) _
Handles buClear.MouseUp
Data = ""
End Sub
Private Sub buBksp_MouseUp(ByVal sender As Object, _
ByVal e As System.Windows.Forms.MouseEventArgs) _
Handles buBksp.MouseUp
If Data.Length = 0 Then
Data = ""
Else
Data = Data.Substring(0, Data.Length - 1)
End If
End Sub
最后,有一个“确定”和一个“取消”按钮。 这些按钮将对话框结果返回到启动键盘的对象。 这样,对象就知道是否应该接受数据。
Private Sub buAccept_MouseUp(ByVal sender As Object, _
ByVal e As System.Windows.Forms.MouseEventArgs) _
Handles buAccept.MouseUp
DialogResult = DialogResult.OK
Close()
End Sub
Private Sub buCancel_MouseUp(ByVal sender As Object, _
ByVal e As System.Windows.Forms.MouseEventArgs) _
Handles buCancel.MouseUp
DialogResult = DialogResult.Cancel
Close()
End Sub
我在键盘中留出了空白,具体原因是我几乎总是需要添加额外的控件。 在这种情况下,我添加了一个负数按钮和一个小数按钮,可以根据需要打开和关闭。
Private vAllowNegatives As Boolean = False
Public Property AllowNegatives As Boolean
Get
Return vAllowNegatives
End Get
Set(ByVal value As Boolean)
vAllowNegatives = value
buNegative.Visible = value
If Data.Substring(0, 1) = "-" And value = False Then
Data = Data.Substring(1, Data.Length - 1)
End If
End Set
End Property
Private vAllowDecimals As Boolean = False
Public Property AllowDecimals As Boolean
Get
Return vAllowDecimals
End Get
Set(ByVal value As Boolean)
vAllowDecimals = value
buDecimal.Visible = value
If Data.Contains(".") And value = False Then
Data = Math.Round(Val(Data), 0).ToString
End If
End Set
End Property
对于应该启动键盘的对象,你只需要以下代码。 它启动键盘,然后在键盘返回时处理数据,但仅当对话框结果为“确定”时。
Dim f As New tsNumericKeypad.tsNumericKeypad
Dim dr As DialogResult = f.ShowDialog
If dr = DialogResult.OK Then
Data = f.Data
End If
最后是如何处理对象接收到的数据。 我更喜欢始终启动一个事件。 通过这样做,它允许我在程序中的其他地方添加处理程序来处理更改的数据,而无需更改已编写的代码。
Private vData As String = ""
Public Property Data As String
Get
Return vData
End Get
Set(ByVal value As String)
If value = "" Then
value = "0"
End If
vData = value
RaiseEvent DataChanged(Me, New EventArgs)
End Set
End Property
Public Event DataChanged(ByVal sender As Object, ByVal e As EventArgs)
关注点
请注意,本文最重要的收获是像处理鼠标事件一样处理触摸屏(最好是 MouseUp 事件),并使用足够大的按钮供手指点击。 另外,当数据发生变化时,触发事件也是一个好主意,因为这使得以后添加功能更容易。
历史
- 2011/12/10 - 此文档的第一个副本。