Visual Basic 2005 - 如何于控件中捕捉按键

 

 

如何于Windows Form控件中捕捉按键向来是许多程序设计师所关心的课题,基本上,标准的KeyUpKeyDownKeyPress事件就足以去捕捉并处理按键。然而问题在于,并非所有的控件会在所有的情况下替所有的按键动作产生这些事件。

如果您希望不管控件的状况为何,都能够顺利捕捉Windows Form控件中的按键,必须根据该控件的类别衍生出一个新的类别并覆写ProcessCmdKey方法,并于此覆写方法中撰写程序代码来捕捉并处理您所需的按键。系统会传第两个参数给ProcessCmdKey方法:msgkeyDatamsg参数内含所要处理的窗口讯息(例如:WM_KEYDOWN),此窗口讯息是以传址方式传递的。keyData参数则会内含被按下之按键的按键码,也就是其中一个Keys值(注:keyData参数的类型是Keys列举类型)。如果CTRLALT键也被按下,keyData参数还会内含辅助按键(Modifier Key)信息。

您并非一定非得使用msg参数不可,也就是说,您可以忽略它。不过利用msg参数来检测窗口讯息倒是一项不错的选择。在稍后的程序范例中,我们会去检测窗口讯息是否为WM_KEYDOWN以便确认这是一个按键事件,此外,我们也会去检测窗口讯息是否为WM_SYSKEYDOWN以便确认按键组合是否包含辅助按键。

 

图表 1

 

由于DataGridView控件的状况最为复杂,因而在此我们就要示范如何于DataGridView控件中捕捉按键,请切记,您可以将同样的手法应用在其它的控件。图表1所示者是我们所撰写之程序范例的执行画面,从窗体的标题列变化可以看出,只要DataGridView控件取得焦点,而且不论它是否显示数据,都能够捕捉用户于DataGridView控件中的按键。显而易见地,本程序范例的关键就在于必须根据DataGridView控件衍生出一个新的类别并覆写其ProcessCmdKey方法,兹将衍生类别MyDataGridView的程序代码列示如下:

Public Class MyDataGridView
  Inherits System.Windows.Forms.DataGridView
 
 

  Protected Overrides Function ProcessCmdKey(ByRef msg As Message, _
                         ByVal keyData As Keys) As Boolean
    Const WM_KEYDOWN As Integer = &H100
    Const WM_SYSKEYDOWN As Integer = &H104

    If ((msg.Msg = WM_KEYDOWN) Or _
       (msg.Msg = WM_SYSKEYDOWN)) Then
        Select Case (keyData)
            Case Keys.Down
                Me.Parent.Text = "向下键已经被捕捉"
            Case Keys.Up
                Me.Parent.Text = "向上键已经被捕捉"
            Case Keys.Left
                Me.Parent.Text = "向左键已经被捕捉"
            Case Keys.Right
                Me.Parent.Text = "向右键已经被捕捉"
            Case Keys.Home
                Me.Parent.Text = "Home 键已经被捕捉"
            Case Keys.End
                Me.Parent.Text = "End 键已经被捕捉"
            Case Keys.PageUp
                Me.Parent.Text = "PageUp 键已经被捕捉"
            Case Keys.PageDown
                Me.Parent.Text = "PageDown 键已经被捕捉"
            Case Keys.Tab
                Me.Parent.Text = "Tab 键已经被捕捉"
            Case (Keys.Shift Or Keys.Tab)
                Me.Parent.Text = "<Shift> + Tab 键已经被捕捉"
            Case (Keys.Control Or Keys.Home)
                Me.Parent.Text = "<CTRL> + Home 键已经被捕捉"
            Case (Keys.Control Or Keys.End)
                Me.Parent.Text = "<CTRL> + End 键已经被捕捉"
            Case (Keys.Control Or Keys.M)
                Me.Parent.Text = "<CTRL> + M 已经被捕捉"
            Case (Keys.Alt Or Keys.Z)
                Me.Parent.Text = "<ALT> + Z 已经被捕捉"
        End Select
    End If

    Return MyBase.ProcessCmdKey(msg, keyData)
  End Function
End Class

本文节录自Visual Basic 2005程序开发与界面设计秘诀一书,特此声明之。Visual C# 2005的用户请参阅Visual C# 2005程序开发与界面设计秘诀一书。

 

posted on 2007-01-09 09:42  章立民研究室  阅读(1606)  评论(0编辑  收藏  举报

导航