Что нового

[Элементы GUI] Изменить стандартную реакцию кнопки на клик мыши

Dm666

Осваивающий
Сообщения
221
Репутация
48
Такая ситуация. Есть простейшая кнопка, допустим
Код:
#include <GUIConstantsEx.au3>
GUICreate("My GUI Button") ; will create a dialog box that when displayed is centered
$Button_1 = GUICtrlCreateButton("Run Notepad", 10, 30, 100)
GUISetState() ; will display an  dialog box with 2 button

; Run the GUI until the dialog is closed
While 1
	$msg = GUIGetMsg()
	Select
		Case $msg = $GUI_EVENT_CLOSE
			ExitLoop
		Case $msg = $Button_1
			Run('Notepad.exe') ; Will Run/Open Notepad
	EndSelect
WEnd

Вот можно сделать так:
1. Нажать мышью на GUI кнопку. При этом кнопка зажмется
2. Не отпуская кнопку мыши убрать курсор с GUI кнопки куда подальше. При этом GUI кнопка отожмется.
3. Отпустить мышь.
В итоге имеем, что кнопка как бы нажималась, но событие не зарегистрировалось. Стандартное виндовое поведение. А вот как бы такой факт отловить и обработать?
Мне казалось я в справке что-то такое видел, но найти не могу. А может и привиделось. Развейте сомнения плз.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
GUICtrlOnHover - Обработка событии при наведении мышки


Добавлено:
Сообщение автоматически объединено:

Пример:

Код:
#include <GUIConstantsEx.au3>
#include "GUICtrlOnHover.au3"

$Gui = GUICreate("OnClick Hovering Example", 280, 200)

$Button = GUICtrlCreateButton("Click", 80, 20, 80, 20)
_GUICtrl_OnHoverRegister(-1, "", "", "PrimaryDown_Proc", -1, 0)

$ClickDummy = GUICtrlCreateDummy()

GUISetState()

While 1
	$nMsg = GUIGetMsg()
	
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $ClickDummy ;We use Dummy to avoid the blocking of OnHover function (please read UDF docs)
			Do
				$aCurInfo = GUIGetCursorInfo()
			Until $aCurInfo[2] = 0
			
			If $aCurInfo[4] <> $Button Then
				MsgBox(64, 'Title', 'Clicked Unhovered')
			EndIf
		Case $Button
			MsgBox(64, 'Title', 'Clicked Hovered')
	EndSwitch
WEnd

Func PrimaryDown_Proc($iCtrlID)
	GUICtrlSendToDummy($ClickDummy)
EndFunc
 
Автор
Dm666

Dm666

Осваивающий
Сообщения
221
Репутация
48
Udf значит... Значит привиделось мне в справке ;)
Спасибо, пример, разумеется, работает.
Буду вникать в принцип работы и прикручивать к своему скрипту.

Я дико извиняюсь, что снова открываю уже как бы решенную тему... Крутил по-всякому, но что-то у меня извилин не хватает :wacko:
Creator, берем ваш пример и добавляем на что-нибудь на форму, скажем, Edit:
Код:
#include <GUIConstantsEx.au3>
#include "GUICtrlOnHover.au3"

$Gui = GUICreate("OnClick Hovering Example", 280, 200)

$Edit = GUICtrlCreateEdit("",180,20,60,60)

$Button = GUICtrlCreateButton("Click", 80, 20, 80, 20)
_GUICtrl_OnHoverRegister(-1, "", "", "PrimaryDown_Proc", -1, 0)

$ClickDummy = GUICtrlCreateDummy()

GUISetState()

While 1
    $nMsg = GUIGetMsg()
   
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $ClickDummy ;We use Dummy to avoid the blocking of OnHover function (please read UDF docs)
            Do
                $aCurInfo = GUIGetCursorInfo()
            Until $aCurInfo[2] = 0
           
            If $aCurInfo[4] <> $Button Then
                MsgBox(64, 'Title', 'Clicked Unhovered')
            EndIf
        Case $Button
            MsgBox(64, 'Title', 'Clicked Hovered')
    EndSwitch
WEnd

Func PrimaryDown_Proc($iCtrlID)
    GUICtrlSendToDummy($ClickDummy)
EndFunc

Все работает прекрасно, пока Edit не получит фокус. После этого Unhovered клик не сработает, пока хоть раз не кликнуть Hovered...
Что я делаю не так?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
В данном случае лучше сделать так (попроще):

Код:
#include <GUIConstantsEx.au3>

$Gui = GUICreate("OnClick Hovering Example", 280, 200)

$Edit = GUICtrlCreateEdit("",180,20,60,60)
$Button = GUICtrlCreateButton("Click", 80, 20, 80, 20)

GUISetState()

AdlibRegister("_CheckBttnClick", 10)

While 1
    $nMsg = GUIGetMsg()
	
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Button
            MsgBox(64, 'Title', 'Clicked Hovered')
	EndSwitch
WEnd

Func _CheckBttnClick()
	Local $aCurInfo = GUIGetCursorInfo()
	
	If IsArray($aCurInfo) And $aCurInfo[2] = 1 And $aCurInfo[4] = $Button Then
		Do
			$aCurInfo = GUIGetCursorInfo()
		Until $aCurInfo[2] = 0
		
		If $aCurInfo[4] <> $Button Then
			MsgBox(64, 'Title', 'Clicked Unhovered')
		EndIf
	EndIf
EndFunc
 
Автор
Dm666

Dm666

Осваивающий
Сообщения
221
Репутация
48
Гениально! И даже без дополнительных Udf! :ok:

Разобрался, подправил и прикрутил к своему скрипту. Работает на все 100, спасибо! :IL_AutoIt_1:
 
Верх