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

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.57/5 (13投票s)

2011 年 10 月 12 日

CPOL

3分钟阅读

viewsIcon

90221

downloadIcon

12621

本文将使用数字键盘作为示例,说明如何创建触摸屏界面。

引言

本文旨在演示如何为 WinForms 创建触摸屏界面,以数字键盘为例。

本文并非旨在深入讨论 UI 原则或良好的编程实践。它仅仅是为了为希望开发触摸屏应用程序,并想知道如何入门的人提供一个起点。

背景

为什么重复造轮子? 在过去的几年里,我需要为仓库环境创建各种触摸屏界面。 最近,有人(本地)问我如何开始编写触摸屏程序。本文旨在帮助某人入门。

为什么使用数字键盘? 仅仅因为这种界面在我们设计的环境中被使用最频繁。

使用代码

代码分为两部分,tsNumericKeypad,即实际的界面,以及 tsNumericKeypadTest

  • 从 NumericKeypad 开始,它是一个基本的键盘,处理点击事件。 其中有一些技巧。 在为触摸屏编程时,我发现处理 MouseUp 事件是最好的。 原因是人们经常会错过他们想要点击的按钮。 也许他们像我一样手指粗,或者他们只是个冒失鬼。 无论哪种方式,通过处理 MouseUp 事件而不是 MouseDownMouseClick 事件,你都给用户一个移动手指的机会。 这在使用附加触摸屏时尤其重要,因为这会导致视差。
  • 处理单个按钮没什么特别的。 对于数字按钮,键盘只是将数字连接到保存数据的变量上(我们为示例创造性地命名为 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 - 此文档的第一个副本。
© . All rights reserved.