Автор Тема: GUICtrlOnHover - Обработка событии при наведении мышки  (Прочитано 36821 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7816
  • Репутация: 2284
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
AutoIt: 3.3.0.0+
Версия: 2.1
Категория: Элементы GUI
Описание: Позволяет установить обработчик на событие вызываемое при наведении курсора мышки над элементами GUI (OnHover)
Пример:
(нажмите для показа/скрытия)

Screenshot: N/A

Скачать: GUICtrl_SetOnHover.zip
(во вложениях старые версии).

Источник: CreatoR, http://www.autoitscript.com/forum/index.php?s=&showtopic=55120
« Последнее редактирование: Июль 04, 2012, 15:44:38 от CreatoR, Причина: Обновление версии »


Правила, Поиск, Супер тема


AutoIt is simple, subtle, elegant.


«Не оказываю тех. поддержку через ПМ/ICQ, и по электронной почте - для этого есть форум. (C)»
«Законы Мэрфи неоспоримы!»


Мои работы

Русское сообщество AutoIt

GUICtrlOnHover - Обработка событии при наведении мышки
« Отправлен: Сентябрь 22, 2009, 02:06:14 »

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2694
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: GUICtrlSetOnHover - Обработка событии при навидении
« Ответ #1, Отправлен: Сентябрь 22, 2009, 02:12:13 »
Отлично, CreatoR. Спасибо. Я давно ждал этот UDF здесь.

+1

:)


Думай, прежде чем говорить.

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2694
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: GUICtrlSetOnHover - Обработка событии при навидении
« Ответ #2, Отправлен: Сентябрь 28, 2009, 00:38:49 »
Обнаружил одну проблему. Если нажать кнопку мыши вне элемента и затем, не отпуская кнопки, подвести к любому элементу, то срабатывает вызов функции для нажатия. Мог бы ты это пофиксить?

:-\

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7816

  • Автор темы
  • Репутация: 2284
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: GUICtrlSetOnHover - Обработка событии при навидении
« Ответ #3, Отправлен: Сентябрь 28, 2009, 01:57:55 »
Yashied [?]
Цитировать
Если нажать кнопку мыши вне элемента и затем, не отпуская кнопки, подвести к любому элементу, то срабатывает вызов функции для нажатия
Это действительно проблема, и простого решения я пока не вижу. Есть идеи как различить нажатие на кнопке и в другом месте (я уже молчу про нажатие на другом элементе, на который тоже задан OnHover)?

Русское сообщество AutoIt

Re: GUICtrlSetOnHover - Обработка событии при навидении
« Ответ #3 Отправлен: Сентябрь 28, 2009, 01:57:55 »

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7816

  • Автор темы
  • Репутация: 2284
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: GUICtrlSetOnHover - Обработка событии при навидении
« Ответ #4, Отправлен: Сентябрь 28, 2009, 02:26:06 »
Нашёл решение! :whistle: Правда тут нужно будет задействовать WM_COMMAND и WM_LBUTTONUP...

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7816

  • Автор темы
  • Репутация: 2284
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: GUICtrlSetOnHover - Обработка событии при навидении
« Ответ #5, Отправлен: Сентябрь 28, 2009, 02:52:56 »
Мда, оказалось сложнее чем я думал. Придётся ставить Mouse Hook... Нет не придётся (тем более с ним свои проблемы), всё же обошлось дело одними WM_... сообщениями.
« Последнее редактирование: Сентябрь 28, 2009, 03:43:26 от CreatoR »

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2694
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: GUICtrlSetOnHover - Обработка событии при наведении
« Ответ #6, Отправлен: Сентябрь 28, 2009, 10:04:33 »
Как тебе такой вариант?

Код: AutoIt [Выделить]
#Include <Constants.au3>
#Include <WinAPIEx.au3>
#Include <WindowsConstants.au3>

Global Const $WM_MOUSELEAVE = 0x02A3
;Global Const $WM_MOUSEMOVE = 0x0200

Global $Hover = False

$hForm = GUICreate('MyGUI', 400, 400)
$Button = GUICtrlCreateButton('Exit', 165, 366, 70, 23)

$hButton = GUICtrlGetHandle($Button)
$hDll = DllCallbackRegister('_WinProc', 'ptr', 'hwnd;uint;wparam;lparam')
$pDll = DllCallbackGetPtr($hDll)
$hProc = _WinAPI_SetWindowLong($hButton, $GWL_WNDPROC, $pDll)

GUISetState()

Do
Until GUIGetMsg() = -3

Func _WinProc($hWnd, $iMsg, $wParam, $lParam)
    Switch $iMsg
        Case $WM_MOUSEMOVE
            If Not $Hover Then
                ConsoleWrite('Hover' & @CR)
                $Hover = 1
            EndIf
        Case $WM_MOUSELEAVE
            ConsoleWrite('Leave' & @CR)
            $Hover = 0
    EndSwitch
    Return _WinAPI_CallWindowProc($hProc, $hWnd, $iMsg, $wParam, $lParam)
EndFunc   ;==>_WinProc

Func OnAutoItExit()
    _WinAPI_SetWindowLong($hButton, $GWL_WNDPROC, $hProc)
    DllCallbackFree($hDll)
EndFunc   ;==>OnAutoItExit


Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2694
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: GUICtrlSetOnHover - Обработка событии при наведении
« Ответ #7, Отправлен: Сентябрь 28, 2009, 10:19:47 »
:(

Здесь тоже есть много проблем.

Русское сообщество AutoIt

Re: GUICtrlSetOnHover - Обработка событии при наведении
« Ответ #7 Отправлен: Сентябрь 28, 2009, 10:19:47 »

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2694
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: GUICtrlSetOnHover - Обработка событии при наведении
« Ответ #8, Отправлен: Сентябрь 28, 2009, 10:47:47 »
Можно еще попробывать использовать _IsPressed() внутри функции таймера и ввести глобальный флаг, который будет однозначно (10 мс - ?) показывать состояние клавиши мыши. Получиться своего рода замена Mouse Hook. Останется только проверить этот флаг перед вызовом пользовательской функции.

Код: AutoIt [Выделить]
$LeftButtonDown = _IsPressed('01')


Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7816

  • Автор темы
  • Репутация: 2284
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: GUICtrlSetOnHover - Обработка событии при наведении
« Ответ #9, Отправлен: Сентябрь 28, 2009, 17:24:57 »
Yashied [?]
Цитировать
Можно еще попробывать использовать _IsPressed() внутри функции таймера
Мне не хотелось бы нагружать скрипт постоянным (и лишним) вызовом Dll'ок... Решение у меня уже есть, вопрос насколько UDF после этого будет конфликтовать с другими скриптами, в силу использования WM сообщении?

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2694
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: GUICtrlSetOnHover - Обработка событии при наведении
« Ответ #10, Отправлен: Сентябрь 28, 2009, 17:30:25 »
Мне не терпится посмотреть на твое решение.

:laugh:

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7816

  • Автор темы
  • Репутация: 2284
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: GUICtrlSetOnHover - Обработка событии при наведении
« Ответ #11, Отправлен: Сентябрь 28, 2009, 18:32:16 »
Yashied [?]
Цитировать
Мне не терпится посмотреть на твое решение
Примерно так:

В переменные (в начало) добавляем:
Код: AutoIt [Выделить]
Global $iLAST_PRIMARYDOWN_CTRLID                = 0

Global Const $__GUICtrl_SetOnHover_WM_COMMAND       = 0x0111
Global Const $__GUICtrl_SetOnHover_WM_LBUTTONDOWN   = 0x0201


В функцию _GUICtrl_SetOnHover под условие «If $pTimerProc = 0 Then» добавляем:
Код: AutoIt [Выделить]
        GUIRegisterMsg($__GUICtrl_SetOnHover_WM_COMMAND, "__GUICtrl_SetOnHover_WM_COMMAND")
        GUIRegisterMsg($__GUICtrl_SetOnHover_WM_LBUTTONDOWN, "__GUICtrl_SetOnHover_WM_LBUTTONDOWN")


далее в функции __MAIN_CALLBACK_ONHOVER_PROC находим условие начинающиеся с «If $aCursorInfo[2] = 1 And $aHOVER_CONTROLS_ARRAY[$i][3]» и перед этим условием (в том же «If») добавляем ещё одно:
Код: AutoIt [Выделить]
$iLAST_PRIMARYDOWN_CTRLID = $iControl_Hovered And


Всё, теперь только осталось добавить сами WM-функции:
Код: AutoIt [Выделить]
Func __GUICtrl_SetOnHover_WM_COMMAND($hWndGUI, $MsgID, $WParam, $LParam)
    $iLAST_PRIMARYDOWN_CTRLID = $LParam
EndFunc

Func __GUICtrl_SetOnHover_WM_LBUTTONDOWN($hWndGUI, $MsgID, $WParam, $LParam)
    $iLAST_PRIMARYDOWN_CTRLID = 0
EndFunc

« Последнее редактирование: Сентябрь 28, 2009, 18:55:27 от CreatoR »

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2694
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: GUICtrlSetOnHover - Обработка событии при наведении
« Ответ #12, Отправлен: Сентябрь 28, 2009, 18:51:12 »
Да, но WM_LBUTTONDOWN будет работать только с окном, а если я нажму кнопку вне окна, или на другом элементе, или на заголовке окна? Здесь "малой кровью" не обойтись.

А почему ты не хочешь использовать _IsPressed()? Одним DllCall() больше, одним меньше, в данном случае это не имеет никакого значения, т.к. ты все равно используешь таймер. Дополнительная нагрузка будет практически незаметна.

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7816

  • Автор темы
  • Репутация: 2284
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: GUICtrlSetOnHover - Обработка событии при наведении
« Ответ #13, Отправлен: Сентябрь 28, 2009, 18:56:40 »
Yashied [?]
Цитировать
почему ты не хочешь использовать _IsPressed()?
Попытался, не получилось приспособить, есть идеи? Кстати свой пост поправил немного, забыл там добавить переменную в начало.

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7816

  • Автор темы
  • Репутация: 2284
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: GUICtrlSetOnHover - Обработка событии при наведении
« Ответ #14, Отправлен: Сентябрь 28, 2009, 18:59:05 »
Yashied [?]
Цитировать
WM_LBUTTONDOWN будет работать только с окном, а если я нажму кнопку вне окна, или на другом элементе, или на заголовке окна? Здесь "малой кровью" не обойтись.
Ты пробовал то что я написал? Мне пока не удалось найти ситуацию где бы это решение провалилось ;D. Ок, нашёл где это может не сработать - если при удерживании кнопки увести курсор за пределы окна и отпустить, то потом при удерживании вне окна и наведении над элементом, функция нажатия снова вызывается, но только для последнего нажатого элемента. Решение простое - добавить ещё одно условие:  «And WinActive($hParent_Wnd[0])»...
« Последнее редактирование: Сентябрь 28, 2009, 19:07:47 от CreatoR »

Русское сообщество AutoIt

Re: GUICtrlSetOnHover - Обработка событии при наведении
« Ответ #14 Отправлен: Сентябрь 28, 2009, 18:59:05 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
77 Ответов
64556 Просмотров
Последний ответ Ноябрь 14, 2017, 23:08:08
от rpgeha
11 Ответов
10646 Просмотров
Последний ответ Март 23, 2017, 01:38:24
от CreatoR
5 Ответов
5400 Просмотров
Последний ответ Ноябрь 13, 2009, 00:09:20
от CreatoR
6 Ответов
7603 Просмотров
Последний ответ Март 20, 2015, 20:52:41
от CtrlSoft
11 Ответов
4646 Просмотров
Последний ответ Декабрь 30, 2011, 21:41:52
от Poma_007
8 Ответов
4027 Просмотров
Последний ответ Апрель 05, 2012, 09:40:35
от madmasles
0 Ответов
1985 Просмотров
Последний ответ Сентябрь 06, 2012, 23:21:27
от Juffin
8 Ответов
2815 Просмотров
Последний ответ Декабрь 12, 2014, 17:38:46
от Yashied
9 Ответов
2410 Просмотров
Последний ответ Апрель 24, 2015, 17:23:51
от Крепыш
6 Ответов
456 Просмотров
Последний ответ Декабрь 18, 2017, 17:45:42
от Tempo