2017-04-09 98 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是更合適的事件),我移動了標記並使其可見。這是更快的,但它限制你一個標記或譴責你很多名稱管理。爲該商標命名是該實驗的剩餘物。事實上,由於我可以通過反覆點擊不同位置來移動標記,所以看起來相當不錯。如果你只需要一個標記,我建議你去追求這個想法。

如果您需要幾個標記,我的實驗中剩下的另一個剩餘部分是添加刪除(或隱藏)標記功能的想法,可能是雙擊。

相關問題