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

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

Оффлайн CreatoR [?]

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

  • Автор темы
  • Репутация: 2284
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
kzru_hunter  [?]
Цитировать
если в _Leave_Hover_Func добавить MessageBox, то будет печальная ситуация
Да, и об этом написано в шапке UDF.


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


AutoIt is simple, subtle, elegant.


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


Мои работы

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

Re: GUICtrlOnHover - Обработка событии при наведении мышки
« Ответ #30 Отправлен: Июнь 05, 2010, 22:05:06 »

Оффлайн kzru_hunter [?]

  • Осваивающий
  • **
  • Сообщений: 144
  • Репутация: 49
    • Награды
CreatoR  [?]
Цитировать
Да, и об этом написано в шапке UDF.
Такой баг возникал из-за того, что код, который находился после вызова Hover и LeaveHover функций не срабатывал и по новому вызывалась функция таймера, пока висел MsgBox, но уже со старыми значениями переменных. Перед тем вызвать Hover и LeaveHover функцию надо было записать новые значения глобальным переменным.

Вообщем, вот исправленный код (в ветви на линии 329 и рядом с 421 линией ):
(нажмите для показа/скрытия)
« Последнее редактирование: Июнь 09, 2010, 11:46:10 от kzru_hunter »

Оффлайн kzru_hunter [?]

  • Осваивающий
  • **
  • Сообщений: 144
  • Репутация: 49
    • Награды
AutoIt и так очень медленно работает по отношению к другим языкам программирования (для сравнения, цикл For...Next на AutoIt'е работает в 20 раз медленнее, чем в С++), поэтому предлагаю всем, кто пишет UDF, по максимуму его оптимизировать. Только вот для этого надо написать статью по оптимизации скорости работы скриптов и вынести её в массы.

Предлагаю в этом UDF оптимизировать функцию __GUICtrl_SOH_Call:
(нажмите для показа/скрытия)
Работает в 2.0-4.3 раза быстрее в зависимости от количества параметров в вызываемой функции.
« Последнее редактирование: Июнь 10, 2010, 12:24:50 от kzru_hunter »

Оффлайн CreatoR [?]

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

  • Автор темы
  • Репутация: 2284
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
kzru_hunter  [?]
Цитировать
цикл For...Next на AutoIt'е работает в 20 раз медленнее, чем в С++
AutoIt написан именно на нём ;)

Цитировать
предлагаю всем, кто пишет UDF, по максимуму его оптимизировать
Оптимизируем, по максимум возможного. Не стоит забывать, что UDF пишутся в одно время, на одной версии, а используются и расматриваются в другое время и на другой версии, более новой и усовершенствованной, поэтому оптимизация понятие относительное и периодное.

Цитировать
Только вот для этого надо написать статью по оптимизации скорости работы скриптов
Буду только рад такой статье, повешу на главной, и на всех известных и доступных мне ресурсах по AutoIt.

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

Re: GUICtrlOnHover - Обработка событии при наведении мышки
« Ответ #33 Отправлен: Июнь 09, 2010, 18:58:28 »

Оффлайн CreatoR [?]

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

  • Автор темы
  • Репутация: 2284
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
kzru_hunter  [?]
Цитировать
Предлагаю в этом UDF оптимизировать функцию __GUICtrl_SOH_Call
Тогда лучше уже так:

Код: AutoIt [Выделить]
Func __GUICtrl_SOH_Call($sFunction, $sParam1="", $sParam2="", $sParam3="", $sParam4="", $sParam5="")
    Local $iRet = Call($sFunction)
   
    If @error <> 0xDEAD Then
        Return $iRet
    EndIf
   
    $iRet = Call($sFunction, $sParam1)
   
    If @error <> 0xDEAD Then
        Return $iRet
    EndIf
   
    $iRet = Call($sFunction, $sParam1, $sParam2)
   
    If @error <> 0xDEAD Then
        Return $iRet
    EndIf
   
    $iRet = Call($sFunction, $sParam1, $sParam2, $sParam3)
   
    If @error <> 0xDEAD Then
        Return $iRet
    EndIf
   
    $iRet = Call($sFunction, $sParam1, $sParam2, $sParam3, $sParam4)
   
    If @error <> 0xDEAD Then
        Return $iRet
    EndIf
   
    $iRet = Call($sFunction, $sParam1, $sParam2, $sParam3, $sParam4, $sParam5)
   
    If @error <> 0xDEAD Then
        Return $iRet
    EndIf
   
    Return SetError(1, 0, 0)
EndFunc



Добавлено: Июнь 09, 2010, 22:52:55
Обновление библиотеки...

Список изменении:
Цитировать
[v2.0] - [09.06.2010]
* Исправлена потенциальная проблема с вызовом функции $sPrimaryDownFunc (первый вызов происходил только после получения WM_COMMAND сообщения, которое является событием для элемента управления в GUI).
* Исправлена проблема связанная с блокированием функции OnHover (вызываемая при навидении) - функция OnLeaveHover не вызывалась до тех пор пока функция OnHover была заблокированна (например вызовом MsgBox).
* Исправлена(?) (снова) проблема связанная с работой библиотеки на 64-битной ОС.
* Оптимизирована внутренняя функция "__GUICtrl_SOH_Call" для более быстрой обработки вызываемых функции параметров.
« Последнее редактирование: Июнь 09, 2010, 22:52:55 от CreatoR, Причина: Объединение сообщений »

Оффлайн kzru_hunter [?]

  • Осваивающий
  • **
  • Сообщений: 144
  • Репутация: 49
    • Награды
CreatoR  [?]
Цитировать
Тогда лучше уже так:
Макрос @error в 3 раза дольше обрабатывается, чем @extended  :)
@extended или @error может возвращать 0xDEAD для @error (0xBEEF для @extended) либо 0: сравнивать с 0xDEAD(0xBEEF) необязательно.
Зачем что-то возвращать из функции __GUICtrl_SOH_Call? )
И про последовательность вызова Call: может такая ситуация случиться (в очень редком случае), что HoverFunc может быть так задана
Код: AutoIt [Выделить]
_Hover_Proc($iCtrlID, $iParam = 0)

В этом случае будет вызвана Call($sFunction, $sParam1) и $iParam так и останется нулём.

Оффлайн CreatoR [?]

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

  • Автор темы
  • Репутация: 2284
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
kzru_hunter  [?]
Цитировать
Макрос @error в 3 раза дольше обрабатывается, чем @extended
Ничего подобного, вот пример который доказывает что они одинаково обрабатываются:

Код: AutoIt [Выделить]
If $CmdLine[0] = 0 Then
    $iTimer = TimerInit()
    _SetExtendedError()
    If @extended = 1 Then MsgBox(64, 'TimerDiff - @extended', TimerDiff($iTimer))
   
    Run(@AutoItExe & ' /AutoIt3ExecuteScript "' & @ScriptFullPath & '" @Error')
    Exit
Else
    $iTimer = TimerInit()
    _SetExtendedError()
    If @error = 1 Then MsgBox(64, 'TimerDiff - @error', TimerDiff($iTimer))
EndIf

Func _SetExtendedError()
    Return SetError(1, 1, 0)
EndFunc



Цитировать
@extended или @error может возвращать 0xDEAD для @error (0xBEEF для @extended) либо 0: сравнивать с 0xDEAD(0xBEEF) необязательно.
Несмотря на неясность первого выражения в этом предложении, я всё же отвечу, что сравнивать с 0xDEAD это корректно с точки зрения документации к функции.

Цитировать
Зачем что-то возвращать из функции __GUICtrl_SOH_Call?
Опять же, для “порядочности”, так правильнее.

Цитировать
В этом случае будет вызвана Call($sFunction, $sParam1) и $iParam так и останется нулём
Почему? впрочем это неправильное использования функции, зачем параметры делать опционально?

Оффлайн CreatoR [?]

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

  • Автор темы
  • Репутация: 2284
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Новый пример, при навидений на кнопку/надпись показывает самодельную всплывающую подсказу:

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

#include "GUICtrlOnHover.au3"

Global $sBtn_Image = @Systemdir & "\oobe\images\wpakey.jpg"
Global $sLbl_Image = @Systemdir & "\oobe\images\merlin.gif"

If Not FileExists($sBtn_Image) Or Not FileExists($sLbl_Image) Then
    $sBtn_Image = @TempDir & "\wpakey.jpg"
    $sLbl_Image = @TempDir & "\merlin.gif"
   
    InetGet("http://creator-lab.ucoz.ru/Images/wpakey.jpg", $sBtn_Image)
    InetGet("http://creator-lab.ucoz.ru/Images/merlin.gif", $sLbl_Image)
EndIf

$hGUI = GUICreate("Control ToolTip OnHover Example",500,400)

$nButton = GUICtrlCreateButton("Button", 100, 100, 50, 50)
_GUICtrl_OnHoverRegister(-1, "_ShowToolTip_Proc", "_ShowToolTip_Proc")

$nLabel = GUICtrlCreateLabel("Label", 300, 100, -1, 15)
_GUICtrl_OnHoverRegister(-1, "_ShowToolTip_Proc", "_ShowToolTip_Proc")

GUISetState(@SW_SHOW, $hGUI)

$hButton_ToolTip = _GUIToolTipCreate("My Button ToolTip", "Some Info", $sBtn_Image, 0x4E6FD6)
$hLabel_ToolTip = _GUIToolTipCreate("My Label ToolTip", "Some Info", $sLbl_Image, 0xFFFFFF)

While 1
    $nMsg = GUIGetMsg()
   
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            ExitLoop
    EndSwitch
WEnd

Func _GUIToolTipCreate($sTitle, $sText, $sImage = '', $nBkColor = 0xECEC00)
    Local $hToolTip = GUICreate($sTitle, 300, 200, -1, -1, BitOR($WS_POPUP, $WS_BORDER), $WS_EX_TOPMOST, $hGUI)
    GUISetBkColor($nBkColor, $hToolTip)
    GUICtrlCreatePic($sImage, 10, 10, 80, 80, $WS_BORDER)
    GUICtrlCreateLabel($sTitle, 100, 10, 180, 20)
    GUICtrlSetFont(-1, 10, 800)
    GUICtrlCreateLabel($sText, 100, 50, 180, 120)
    Return $hToolTip
EndFunc

Func _ShowToolTip_Proc($iCtrlID, $iHoverMode)
    Local $hToolTip
   
    Switch $iCtrlID
        Case $nButton
            $hToolTip = $hButton_ToolTip
        Case $nLabel
            $hToolTip = $hLabel_ToolTip
    EndSwitch
   
    Switch $iHoverMode
        Case 1 ;Hover proc
            $aMousePos = MouseGetPos()
            WinMove($hToolTip, "", $aMousePos[0]+10, $aMousePos[1]+10)
            GUISetState(@SW_SHOWNOACTIVATE, $hToolTip)
        Case 2 ;Leave hover proc
            GUISetState(@SW_HIDE, $hToolTip)
    EndSwitch
EndFunc


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

Re: GUICtrlOnHover - Обработка событии при наведении мышки
« Ответ #37 Отправлен: Октябрь 26, 2010, 17:19:28 »

Оффлайн saavaage [?]

  • Новичок
  • *
  • Сообщений: 171
  • Репутация: 17
  • Пол: Мужской
    • Награды
Столкнулся с такой проблемой. Есть следующий пример, который работает корректно:

(нажмите для показа/скрытия)

Но как только я пытаюсь его применить в серьезном скрипте, где очень большое кол-во контроллов, по которым необходимо выводить подсказки (больше 100), при попытке выйти через  закрытие формы по клику на ESC (крестик в правом верхнем углу формы)  (GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")), периодически происходит зависание с выдачей такого сообщения:

F:\LABORATORY\WORK_1(SmartXP)\SmartXP.au3 (1216) : ==> Recursion level has been exceeded - AutoIt will quit to prevent stack overflow.:
Sleep(100)

Эксперименты с увеличением sleep() до sleep(1000) в крнструкции

Код: AutoIt [Выделить]
While 1
    Sleep(100)
WEnd


 к успеху не привели.. :(

PS Есть подозрение на функцию _Leave_Hover_Func
« Последнее редактирование: Декабрь 04, 2010, 15:22:58 от saavaage »
мы рождены, чтоб сказку сделать былью

Оффлайн CreatoR [?]

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

  • Автор темы
  • Репутация: 2284
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
saavaage  [?]
Цитировать
происходит зависание с выдачей такого сообщения
Придётся посмотреть на полный скрипт, иначе трудно сказать.

Оффлайн saavaage [?]

  • Новичок
  • *
  • Сообщений: 171
  • Репутация: 17
  • Пол: Мужской
    • Награды

Оффлайн CreatoR [?]

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

  • Автор темы
  • Репутация: 2284
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
saavaage  [?]
Цитировать
периодически происходит зависание с выдачей такого сообщения
У меня не получается это воспроизвести :(

Оффлайн saavaage [?]

  • Новичок
  • *
  • Сообщений: 171
  • Репутация: 17
  • Пол: Мужской
    • Награды
CreatoR, Технология проверки такова:
1. запускаем,
2. перемещаемся мышкой по форме, вкл. все работающие на строку состояния контроллы (вкладка Итого ПК и вкладка Ошибки)
3. пробуем выйти через нажатие на правый верхний крестик
4. одна из 5 (в среднем) попытки приводит к краху

PS проверял не только на своем ПК

Оффлайн CreatoR [?]

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

  • Автор темы
  • Репутация: 2284
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Получилось :)
Вся проблема в _CleanDatas(), нужно добавить GUIDelete() и убрать паузы оттуда, я вообще не понмаю смысл в них.

Код: AutoIt [Выделить]
Func _CleanDatas()
    GUIDelete($hMain_GUI)
   
    FileDelete(@WindowsDir&'\regperm.exe')
    FileDelete(@HomeDrive &'\My_IE_EasySec.reg')
    FileDelete(@MyDocumentsDir&'\my_localpolicy_Ip.ipsec')
    FileDelete(@HomeDrive & '\dx.txt')
    FileDelete(@WindowsDir&'\setenv.exe')
    FileDelete(@HomeDrive & '\reg.dat')
EndFunc


так вроде завершает работу без проблем.

Оффлайн saavaage [?]

  • Новичок
  • *
  • Сообщений: 171
  • Репутация: 17
  • Пол: Мужской
    • Награды
CreatoR, я пробовал вообще комментить эту функцию. Тоже сначало вроде все ок, однако потом тоже самое выскакивает. Только реже.

ХМ, сейчас попробовал сделать, что Вы предложили и вроде пока все ОК. Как протестю, отпишусь. Пока не копай глубже.
Спасибо, комрад!
« Последнее редактирование: Декабрь 04, 2010, 19:09:29 от saavaage »

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

Re: GUICtrlOnHover - Обработка событии при наведении мышки
« Ответ #44 Отправлен: Декабрь 04, 2010, 19:01:25 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
77 Ответов
64423 Просмотров
Последний ответ Ноябрь 14, 2017, 23:08:08
от rpgeha
11 Ответов
10634 Просмотров
Последний ответ Март 23, 2017, 01:38:24
от CreatoR
5 Ответов
5399 Просмотров
Последний ответ Ноябрь 13, 2009, 00:09:20
от CreatoR
6 Ответов
7598 Просмотров
Последний ответ Март 20, 2015, 20:52:41
от CtrlSoft
11 Ответов
4642 Просмотров
Последний ответ Декабрь 30, 2011, 21:41:52
от Poma_007
8 Ответов
4019 Просмотров
Последний ответ Апрель 05, 2012, 09:40:35
от madmasles
0 Ответов
1984 Просмотров
Последний ответ Сентябрь 06, 2012, 23:21:27
от Juffin
8 Ответов
2812 Просмотров
Последний ответ Декабрь 12, 2014, 17:38:46
от Yashied
9 Ответов
2408 Просмотров
Последний ответ Апрель 24, 2015, 17:23:51
от Крепыш
6 Ответов
452 Просмотров
Последний ответ Декабрь 18, 2017, 17:45:42
от Tempo