Как отловить событие ухода курсора с объекта?

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

Как отловить событие ухода курсора с объекта?

Сообщение Twinger » 25.06.2003 (Ср) 0:09

Делаю прогу в которой есть к примеру PictureBox, при наведении на него возникает событие MouseMove, в этом событии я делаю следующее
Picture1.Picture=LoadPicture(App.Path & "/img/del.gif")
Мой Picture загружает нужную мне картинку. Но после того как мышка покидает территорию PictureBox(без нажатий, простое наведение и уход с объекта), какое событие возникает?
Мне нужно вернуться к прежней картинке, не могу же я везде писать событие MouseMove для Form1 или другого объекта на который наезжает курсор?
Как это сделать, или что за событие возникает, есть ли оно в стандартном наборе VB, либо мне нужно писать какую-нибудь процедурку?

Cyrax
Cyberninja
Cyberninja
Аватара пользователя
 
Сообщения: 891
Зарегистрирован: 25.04.2002 (Чт) 21:20
Откуда: Magnitogorsk, Russia

Сообщение Cyrax » 25.06.2003 (Ср) 5:29

возникает тоже событие MouseMove. только в нем координаты надо проверять. если они нашодятся в пределах (0, 0)...(PictureBox.Width, PictureBox.Height), значит курсор над контролом. в противном случае курсор ушел с контрола.
Код: Выделить всё
Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If X > 0 And X < Picture1.Width And Y > 0 And Y < Picture1.Height Then
        ' курсор над контролом
    Else
        ' ушел
    End If
End Sub
Ты это ему расскажи. Я уже пять болтов отвинтил, и конца не видно... (озадаченно) А это в какую сторону тянуть? Ну-ка... Ага, этот был лишний, этот вообще не отсюда, и этот... Точно, два болта.

Welcome to IRC

drronnie
Постоялец
Постоялец
 
Сообщения: 793
Зарегистрирован: 04.03.2002 (Пн) 22:29
Откуда: Украина, Алчевск

Сообщение drronnie » 25.06.2003 (Ср) 7:00

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

2Cyrax, а с какой радости возникнет событие MouseMove, если ты уберёшь мышку... ну скажем с ПикчеБокса на форму? Не будет это событие происходить...
Компиляция - перевод словесного поноса в машинный код.

Alex_new_2030
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 118
Зарегистрирован: 20.02.2003 (Чт) 8:00
Откуда: Kazakhstan

Сообщение Alex_new_2030 » 25.06.2003 (Ср) 7:36

А почему бы и не написать код для формы??? Я нечто подобное делал только не с имеджбоксом а с Frame (тапа автоматически открывающееся панель инструментов, когда на свернутый Frame мышой наезжаешь он разворачивается Frame1_MouseMove), а для свертывания Frame'а писал код в форме Form_MouseMove

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

Сообщение GSerg » 25.06.2003 (Ср) 8:18

Качай API-Guide и зри функцию TrackMouseEvent
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Cyrax
Cyberninja
Cyberninja
Аватара пользователя
 
Сообщения: 891
Зарегистрирован: 25.04.2002 (Чт) 21:20
Откуда: Magnitogorsk, Russia

Сообщение Cyrax » 25.06.2003 (Ср) 10:21

drronnie писал(а):2Cyrax, а с какой радости возникнет событие MouseMove, если ты уберёшь мышку... ну скажем с ПикчеБокса на форму? Не будет это событие происходить...

а с такой, что так задумано...
просто возми этот код да и проверь...
единственное ограничение в этом случае - и у формы и у picturebox'а свойство ScaleMode должно быть одинаковым.
Ты это ему расскажи. Я уже пять болтов отвинтил, и конца не видно... (озадаченно) А это в какую сторону тянуть? Ну-ка... Ага, этот был лишний, этот вообще не отсюда, и этот... Точно, два болта.

Welcome to IRC

drronnie
Постоялец
Постоялец
 
Сообщения: 793
Зарегистрирован: 04.03.2002 (Пн) 22:29
Откуда: Украина, Алчевск

Сообщение drronnie » 26.06.2003 (Чт) 0:22

Cyrax писал(а):
drronnie писал(а):2Cyrax, а с какой радости возникнет событие MouseMove, если ты уберёшь мышку... ну скажем с ПикчеБокса на форму? Не будет это событие происходить...

а с такой, что так задумано...
просто возми этот код да и проверь...
единственное ограничение в этом случае - и у формы и у picturebox'а свойство ScaleMode должно быть одинаковым.

Подожди... MouseMove - это движение мыши, так? И вот как только ты наводишь мышку на ПикчеБокс - оно происходит... но как только убираешь - MouseMove начинает происходить для другого объекта (ну например - формы) а MouseMove для Пикче не происходит...
Я прав?
Компиляция - перевод словесного поноса в машинный код.

iolaus
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 176
Зарегистрирован: 19.03.2002 (Вт) 18:33
Откуда: Москва

Сообщение iolaus » 26.06.2003 (Чт) 0:41

drronnie ты прав!!!!!
cyrax ты не прав отчасти:
если ты говоришь, что sclale одинаковый то смотреть надо не
Picture1.Width а Picture1.ScaleWidth

Picture1.Width<Picture1.ScaleWidth если есть бортик у пикчера!!!! а потомы у тя событие происходит на бортике а не на форме%) но если мых дёрнуть быстро у тя ни каой событие не произойдёт!!!
This message will self destruct in five seconds!!!

drronnie
Постоялец
Постоялец
 
Сообщения: 793
Зарегистрирован: 04.03.2002 (Пн) 22:29
Откуда: Украина, Алчевск

Сообщение drronnie » 26.06.2003 (Чт) 2:11

Я обэтом и толкую!
Кроме того модгружать картинку в МаусМув - глупо, ибо каждый раз при движении мыши она будет подгружаться заново... а зачем геморр?
Компиляция - перевод словесного поноса в машинный код.

iolaus
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 176
Зарегистрирован: 19.03.2002 (Вт) 18:33
Откуда: Москва

Сообщение iolaus » 26.06.2003 (Чт) 12:03

Private Type POINTAPI
x As Long
y As Long
End Type
Private Declare Function GetCursorPos Lib "user32.dll" (lpPoint As POINTAPI) As Long
Private Sub Timer1_Timer()
dim idx as POINTAPI
static kk as boolean
static ll as boolean
GetCursorPos idx
idx.x = idx.x * Screen.TwipsPerPixelX
idx.y = idx.y * Screen.TwipsPerPixelY
If (idx.x < Form1.Left + Picture1.Left Or idx.x > Form1.Left + Picture1.Left + Picture1.Width Or idx.y < Form1.Top + Picture1.Top Or idx.y > Form1.Top + Picture1.Top + Picture1.Height) And kk = False Then
MsgBox "картинка 1"
kk = True
ll = False
ElseIf idx.x > Form1.Left + Picture1.Left And idx.x < Form1.Left + Picture1.Left + Picture1.Width And idx.y > Form1.Top + Picture1.Top And idx.y < Form1.Top + Picture1.Top + Picture1.Height And ll = False Then
MsgBox "картинка 2"
ll = True
kk = False
End If
End Sub


надо ещё учесть заголовок окна... и тд%)
Последний раз редактировалось iolaus 26.06.2003 (Чт) 12:15, всего редактировалось 3 раз(а).
This message will self destruct in five seconds!!!

Cyrax
Cyberninja
Cyberninja
Аватара пользователя
 
Сообщения: 891
Зарегистрирован: 25.04.2002 (Чт) 21:20
Откуда: Magnitogorsk, Russia

Сообщение Cyrax » 26.06.2003 (Чт) 12:04

не буду я спорить по поводу MouseMove
нате вам работающий контрол с исходниками
смотрите файл ResizePanel.ctl процедура CloseButton_MouseMove
там все ясно и понятно.

2drronnie: а подгружать какртинку не обязательно. ее можно в ImageList, скажем, загнать и оттуда подставлять. не хочешь ImageList, создай массив As Picture и в него при запуске грузи картинки
Ты это ему расскажи. Я уже пять болтов отвинтил, и конца не видно... (озадаченно) А это в какую сторону тянуть? Ну-ка... Ага, этот был лишний, этот вообще не отсюда, и этот... Точно, два болта.

Welcome to IRC

drronnie
Постоялец
Постоялец
 
Сообщения: 793
Зарегистрирован: 04.03.2002 (Пн) 22:29
Откуда: Украина, Алчевск

Сообщение drronnie » 27.06.2003 (Пт) 1:04

Cyrax писал(а):2drronnie: а подгружать какртинку не обязательно. ее можно в ImageList, скажем, загнать и оттуда подставлять. не хочешь ImageList, создай массив As Picture и в него при запуске грузи картинки

Я не за то... просто обновляться картинка будет при каждом движении мыши... а зачем? Один раз подгрузил её в Пикче - и возись...
Компиляция - перевод словесного поноса в машинный код.

Cyrax
Cyberninja
Cyberninja
Аватара пользователя
 
Сообщения: 891
Зарегистрирован: 25.04.2002 (Чт) 21:20
Откуда: Magnitogorsk, Russia

Сообщение Cyrax » 27.06.2003 (Пт) 5:38

а в чем проблема? ну добавь еще одно условие в MouseMove. при первом событии ставишь ее в True, а потом проверяешь координаты курсора и эту переменную. если курсор на объекте и переменная True то картинку не меняешь. когда координаты выходять за границы объекта - меняешь картинку и ставишь переменную в False
Ты это ему расскажи. Я уже пять болтов отвинтил, и конца не видно... (озадаченно) А это в какую сторону тянуть? Ну-ка... Ага, этот был лишний, этот вообще не отсюда, и этот... Точно, два болта.

Welcome to IRC

drronnie
Постоялец
Постоялец
 
Сообщения: 793
Зарегистрирован: 04.03.2002 (Пн) 22:29
Откуда: Украина, Алчевск

Re: Как отловить событие ухода курсора с объекта?

Сообщение drronnie » 27.06.2003 (Пт) 7:11

Twinger писал(а):Делаю прогу в которой есть к примеру PictureBox, при наведении на него возникает событие MouseMove, в этом событии я делаю следующее
Picture1.Picture=LoadPicture(App.Path & "/img/del.gif")

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

Cyrax
Cyberninja
Cyberninja
Аватара пользователя
 
Сообщения: 891
Зарегистрирован: 25.04.2002 (Чт) 21:20
Откуда: Magnitogorsk, Russia

Сообщение Cyrax » 27.06.2003 (Пт) 7:28

2drronnie: согласен.
Ты это ему расскажи. Я уже пять болтов отвинтил, и конца не видно... (озадаченно) А это в какую сторону тянуть? Ну-ка... Ага, этот был лишний, этот вообще не отсюда, и этот... Точно, два болта.

Welcome to IRC

Twinger
Начинающий
Начинающий
 
Сообщения: 3
Зарегистрирован: 25.06.2003 (Ср) 0:03

Эй парни, спакуха, Вы вначале посмотрите, что за гимор...

Сообщение Twinger » 29.06.2003 (Вс) 0:19

Прога полностью написана. Всё работает, даже более того, всё клёво работает, кроме главного меню, оно как раз та проблема которую мне надо решить. Посмотрите как тормозит эта вся шняга.

Только чур... ВСЕ ПРАВА ЗАЩИЩЕНЫ!!!

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

Сообщение GSerg » 29.06.2003 (Вс) 7:44

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


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

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

Сейчас этот форум просматривают: Google-бот и гости: 26

    TopList  
cron