2013-12-16 98 views
0

我正在開發Access 2007應用程序,並對MouseMove在標籤和表單上的性能有所擔憂。 到目前爲止,在我的解決方案中,我在雙核I5 3.0ghz上獲得了較高的CPU使用率。 當我移動鼠標cpu使用率跳轉到一個核心的30-32%左右(使用超線程) 對於像MouseMove這樣簡單的任務,我想有一些效率更高:)MouseMove高CPU使用率 - 尋找更好更優雅的解決方案

下面的代碼被縮短了;我有8個標籤與MouseMove事件處理程序。

下面是它是如何實現的:

Private moveOverOn As Boolean 

Private Property Get isMoveOverOn() As Boolean 
isMoveOverOn = moveOverOn 
End Property 

Private Property Let setMoveOverOn(value As Boolean) 
moveOverOn = value 
End Property 

'label MouseMove detection 
Private Sub lbl_projects_completed_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) 
If Shift = 0 And isMoveOverOn = False Then 
    Me.lbl_projects_completed.FontBold = True 
    setMoveOverOn = True 
End If 
End Sub 

'main form MouseMove detection 
Private Sub Detail_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) 
If isMoveOverOn Then 
    resetBold 'call a sub that reset all labels .FontBold 
    setMoveOverOn = False 
End If 

End Sub 

我不知道這是否是可能的,但我認爲,減少鼠標移動 刷新時的速度將有助於完成這個任務,不幸的是我沒有能夠找到關於它的信息。

我接受了建議,感謝您的時間! :)

+0

什麼是你想用這個來完成? – engineersmnky

+0

簡單的鼠標將使用戶知道他可以與對象進行交互的粗體字體。用戶將點擊,然後獲得另一種形式。 – Mindkrypted

+0

我假設這些標籤沒有附加,如果是這樣的話,爲什麼不明確他們可以通過使用超鏈接來交互呢? – engineersmnky

回答

0

最後我找到了我一直在尋找,以減輕CPU的鼠標移動應變:

'put this in head of the form code 
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 

'form MouseMove with sleep timer 
Private Sub Detail_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) 

'placeholder call sub to change the label FontBold Suggested by engineersmnky 

Sleep (25) 
End Sub 
+0

我改變了功能,使其更加準確,但請通過減慢事件發生來減緩事件的發生,使代碼不太準確,因爲它可能會錯過進入控件之前發生的座標 – engineersmnky

1

accdb格式具有懸停並按下按鈕的顏色屬性,所以如果您不介意轉換爲該格式,並且標籤可能是按鈕應該比您所做的更好。

+0

好主意,我會試着讓你知道它是怎麼回事。謝謝! – Mindkrypted

+0

邁克,我玩過並在CommandButton對象上做了一些Google搜索。不幸的是,與我所想到的解決方案相反,我仍然必須使用MouseMove屬性來設置FontBold = True。這使我回到了我最初的問題。 – Mindkrypted

0

好吧,這樣做可以用更少的費用做你想要的,但只要知道鼠標移動不會更新X,Y時就超過了控件,因此它在事件中存在間歇性問題。

這是使用鼠標移動到細節部分的mouseHover事件的自定義實現,因此它只被稱爲1次。然後,它通過控件循環(可以將此循環更改爲僅查看您想要的控件),並查看光標是否位於任何一側的控件的5緹內

它還接受模糊參數,因爲缺少通過控件進行更新。它的默認值是50緹。也知道控件應縮小到可能的最小尺寸以適合數據,因爲此功能使用控件的高度和寬度來確定您是否在控件內。

Private Sub Detail_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) 
    mouseHover X, Y 
End Sub 
Private Sub mouseHover(X As Single, Y As Single) 
    Dim ctrl As Control 
    'You may want to make an array of controls here to shorten the loop 
    'i.e. 
    ' Dim ctrl_array() As Variant 
    ' ctrl_array(0) = Me.lbl_projects_completed 
    ' ctrl_array(1) = Me.some_other_label 
    ' For Each ctrl in ctrl_array 
    For Each ctrl In Me.Controls 
     If ctrl.ControlType = acLabel Then 
      If FuzzyInsideControl(ctrl.top, ctrl.left, ctrl.width, ctrl.height, X, Y) Then 
       ctrl.FontBold = True 
       ctrl.ForeColor = RGB(255, 0, 0) 
       Exit For 
      Else 
       ctrl.ForeColor = RGB(0, 0, 0) 
       ctrl.FontBold = False 
      End If 
     End If 
    Next ctrl 
End Sub 
Private Function FuzzyInsideControl(top As Long, left As Long, width As Long, height As Long, X As Single, Y As Single, Optional fuzz As Integer = 50) As Boolean 
    Dim coord_left As Long 
    Dim coord_right As Long 
    Dim coord_top As Long 
    Dim coord_bottom As Long 
    Dim inside_x As Boolean 
    Dim inside_y As Boolean 
    coord_top = top - fuzz 
    coord_bottom = top + height + fuzz 
    coord_left = left - fuzz 
    coord_right = left + width + fuzz 
    inside_y = Y > coord_top And Y < coord_bottom 
    inside_x = X > coord_left And X < coord_right 
    FuzzyInsideControl = inside_x And inside_y 
End Function 

雖然我仍然認爲這是不必要的,這是一個有趣的問題和樂趣的工作,但也有一定的侷限性所致的mouseMove如何工作

編輯

改變了FuzzyInsideControl功能更簡潔的清潔版本應該更加準確,但是當我回到有權訪問的計算機時,我將不得不明天進行測試。

+0

感謝您的時間和努力engineermnky,我會毫不猶豫地試一試,讓你知道它是如何:) – Mindkrypted

+0

沒問題,就像我說這很有趣。讓我知道它是如何工作的,因爲我認爲可以通過使用Fuzzy – engineersmnky

+0

中的'top_left,top_right,bottom_right,bottom_left'設置來創建一個圍繞控件的仿真盒,我的工作非常好,代碼很多比我更漂亮。你的建議將是一個很好的升級。再次感謝! – Mindkrypted

相關問題