FreeBasic
Главная
Вход
Регистрация
Четверг, 05.12.2024, 20:16Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Как получить событие, когда мышь находится НАД гаджетом?
salexeiyДата: Четверг, 30.11.2017, 21:29 | Сообщение # 1
Лейтенант
Группа: Пользователи
Сообщений: 72
Репутация: 2
Статус: Offline
Всё довольно банально: нужно отлавливать события при наведение курсора мышки на гаджет для вывода подсказок о гаджете в строке статуса. В документации только нажатие кнопок либо нажатие и отпускание. Мне главное событие поймать, со строкой статуса сам разберусь.
Ещё бы не помешало знать, как происходит обратное действие. Т.е. курсор покидает гаджет и строка статуса очищается.


Сообщение отредактировал salexeiy - Четверг, 30.11.2017, 21:32
 
haavДата: Пятница, 01.12.2017, 06:41 | Сообщение # 2
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Репутация: 50
Статус: Offline
Цитата salexeiy ()
Всё довольно банально: нужно отлавливать события при наведение курсора мышки на гаджет для вывода подсказок о гаджете в строке статуса. В документации только нажатие кнопок либо нажатие и отпускание. Мне главное событие поймать, со строкой статуса сам разберусь.
Ещё бы не помешало знать, как происходит обратное действие. Т.е. курсор покидает гаджет и строка статуса очищается.


IsMouseOver()


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
salexeiyДата: Пятница, 01.12.2017, 11:48 | Сообщение # 3
Лейтенант
Группа: Пользователи
Сообщений: 72
Репутация: 2
Статус: 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
Репутация: 50
Статус: 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
Репутация: 2
Статус: Offline
Вот за этот пример большое спасибо!!! А зачем нужен таймер? Что-то типа своеобразного цикла для вызова функции?

Заметил, что текст в строке статуса моргает. Это из-за таймера?


Сообщение отредактировал salexeiy - Пятница, 01.12.2017, 13:47
 
haavДата: Пятница, 01.12.2017, 13:53 | Сообщение # 6
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Репутация: 50
Статус: 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
Репутация: 2
Статус: Offline
Всё, разобрался, спасибо большое!!!
 
  • Страница 1 из 1
  • 1
Поиск: