向对象添加事件处理程序
Adding event handlers to object
有没有办法将 keydown 和 keyleft 事件处理程序添加到用户表单中的图像对象?我只能看到 mouseup/down/move,error,dragover,dropandpaste.
我注意到有一个选项按钮,事件 keydown/keyleft 可用但不适用于图像。
提前致谢
您不能添加该控件类型不存在的事件处理程序(除了通过子类化,但无论如何图像控件都不会获得焦点),但图像控件无法获得焦点,因此无论如何都无法接收击键。
你说的是 KeyDown
和 KeyLeft
事件。虽然某些控件具有 KeyDown
、KeyPress
和 KeyUp
事件,但没有任何控件具有 KeyLeft
事件。您的意思是捕获 KeyDown
事件,然后检测按下的键是 Down
箭头还是 Left
箭头?
但是,有几个选项:
为用户窗体设置 KeyDown
或 KeyPress
事件(取决于您需要哪种类型的关键信息),然后对图像控件进行操作。这可能仅在您愿意由表单处理按键时才有用,而不管可能选择了哪个其他控件。
添加一个代理控件,比如说一个确实接收KeyDown
和KeyPress
事件的TextBox
,并将它放在后面[=40] =] 图像控件。这样,当用户切换到文本框时,您可以为图像添加边框,使其 看起来 就像被选中一样,然后让文本框键事件作用于图像。如果用户单击图像,而不是在控件之间切换,您可以设置图像的单击事件为文本框提供焦点,并再次处理文本框的键事件作为图像控件的代理。
这取决于你想达到什么你没有指定。
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
有没有办法将 keydown 和 keyleft 事件处理程序添加到用户表单中的图像对象?我只能看到 mouseup/down/move,error,dragover,dropandpaste.
我注意到有一个选项按钮,事件 keydown/keyleft 可用但不适用于图像。 提前致谢
您不能添加该控件类型不存在的事件处理程序(除了通过子类化,但无论如何图像控件都不会获得焦点),但图像控件无法获得焦点,因此无论如何都无法接收击键。
你说的是 KeyDown
和 KeyLeft
事件。虽然某些控件具有 KeyDown
、KeyPress
和 KeyUp
事件,但没有任何控件具有 KeyLeft
事件。您的意思是捕获 KeyDown
事件,然后检测按下的键是 Down
箭头还是 Left
箭头?
但是,有几个选项:
为用户窗体设置
KeyDown
或KeyPress
事件(取决于您需要哪种类型的关键信息),然后对图像控件进行操作。这可能仅在您愿意由表单处理按键时才有用,而不管可能选择了哪个其他控件。添加一个代理控件,比如说一个确实接收
KeyDown
和KeyPress
事件的TextBox
,并将它放在后面[=40] =] 图像控件。这样,当用户切换到文本框时,您可以为图像添加边框,使其 看起来 就像被选中一样,然后让文本框键事件作用于图像。如果用户单击图像,而不是在控件之间切换,您可以设置图像的单击事件为文本框提供焦点,并再次处理文本框的键事件作为图像控件的代理。
这取决于你想达到什么你没有指定。
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