2017-04-09 77 views
4

我被要求编写在Excel中点击图像的能力,并在其上添加一个形状(这是一个物理治疗师的身体图,形状将指示患者的疼痛部位)。我的代码执行此行通过使用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图像,将鼠标向下的代码添加到工作表,并将点击形状代码添加到模块。

+0

而不是mousedown不能你只使用点击事件?同样的事情,但很可能会解决问题 –

+0

MouseDown是'点击事件' – Absinthe

+0

哈哈,我的字面意思是“_Click()”事件。 –

回答

1

这是非常哈克,但我发现,隐藏和取消隐藏图像解决了这个问题:

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

我希望能更优雅的答案!

+0

有时最好的解决方案不是很优雅。 –

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是更合适的事件),我移动了标记并使其可见。这是更快的,但它限制你一个标记或谴责你很多名称管理。为该商标命名是该实验的剩余物。事实上,由于我可以通过反复点击不同位置来移动标记,所以看起来相当不错。如果你只需要一个标记,我建议你去追求这个想法。

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