2012-04-15 5 views
1

Это является продолжением на вопрос одного ответил здесь: How to detect a mouse_down on a Userform Frame while the mouse is still downкак обнаружить Frame_Enter события из модуля класса

Использование кода из ответа на этот вопрос, я могу успешно обнаружить 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 и ожидаете, что другой кадр выведет событие, чем в прошлый раз. Мне интересно, если вместо того, чтобы использовать дополнительный текстовый блок, чтобы сигнализировать об изменении, не могли бы вы использовать статическую переменную для отслеживания currentFrame/prevFrame?

+0

Вот что мой код делает. :) Поэтому вместо использования 'Frame1_MouseMove' и' UserForm_MouseMove', вы можете использовать только фреймы '_MouseMove' для хранения значений в переменных? –

ответ

0

Я мог ошибаться, но нет прямого пути, вы можете захватить _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 
+0

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

+0

Если я не ошибаюсь, событие Frame_Enter запускается с момента загрузки пользовательской формы. Он не имеет ничего общего с входом мыши в рамку? если вы можете объяснить, что именно вы пытаетесь сделать, может быть, я могу что-то предложить? –

0

Ключевые слова: Simulate

Используя сочетание рамы Mouse_Move и формы Mouse_Move

Демонстрация использованием текстовых блоков, называемых txtWhereAmI (инициализирует значение proiperty к Form)
txtEntrytxtExit (Инициировать стоимость услуг до 0)

В модуле класса объявляют кадр 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 

В модуле формы объявить Форма 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 

и Text Box Изменить событие

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 обработчика событий

+0

Крис, я не думаю, что это сработало бы для меня, потому что все фреймы, с которыми я хочу работать, касаются друг друга и на самом деле имеют перекрытие на один пиксель, поэтому мышь не переходит из кадра в форму в рамку, но скорее он переходит непосредственно от кадра к кадру. Я опишу, что я пытаюсь сделать, редактируя мой оригинальный пост. Эти поля комментариев довольно ужасны. – Roy

+0

Событие так, идея все еще работает, событие txtWhereAmI_Change все еще срабатывает, при этом значение меняется от одного имени кадра к другому. Подойдет к тому, что вы хотите делать со событиями входа и выхода, и для написания кода события изменения. –

 Смежные вопросы

  • Нет связанных вопросов^_^