Vba 向对象添加事件处理程序

Vba 向对象添加事件处理程序,vba,excel,event-handling,userform,Vba,Excel,Event Handling,Userform,有没有办法将keydown和keyleft事件处理程序添加到用户表单中的图像对象?我只能看到鼠标上下移动、出错、拖动、拖放和粘贴 我注意到,通过一个选项按钮,事件keydown/keyleft可用,但不适用于图像。 提前感谢您不能添加该控件类型不存在的事件处理程序(除了通过子类化,但是图像控件无论如何都不会接收焦点),但是图像控件不能接收焦点,因此无论如何也不能接收击键 您将讨论KeyDown和KeyLeft事件。虽然有些控件具有KeyDown、KeyPress和KeyUp事件,但没有任何控件具

有没有办法将keydown和keyleft事件处理程序添加到用户表单中的图像对象?我只能看到鼠标上下移动、出错、拖动、拖放和粘贴

我注意到,通过一个选项按钮,事件keydown/keyleft可用,但不适用于图像。
提前感谢

您不能添加该控件类型不存在的事件处理程序(除了通过子类化,但是图像控件无论如何都不会接收焦点),但是图像控件不能接收焦点,因此无论如何也不能接收击键

您将讨论
KeyDown
KeyLeft
事件。虽然有些控件具有
KeyDown
KeyPress
KeyUp
事件,但没有任何控件具有
KeyLeft
事件。您可能想捕获
KeyDown
事件,然后检测
Down
箭头或
Left
箭头是否是按下的键

但是,有几个选择:

  • 为UserForm连接
    KeyDown
    KeyPress
    事件(取决于所需的键信息类型),然后对图像控件执行操作。这可能只有在您愿意表单处理按键的情况下才有用,而不管选择了哪个控件

  • 添加一个代理控件,例如一个确实接收
    KeyDown
    KeyPress
    事件的
    TextBox
    ,并将其放置在图像控件后面。这样,当用户选项卡指向文本框时,您可以向图像添加边框,使其看起来像已选中,然后让文本框键事件对图像起作用。如果用户单击图像,而不是在控件之间切换,则可以设置图像的单击事件以使文本框具有焦点,然后再次将文本框的键事件作为图像控件的代理处理

  • 这取决于你想要实现什么,而你没有具体说明

    图像
    显然没有
    关键事件
    ,因此无法直接使用。 一种可能的解决方案是使用
    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

    如果无法键入图像控件,不。你想用它做什么?你说的这个
    KeyLeft
    事件是什么?啊,好的。谢谢@Rory,你知道吗?如果没有子类化,你不能添加不存在的事件,但是图像控件不能接收焦点。有关代理方法,请参见我的答案。@ThunderFrame我很确定,在选择所需事件时,它位于下拉列表中。我可能错了。这似乎是一个很好的解决办法。我稍后会试试,让你知道我的进展如何。ThanksI使用了相框并在相框中插入了一张图片。现在,当帧移动时,图片也会移动。我不能使用箭头键,所以我用WSAD来代替,并进行了处理。ThanksHow如果框架内没有任何可选择的控件,框架是否接收焦点?@ThunderFrame框架即使没有控件也可以接收焦点。Tabstop必须设置为true。@ThunderFrame或不设置:)。如果您是对的,那么有必要将图像控件添加到帧中。@ThunderFrame好的,我已经检查过,当图像位于帧内时,帧会在选项卡上获得焦点,并接收向下键事件。很高兴知道。很好的解决方案。我想你也可以删除框架边框?