鼠标按下事件计时

时间:2017-04-09 10:58:32

标签: vba excel-vba activex excel

我被要求编码能够点击Excel中的图像并在其上面添加一个形状(它是物理治疗师的身体图,形状将指示患者的位置& #39;痛苦)。我的代码通过使用ActiveX图像控件的鼠标按下事件来执行此操作:

Private Sub bodypic_MouseDown(ByVal Button As Integer, _
ByVal Shift As Integer, ByVal x As Single, ByVal y As Single)

ClickShape x, y

End Sub
Sub ClickShape(x As Single, y As Single)

Dim shp As Shape
Dim cursor As Point

Set shp = ActiveSheet.Shapes.AddShape(msoShapeMathMultiply, x + ActiveSheet.Shapes("bodypic").Left, _
y + ActiveSheet.Shapes("bodypic").Top, 26, 26)

With shp.Fill

    .ForeColor.RGB = RGB(255, 0, 0)
    .BackColor.RGB = RGB(255, 0, 0)

End With

shp.Line.Visible = False

End Sub

问题是当鼠标光标在图表上方时,形状不可见。只有当鼠标移出图表时才会出现形状。

我已尝试various methods刷新屏幕,选择一个单元格,甚至通过SetCursor method in Lib user32更改光标位置。除了用户实际移动鼠标外,似乎没什么用。

重新创建问题:插入一个大约200 x 500像素的ActiveX图像控件,向控件添加一个jpeg图像,将鼠标按下代码添加到工作表中,然后将单击形状代码添加到模块中。

2 个答案:

答案 0 :(得分:1)

这非常hacky但我发现隐藏和取消隐藏图像可以解决问题:

ActiveSheet.Shapes("bodypic").Visible = False
ActiveSheet.Shapes("bodypic").Visible = True
End Sub

我会欢迎更优雅的答案!

答案 1 :(得分:0)

我使用此代码取得了有限的成功: -

Option Explicit

Private Type POINTAPI
    x As Long
    y As Long
End Type

Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Declare Function SetCursorPos Lib "user32" (ByVal x As Integer, ByVal y As Integer) As Integer

Sub ClickShape(ByVal x As Single, ByVal y As Single)

    Dim Shp As Shape
    Dim Pos As POINTAPI

    GetCursorPos Pos
    SetCursorPos Pos.x + 300, Pos.y
    With ActiveSheet
        With .Shapes("bodypic")
            x = x + .Left
            y = y + .Top
        End With
        Set Shp = .Shapes.AddShape(msoShapeMathMultiply, x, y, 26, 26)
    End With

    With Shp
        .Name = "Mark1"
        .Line.Visible = False
        With .Fill
            .ForeColor.RGB = RGB(255, 0, 0)
            .BackColor.RGB = RGB(255, 0, 0)
        End With
    End With
End Sub

本质上,它的作用是将光标移出图像。然后,标记出现需要大约一秒钟。延迟时间越长,标记越多。请注意,我的300像素移动是随机的。你必须找出移动它的位置,只要它在图像之外。我试着立即将它移回去,但是那不起作用,并且由于延迟的变化,返回的时机会很棘手。

我尝试了另一个概念,我首先创建了标记并使其不可见。然后,在MouseUp(MouseUp是更合适的事件)上,我移动了标记并使其可见。这更快,但它限制你到一个标记或谴责你很多名称管理。给该商标命名是该实验的遗留物。实际上,它看起来很不错,因为我可以通过反复点击不同的位置来移动标记。如果你只需要一个标记,我建议你去追求这个想法。

如果您需要多个标记,我的实验中的另一个剩余部分是添加删除(或隐藏)标记的功能,可能是双击。