向对象添加事件处理程序

时间:2018-07-20 07:22:48

标签: vba excel-vba event-handling userform

有没有一种方法可以将keydown和keyleft事件处理程序添加到用户表单中的图像对象?我只能看到mouseup / down / move,error,dragover,dropandpaste。

我注意到带有一个选项按钮,事件keydown / keyleft是可用的,但不适用于图像。 预先感谢

2 个答案:

答案 0 :(得分:3)

您不能添加该控件类型不存在的事件处理程序(除了通过子类化之外,但图像控件始终不会获得焦点),但是图像控件无法获得焦点,因此仍然无法接收击键。

您谈论KeyDownKeyLeft事件。尽管某些控件具有KeyDownKeyPressKeyUp事件,但是没有任何控件具有KeyLeft事件。您也许是想捕获KeyDown事件,然后检测是按下的键是Down箭头还是Left箭头?

但是,有一些选择:

  1. 为UserForm连接KeyDownKeyPress事件(取决于您需要的密钥信息类型),然后对图像控件进行操作。这可能仅在您满意由表单处理按键的情况下使用,而不管可能选择了哪个其他控件。

  2. 添加一个代理控件,例如一个确实收到TextBoxKeyDown事件的KeyPress,并将其放置在图像控件的后面。这样,当用户切换到文本框时,可以在图像上添加边框以使其看起来像外观,然后使文本框按键事件作用于图像。如果用户单击图像,则可以设置图像的click事件以使文本框成为焦点,然后再次处理文本框的按键事件,以作为图像控件的代理。

答案 1 :(得分:2)

这取决于您要实现的目标(未指定)。

Image显然没有Key-events,因此不能直接使用。 一种可能的解决方案是使用Frame控件,该控件具有Picture属性并具有KeyDown事件,因此,当框架具有焦点时,您可以捕获按下的内容。示例:

Private Sub FrameWithPicture_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    ' Compare KeyCode with predefined vbKey-Constansts, e.g. for key-left:
    If KeyCode = vbKeyLeft Then
        ' left arrow key was pressed, do somthing
    Else
        ' all other keys were pressed, do something else 
    End If
End Sub

或者您可以在此框架上添加Image控件,并在该框架上发生击键事件时,然后在此图像上执行以下操作:FrameWithImage.Controls.Item(0).BackColor = vbRed等。HTH