Mouse NOT Over

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Stas
Новичок
Новичок
 
Сообщения: 25
Зарегистрирован: 20.05.2003 (Вт) 20:10

Mouse NOT Over

Сообщение Stas » 20.11.2003 (Чт) 20:21

Как отловить момент когда пользователь убирает курсор например с пикчабокса?

Зарание спасибо всем кто ответит.
I'll give to you all what i know

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 21.11.2003 (Пт) 9:04

Искать по слову trackmouseevents
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Stas
Новичок
Новичок
 
Сообщения: 25
Зарегистрирован: 20.05.2003 (Вт) 20:10

Сообщение Stas » 21.11.2003 (Пт) 20:11

А как это? :oops:
I'll give to you all what i know

Tень
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 05.11.2003 (Ср) 3:03

Сообщение Tень » 21.11.2003 (Пт) 21:37

Тоже бил голову над этим вопросом, но ничего лучшего чем нижеописанное придумать не сумел. Может и не самый оптимальный вариант, но работает.
Итак, для примера сделаем так, что бы при наведении на объект он как-то реагировал, а если курсор с объекта сползает, то он принемал бы исходное положение.
Создай форму, на ней элемент Timer1 и элемент Label1
Код формы:

Код: Выделить всё
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Type POINTAPI
Xms As Long
Yms As Long
End Type
Private XmsA As Long
Private YmsA As Long


Private Sub Form_Load()
        Timer1.Enabled = False
        Timer1.Interval = 100
End Sub

Private Sub Label1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
        Label1.ForeColor = vbRed
        Dim cPos As POINTAPI
        GetCursorPos cPos
        XmsA = cPos.Xms
        YmsA = cPos.Yms
        Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
        Dim cPos As POINTAPI
        GetCursorPos cPos
        If cPos.Xms <> XmsA Or cPos.Yms <> YmsA Then
            'Это и есть тот самый момент, когда курсор сползает с объекта
            Timer1.Enabled = False
            Label1.ForeColor = vbBlack
            Exit Sub
        End If
End Sub


Ну вот, удачи.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 22.11.2003 (Сб) 10:12

Если контрол имеет hWnd (например PictureBox), то он может отслеживать мышку, API TrackMouseEvent.
Есть еще API SetCapture, в некоторых случаях это удобнее.
Lasciate ogni speranza, voi ch'entrate.

Tень
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 05.11.2003 (Ср) 3:03

Сообщение Tень » 23.11.2003 (Вс) 21:34

А нельзя ли поподробнее?

SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

Сообщение SSecurity » 24.11.2003 (Пн) 0:50

Самый простой способ - обрабатывать MouseMove например формы, если пикчербокс на форме, т.е. когда у тебя срабатывает формовй МаузМув, значит на Пикчербоксе мышки нет ... но не работает если на пикчербоксе зажать кнопку мыши и перенести её вне область формы ..

Тогда вариант как мне кажется описанный выше ...
через GetCursorPos получаем X и Y курсора .... проверяем 4 условия:
если выполняется хотябы одно из условий ... то какраз МаузОвер
(Form.left+PicherBox.left)<X
X>(Form.left+PicherBox.left+PicherBox.width)
(Form.top+PicherBox.top)<Y
Y>(Form.top+PicherBox.top+PicherBox.height)
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)

Tень
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 05.11.2003 (Ср) 3:03

Сообщение Tень » 24.11.2003 (Пн) 14:23

Ещё не сработает если резко убрать курсор за пределы формы.

SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

Сообщение SSecurity » 25.11.2003 (Вт) 0:38

Второй случай срабатывает я проверял ... тока по таймеру узнавай позицию курсора :)
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9

    TopList