как обнаружить события Frame_Enter из модуля класса

Это дополнительный вопрос к ответу здесь: Как обнаружить mouse_down в фрейме пользовательской формы, пока мышь все еще нажата

Используя код из ответа на этот вопрос, я могу успешно обнаружить MouseDown, MouseUp и MouseMove в любом фрейме формы. Однако, по-видимому, в cls нет доступных событий Frame_Enter или Frame_Exit. Есть ли способ имитировать событие Frame_Enter в модуле класса?

Изменить: вот что я пытаюсь сделать. У меня есть 8 кадров, загруженных 8 изображениями, которые при объединении в более крупный кадр составляют более крупную картинку. Представьте себе головоломку из 8 прямоугольных частей. Обычно все 8 кадров содержат «затемненную» (наложение нейтрального фильтра) версию своего изображения, но когда мышь входит в любой из них, это вызывает загрузку «не затемненной» версии изображения во вновь введенном кадре, а затемненная версия картинки в только что вышедшем кадре. Таким образом, если мышь находится над любым из этих кадров, она всегда перемещается по яркому изображению, окруженному затемненными изображениями.

Когда мышь перемещается по не затемненной рамке, она запускает неограниченное количество триггеров «горячих точек», которые вызывают всплывающее текстовое поле с дополнительной информацией о том, над чем в данный момент находится мышь. Когда он покидает этот кадр и перемещается по другому, процесс повторяется.

Все работает, за исключением определения, когда мышь пересекает границу кадра и переходит в следующий кадр. Это должно быть обнаружено до обработки каких-либо событий MouseMove.

Вот метод, который выглядит многообещающе, если ничего другого не предлагается: http://www.mrexcel.com/forum/showpost.php?p=2567141&postcount=28

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

Итак, Крис, вернемся к твоему. Вы наблюдаете за событиями Frame_MouseMove и ждете, пока другой Frame выдаст событие, чем в прошлый раз. Мне интересно, не могли бы вы вместо использования вспомогательного текстового поля для сигнализации об изменении использовать статическую переменную для отслеживания текущего кадра/предыдущего кадра?


person Roy    schedule 15.04.2012    source источник
comment
Это то, что делает мой код. :) То есть вместо использования Frame1_MouseMove и UserForm_MouseMove можно использовать только _MouseMove фреймов для хранения значений в переменных?   -  person Siddharth Rout    schedule 16.04.2012


Ответы (2)


Я могу ошибаться, но нет прямого способа перехватить события _Enter и _Exit кадра. Однако есть альтернатива

Option Explicit

Dim temp As String

Private Sub UserForm_Initialize()
    temp = "OnForm"
End Sub

Private Sub Frame1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
    If temp = "OnForm" Then
        Debug.Print "The mouse just entered the frame"
        temp = "OnFrame"
    End If
End Sub

Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
    If temp = "OnFrame" Then
        Debug.Print "The mouse just exited the frame"
        temp = "OnForm"
    End If
End Sub
person Siddharth Rout    schedule 15.04.2012
comment
Уже есть событие Frame_Enter, которое отлично работает, если вы знаете, на какой кадр смотреть. Но в модуле класса нет доступного события Frame_Enter при использовании метода в ответе, на который я ссылался. Ваш метод не будет работать для моих целей, потому что мне нужно что-то сделать до того, как будет выдано событие MouseMove, и это то, что Frame_Enter сделал бы для меня, если бы такая вещь была. - person Roy; 16.04.2012
comment
Если я не ошибаюсь, то событие Frame_Enter срабатывает в момент загрузки пользовательской формы. Это никак не связано с попаданием мыши в кадр? если вы можете объяснить, что именно вы пытаетесь сделать, может быть, я могу что-то предложить? - person Siddharth Rout; 16.04.2012

Ключевое слово: Имитация

Использование комбинации рамы Mouse_Move и формы Mouse_Move

Демонстрация с использованием текстовых полей с именем txtWhereAmI (инициализировать свойство Value значением Form)
txtEntry txtExit (инициализировать свойства Value значением 0)

В модуле класса объявите Frame MouseMove

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

    UserForm1.txtWhereAmI.Value = Frme.Caption
End Sub

В модуле Form объявите Form Mouse Move

Private Sub UserForm_MouseMove( _
  ByVal Button As Integer, _
  ByVal Shift As Integer, _
  ByVal X As Single, _
  ByVal Y As Single)
    txtWhereAmI.Value = "Form"
End Sub

и событие изменения текстового поля

Private Sub txtWhereAmI_Change()
    If txtWhereAmI.Value = "Form" Then
        txtExit = txtExit + 1
    Else
        txtEntry = txtEntry + 1
    End If
End Sub

Результат: txtWhereAmI определяет, над каким кадром находится мышь, txtEntry и txtExit подсчитывают события входа и выхода.

Затем событие Change для txtWhereAmI формирует основу обработчиков событий Entry и Exit.

person chris neilsen    schedule 16.04.2012
comment
Крис, я не думаю, что это сработает для меня, потому что все кадры, с которыми я хочу работать, соприкасаются и на самом деле имеют перекрытие в один пиксель, поэтому мышь не переходит от кадра к форме к кадру, а скорее он идет прямо от кадра к кадру. Я опишу, что я пытаюсь сделать, отредактировав свой исходный пост. Эти поля комментариев довольно ужасны. - person Roy; 16.04.2012
comment
Событие Итак, идея все еще работает, событие txtWhereAmI_Change все еще срабатывает со значением, изменяющимся от одного имени кадра к другому. Сводится к тому, что вы хотите делать с событиями входа и выхода, и к написанию соответствующего кода события изменения. - person chris neilsen; 16.04.2012