Создать подсказку с помощью MouseMove на ActiveX Checkbox - PullRequest
0 голосов
/ 27 июня 2018

Я пытаюсь получить всплывающую подсказку для отображения поверх флажка ActiveX в моей таблице Excel.

Приведенный ниже код отображает и скрывает всплывающую подсказку, но не так, как ожидалось. Если навести курсор мыши на флажок слишком быстро, всплывающая подсказка (метка) останется на листе.

Private Sub chkPrice_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)

With sht
     If .lblTooltip.Visible = False Then
          .lblTooltip.Visible = True
     ElseIf .lblTooltip.Visible = True Then
          .lblTooltip.Visible = False
     End If
End With

Чтобы заставить работать вышеуказанный код, если есть что-то вроде:

If mousehovers for 1 second Then display the tooltip

Есть ли способ проверить, сколько времени мышь остается на элементе управления?

Есть ли другой способ сделать это?

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Используйте Application.OnTime, чтобы скрыть метку через 1 секунду после наведения мыши на флажок.

enter image description here

Модуль открытого кода

Public TootTipVisible As Boolean
Public CheckBoxHasFocus As Boolean

Public Sub ShowTootTip()
    Application.Caption = Now 'TootTipVisible & "," & CheckBoxHasFocus
    If Not TootTipVisible And Not CheckBoxHasFocus Then
        TootTipVisible = True
        Sheet1.sht.Visible = True
        Application.OnTime Now + TimeValue("00:00:01"), "HideTootTip"
    End If
End Sub

Public Sub HideTootTip()
    TootTipVisible = False
    Sheet1.sht.Visible = False
End Sub

Режим кода рабочего листа

Private Sub chkPrice_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    If X > 0 And X < chkPrice.Top - chkPrice.Height Then
        ShowTootTip
        CheckBoxHasFocus = True
    Else
        CheckBoxHasFocus = False
    End If
End Sub
0 голосов
/ 27 июня 2018

Есть кое-что довольно хитрое, что вы могли бы сделать для этого, поэтому ниже вы можете найти отправную точку для вашего конкретного ответа.

Прямой ответ на вопрос

В верхней части вашего модуля вы заявляете, что Microsoft API получает координаты мыши:

Declare PtrSafe Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long

Примечание. Если вы используете 32-разрядную систему, удалите ключевое слово PtrSafe из объявления. Кроме того, поверх модуля вы добавляете этот тип:

Type POINTAPI
   Xcoord As Long
   Ycoord As Long
End Type

Следовательно, внутри вашего макроса chkPrice_MouseMove вы делаете что-то вроде этого:

  • Когда сработает макрос, получите координаты мыши
  • Очень скоро подождите, скажем, полсекунды
  • Следовательно, снова получите координаты мыши. Если они совпадают с предыдущими, это означает, что пользователь удерживает мышь в той же точке, чтобы вы могли вызвать событие.

В коде:

Private Sub chkPrice_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)

Dim llCoordBefore As POINTAPI
Dim llCoordAfter As POINTAPI

GetCursorPos llCoordBefore '<-- get first time
Application.Wait TimeSerial(Hour(Now()), Minute(Now()), Second(Now())+0.5)
GetCursorPos llCoordAfter '<-- get second time

If llCoordBefore.Xcoord = llCoordAfter.Xcoord And llCordBefore.Ycoord = llCoordAfter.Ycoord Then '<-- compare

    With sht
         If .lblTooltip.Visible = False Then
              .lblTooltip.Visible = True
         ElseIf .lblTooltip.Visible = True Then
              .lblTooltip.Visible = False
         End If
    End With
End If

Почему бы мне не использовать это

Я думаю, что ваш лучший шанс - поместить элемент управления ActiveX в место, где пользователь не будет зависать по ошибке.

Ваш код при наведении курсора мыши говорит, что:

1) Если подсказка не видна, то сделайте ее видимой 2) Если подсказка видна, то скрыть ее

Если пользователь быстро передает элемент управления, а всплывающая подсказка скрыта, ожидается, что он появится и не будет скрыт. Пользователь должен вернуть элемент управления, чтобы снова его скрыть.

В любом случае, вот несколько причин, по которым вышеупомянутый метод, о котором вы думали, не является моей рекомендацией:

  • Приложение будет ждать X секунд. Если пользователь зависнет по ошибке, он получит свой Excel, ожидающий X секунд, прежде чем он сможет снова получить контроль. Это может раздражать с точки зрения UX.
  • API получает координаты очень чувствительным образом. Вам нужно будет реализовать приближение (в моем примере, я продолжаю, только если координаты одинаковы до и после наведения; однако в реальной жизни вам нужно будет оставить некоторое поле, потому что мышь может немного перемещаться между первое и второе получают координаты).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...