我被要求编码能够点击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图像,将鼠标按下代码添加到工作表中,然后将单击形状代码添加到模块中。
答案 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是更合适的事件)上,我移动了标记并使其可见。这更快,但它限制你到一个标记或谴责你很多名称管理。给该商标命名是该实验的遗留物。实际上,它看起来很不错,因为我可以通过反复点击不同的位置来移动标记。如果你只需要一个标记,我建议你去追求这个想法。
如果您需要多个标记,我的实验中的另一个剩余部分是添加删除(或隐藏)标记的功能,可能是双击。