Что нового

Нажатие на Эллипс (Круг) Graphic

GUIMish

Знающий
Сообщения
122
Репутация
12
Здравствуйте, как бы мне реализовать нажатие на Эллипс(Круг), а то у меня чего-то получается нажать на область квадрата.
Код:
#include <GUIConstantsEx.au3>

$Window = GUICreate("Окно", 656, 500, -1, -1)

$uGraphic = GUICtrlCreateGraphic(20, 100, 100, 100) ; сегменты
    GUICtrlSetGraphic(-1, $GUI_GR_COLOR, 0xff0000, 0xff0000)
    GUICtrlSetGraphic(-1, $GUI_GR_ELLIPSE, 0, 0, 80, 80) ; эллипс


GUISetState()
While 1
	Switch GUIGetMsg()
		Case -3
			Exit
		Case $uGraphic
			MsgBox(0, "", "Нажат Graphic")
   EndSwitch
WEnd
 

Z_Lenar

Продвинутый
Сообщения
209
Репутация
52
Код:
#include <GUIConstantsEx.au3>
#include <WinAPIGdi.au3>
#include <WinAPI.au3>

$Window = GUICreate("Окно", 656, 500, -1, -1)

$uGraphic = GUICtrlCreateGraphic(20, 100, 100, 100) ; сегменты
    GUICtrlSetGraphic(-1, $GUI_GR_COLOR, 0xff0000, 0xff0000)
    GUICtrlSetGraphic(-1, $GUI_GR_ELLIPSE, 0, 0, 80, 80) ; эллипс
$tRect = DllStructCreate($tagRect)
DllStructSetData($tRect, 1, 0)
DllStructSetData($tRect, 2, 0)
DllStructSetData($tRect, 3, 80)
DllStructSetData($tRect, 4, 80)
$hRgn = _WinAPI_CreateEllipticRgn($tRect)
_WinAPI_SetWindowRgn(GUICtrlGetHandle($uGraphic), $hRgn)
_WinAPI_DeleteObject($hRgn)


GUISetState()
While 1
    Switch GUIGetMsg()
        Case -3
            Exit
        Case $uGraphic
            MsgBox(0, "", "Нажат Graphic")
   EndSwitch
WEnd


Исправил. После сообщения от madmasles
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Z_Lenar,
Надо бы в конце добавить
Код:
_WinAPI_DeleteObject($hRgn)


Мой вариант (такой же, как у Z_Lenar`а, только функция создания региона другая).
Код:
#include <GUIConstantsEx.au3>
#include <WinAPI.au3>

$hGui = GUICreate('Окно', 300, 300)

$iGraphic = GUICtrlCreateGraphic(20, 100, 100, 100) ; сегменты
GUICtrlSetGraphic(-1, $GUI_GR_COLOR, 0xff0000, 0xff0000)
GUICtrlSetGraphic(-1, $GUI_GR_ELLIPSE, 0, 0, 80, 80) ; эллипс
$hRgn = _CreateEllipticRgn(0, 0, 80, 80)
_WinAPI_SetWindowRgn(GUICtrlGetHandle($iGraphic), $hRgn)

GUISetState()
While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			_WinAPI_DeleteObject($hRgn)
			Exit
		Case $iGraphic
			MsgBox(64, 'Info', 'Нажат Graphic', 0, $hGui)
	EndSwitch
WEnd

Func _CreateEllipticRgn($iLeft, $iTop, $iRight, $iBottom)
;~ 	http://msdn.microsoft.com/en-us/library/dd183496(v=vs.85).aspx
;~ почему-то этой функции нет в библиотеках
	Local $aRet = DllCall('gdi32.dll', 'ptr', 'CreateEllipticRgn', 'int', $iLeft, 'int', $iTop, 'int', $iRight, 'int', $iBottom)
	If (@error) Or (Not $aRet[0]) Then Return SetError(1, 0, 0)
	Return $aRet[0]
EndFunc   ;==>_CreateEllipticRgn
 
Верх