Что нового

Отловить клик на рисунке

w3d

Новичок
Сообщения
84
Репутация
3
Как можно отловить левый клик на рисунке gif?
В качестве примера беру скрипт из хелпа про GUICtrlCreatePic
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Opt('MustDeclareVars', 1)

Global $gui, $guiPos, $pic, $picPos

Example2()

;----- example 2
Func Example2()
	Local $msg
	
	$gui = GUICreate("test transparentpic", 200, 100)
	$pic = GUICreate("", 68, 71, 10, 10, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_MDICHILD), $gui)
	GUICtrlCreatePic(@SystemDir & "\oobe\images\merlin.gif", 0, 0, 0, 0)
	GUICtrlSetOnEvent(-1, "_Event")


	GUISetState(@SW_SHOW, $pic)
	GUISetState(@SW_SHOW, $gui)

	HotKeySet("{ESC}", "main")
	HotKeySet("{LEFT}", "left")
	HotKeySet("{RIGHT}", "right")
	HotKeySet("{DOWN}", "down")
	HotKeySet("{UP}", "up")
	$picPos = WinGetPos($pic)
	$guiPos = WinGetPos($gui)

	Do
		$msg = GUIGetMsg()
	Until $msg = $GUI_EVENT_CLOSE
EndFunc   ;==>Example2

Func main()
	$guiPos = WinGetPos($gui)
	WinMove($gui, "", $guiPos[0] + 10, $guiPos[1] + 10)
EndFunc   ;==>main

Func left()
	$picPos = WinGetPos($pic)
	WinMove($pic, "", $picPos[0] - 10, $picPos[1])
EndFunc   ;==>left

Func right()
	$picPos = WinGetPos($pic)
	WinMove($pic, "", $picPos[0] + 10, $picPos[1])
EndFunc   ;==>right

Func down()
	$picPos = WinGetPos($pic)
	WinMove($pic, "", $picPos[0], $picPos[1] + 10)
EndFunc   ;==>down

Func up()
	$picPos = WinGetPos($pic)
	WinMove($pic, "", $picPos[0], $picPos[1] - 10)
EndFunc   ;==>up

Func _Event()
    ConsoleWrite("Clicked" & @CRLF)
EndFunc


но не ловится клик на merlin.gif.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Не ловится потому, что режим прорисовки GUI - Message LoopBack
В то время, как GUICtrlSetEvent работает только в режиме OnEvent
И то и другое смотри в хелпе - GUI Concepts
А по поводу клика, могу посоветовать либо перейти все же в режим OnEvent либо в режиме LoopBack сделать Case с ctrlID от картинки. Нажатие на картинку и будет возвращено при GUIGetMsg. Например, так
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Opt('MustDeclareVars', 1)

Global $gui, $guiPos, $pic, $picPos, $picctrl

Example2()

;----- example 2
Func Example2()
    Local $msg
   
    $gui = GUICreate("test transparentpic", 200, 100)
    $pic = GUICreate("", 68, 71, 10, 10, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_MDICHILD), $gui)
    $picctrl = GUICtrlCreatePic(@SystemDir & "\oobe\images\merlin.gif", 0, 0, 0, 0)


    GUISetState(@SW_SHOW, $pic)
    GUISetState(@SW_SHOW, $gui)

    HotKeySet("{ESC}", "main")
    HotKeySet("{LEFT}", "left")
    HotKeySet("{RIGHT}", "right")
    HotKeySet("{DOWN}", "down")
    HotKeySet("{UP}", "up")
    $picPos = WinGetPos($pic)
    $guiPos = WinGetPos($gui)


	While 1
		$msg = GUIGetMsg()
		Switch $msg
			Case $picctrl
				_Event()
			Case $GUI_EVENT_CLOSE
				ExitLoop
		EndSwitch
	WEnd
EndFunc   ;==>Example2

Func main()
    $guiPos = WinGetPos($gui)
    WinMove($gui, "", $guiPos[0] + 10, $guiPos[1] + 10)
EndFunc   ;==>main

Func left()
    $picPos = WinGetPos($pic)
    WinMove($pic, "", $picPos[0] - 10, $picPos[1])
EndFunc   ;==>left

Func right()
    $picPos = WinGetPos($pic)
    WinMove($pic, "", $picPos[0] + 10, $picPos[1])
EndFunc   ;==>right

Func down()
    $picPos = WinGetPos($pic)
    WinMove($pic, "", $picPos[0], $picPos[1] + 10)
EndFunc   ;==>down

Func up()
    $picPos = WinGetPos($pic)
    WinMove($pic, "", $picPos[0], $picPos[1] - 10)
EndFunc   ;==>up

Func _Event()
    ConsoleWrite("Clicked" & @CRLF)
EndFunc
 
Автор
W

w3d

Новичок
Сообщения
84
Репутация
3
Если я добавляю в начале
Код:
Opt("GUIOnEventMode", 1)

то все начинает работать за исключением того, что окно $gui не реагирует на кнопку "закрыть" (крестик).
что тут не так делается?


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

Добавил
Код:
$gui = GUICreate("test transparentpic", 200, 100)
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSE")

все заработало.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
тема таки решена? :smile:
 
Верх