Что нового

[Элементы GUI] Нажатие наведением на Эллипс (Круг) Graphic

GUIMish

Знающий
Сообщения
122
Репутация
12
Здравствуйте, я столкнулся вот с такой проблемой:
У меня, два Эллипса пересекающиеся друг с другом, я решил что когда наводишь на $uGraphic1, выскакивает MsgBox, но $uGraphic2, занимает территорию не круга, а квадрата, если это возможно исправить, не подскажите? заранее благодарю!

Код:
#include <GUIConstantsEx.au3>
#Include <WindowsConstants.au3>
#include <WinAPIGdi.au3>
#include <WinAPIEx.au3>

$Window = GUICreate("Окно", 150, 100, -1, -1)

$uGraphic1 = GUICtrlCreateGraphic(10, 10, 100, 100) ; сегменты
    GUICtrlSetGraphic(-1, $GUI_GR_COLOR, 0x00ff00, 0x00ff00)
    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($uGraphic1), $hRgn)

$uGraphic2 = GUICtrlCreateGraphic(50, 10, 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($uGraphic2), $hRgn)

GUISetState()
While 1
	$CurInfo = GUIGetCursorInfo()
    If IsArray($CurInfo) Then
        If $CurInfo[4] = $uGraphic1 Then
            MsgBox(0, "", "Нажат Graphic1")
        EndIf
    EndIf
    Switch GUIGetMsg()
        Case -3
            Exit
   EndSwitch
WEnd
 

Z_Lenar

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

$Window = GUICreate("Окно", 150, 100, -1, -1)

$uGraphic1 = GUICtrlCreateGraphic(10, 10, 100, 100) ; сегменты
    GUICtrlSetGraphic(-1, $GUI_GR_COLOR, 0x00ff00, 0x00ff00)
    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)
$hRgn1 = _WinAPI_CreateEllipticRgn($tRect)
_WinAPI_SetWindowRgn(GUICtrlGetHandle($uGraphic1), $hRgn1)
_WinAPI_DeleteObject($hRgn1)

$uGraphic2 = GUICtrlCreateGraphic(50, 10, 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)
$hRgn2 = _WinAPI_CreateEllipticRgn($tRect)
_WinAPI_SetWindowRgn(GUICtrlGetHandle($uGraphic2), $hRgn2)
_WinAPI_DeleteObject($hRgn2)

GUISetState()
While 1
	$nMsg = GUIGetMsg()

    Switch $nMsg
		Case $GUI_EVENT_MOUSEMOVE
			$tPoint = _WinAPI_GetMousePos(True, $Window)
			If _WinAPI_ChildWindowFromPointEx($Window, $tPoint) = GUICtrlGetHandle($uGraphic1) Then
				MsgBox(0, 'Pos', 'Cursor at $uGraphic1')
			EndIf
        Case -3
            Exit
   EndSwitch
WEnd
 
Верх