Как получить событие, когда мышь находится НАД гаджетом?
|
|
salexeiy | Дата: Четверг, 30.11.2017, 21:29 | Сообщение # 1 |
Лейтенант
Группа: Пользователи
Сообщений: 72
Статус: Offline
| Всё довольно банально: нужно отлавливать события при наведение курсора мышки на гаджет для вывода подсказок о гаджете в строке статуса. В документации только нажатие кнопок либо нажатие и отпускание. Мне главное событие поймать, со строкой статуса сам разберусь. Ещё бы не помешало знать, как происходит обратное действие. Т.е. курсор покидает гаджет и строка статуса очищается.
Сообщение отредактировал salexeiy - Четверг, 30.11.2017, 21:32 |
|
| |
haav | Дата: Пятница, 01.12.2017, 06:41 | Сообщение # 2 |
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Статус: Offline
| Цитата salexeiy ( ) Всё довольно банально: нужно отлавливать события при наведение курсора мышки на гаджет для вывода подсказок о гаджете в строке статуса. В документации только нажатие кнопок либо нажатие и отпускание. Мне главное событие поймать, со строкой статуса сам разберусь. Ещё бы не помешало знать, как происходит обратное действие. Т.е. курсор покидает гаджет и строка статуса очищается.
IsMouseOver()
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
salexeiy | Дата: Пятница, 01.12.2017, 11:48 | Сообщение # 3 |
Лейтенант
Группа: Пользователи
Сообщений: 72
Статус: Offline
| Что то как то сложновато и запутано. Взять пример из описания этой функции.
Код Case WM_LBUTTONDOWN Dim As RECT re GetClientRect(Text,@re) If IsMouseOver(text) Then SetGadgetColor(1,0,50000,2) invalidaterect(Text,0,1) RunProgram("http://www.freebasic.net/forum/") else SetGadgetColor(1,0,0,2) invalidaterect(Text,0,1) EndIf Зачем нужна эта функция в обработке нажатия кнопки мыши? Я вижу это дело, как: если кнопка мыши была нажата, и нажата она по области IsMouseOver(text), то сделать так, в противном случае иначе. Я прав? Т.е. эта функция совместно с WM_LBUTTONDOWN проверяет область нажатия мыши?
|
|
| |
haav | Дата: Пятница, 01.12.2017, 12:02 | Сообщение # 4 |
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Статус: Offline
| Вот этот пример может будет полегче:
Код #Include "window9.bi"
Dim Shared As HWND hw
Sub TimerProc() If IsMouseOver(GadgetID(1)) Then SetWindowText(hw,"TextGadget") ElseIf IsMouseOver(GadgetID(2)) Then SetWindowText(hw,"ButtonGadget") Else SetWindowText(hw,"None") EndIf End Sub
hw = OpenWindow("IsMouseover Test",100,100,500,300)
TextGadget(1,10,10,100,30,"editor",SS_CENTER)
ButtonGadget(2,180,10,100,20,"button")
SetTimer(hw , 1 , 10 , Cast(Any Ptr,@TimerProc()) )
Do If WaitEvent=EventClose Then Exit Do Loop
Просто подноси мышь к гаджетам и смотри на заголовок окна.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
salexeiy | Дата: Пятница, 01.12.2017, 13:14 | Сообщение # 5 |
Лейтенант
Группа: Пользователи
Сообщений: 72
Статус: Offline
| Вот за этот пример большое спасибо!!! А зачем нужен таймер? Что-то типа своеобразного цикла для вызова функции?
Заметил, что текст в строке статуса моргает. Это из-за таймера?
Сообщение отредактировал salexeiy - Пятница, 01.12.2017, 13:47 |
|
| |
haav | Дата: Пятница, 01.12.2017, 13:53 | Сообщение # 6 |
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Статус: Offline
| Цитата salexeiy ( ) Вот за этот пример большое спасибо!!! А зачем нужен таймер? Что-то типа своеобразного цикла для вызова функции?
Чтобы лучше понять, немного изменим исходник:
Код #Include "window9.bi"
Dim Shared As HWND hw
Sub TimerProc() If IsMouseOver(GadgetID(1)) Then SetWindowText(hw,"TextGadget") ElseIf IsMouseOver(GadgetID(2)) Then SetWindowText(hw,"ButtonGadget") Else SetWindowText(hw,"None") EndIf End Sub
hw = OpenWindow("IsMouseover Test",100,100,500,300)
TextGadget(1,10,10,100,30,"editor",SS_CENTER)
ButtonGadget(2,180,10,100,20,"button")
SetTimer(hw , 1 , 10 , Cast(Any Ptr,@TimerProc()) )
Do Var ev = WaitEvent Select Case ev Case EventClose Exit Do Case eventgadget If EventNumber = 2 Then MessBox("Сообщение","Это кнопка") EndIf End Select Loop
Теперь после запуска примера , нажми на кнопку. Появился диалог , который останавливает цикл до тех пор, пока не закроешь данный диалог. Однако несмотря на то, что цикл замер на строчке MessBox("Сообщение","Это кнопка") , ты можешь спокойно водить мышью по гаджетам и работоспособность процедуры TimerProc с IsMouseOver не нарушена. Представь, если ты обработку IsMouseOver сделаешь в цикле do-loop, тогда до тех пор пока работает диалог , работа IsMouseOver будет остановлена из-за остановки цикла.
Цитата Заметил, что текст в строке статуса моргает. Это из-за таймера?
У меня в заголовке окна ничего не моргает. Но даже если так, то есть простое решение:
проверять что находится в заголовке окна 1) если тоже самое , что нужно вывести, то ничего не делать 2) если не тоже самое , то выполняем действие по изменению
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
salexeiy | Дата: Пятница, 01.12.2017, 14:31 | Сообщение # 7 |
Лейтенант
Группа: Пользователи
Сообщений: 72
Статус: Offline
| Всё, разобрался, спасибо большое!!!
|
|
| |
|