Что нового

Жесты мышкой, помогите настроить функцию

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
Дизайнер из меня никакой :whistle:, да и Gimp-ом очень редко пользуюсь.
Вот для 8 позиций - сделал по примеру пульта для телевизора :D перерисуй под себя
Код:
#Include <GDIPlus.au3>
#Include <Misc.au3>
#Include <WinAPIEx.au3>
#Include <WindowsConstants.au3>

$hCursor = _WinAPI_CopyCursor(_WinAPI_LoadCursor(0, 32512))

_GDIPlus_Startup()
$hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & '\Sectorz.png')
$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
_GDIPlus_ImageDispose($hImage)
$hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & '\Sectorz1.png')
$hBitmap1 = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
_GDIPlus_ImageDispose($hImage)
$hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & '\Sectorz2.png')
$hBitmap2 = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
_GDIPlus_ImageDispose($hImage)
$hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & '\Sectorz3.png')
$hBitmap3 = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
_GDIPlus_ImageDispose($hImage)
$hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & '\Sectorz4.png')
$hBitmap4 = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
_GDIPlus_ImageDispose($hImage)
$hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & '\Sectorz5.png')
$hBitmap5 = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
_GDIPlus_ImageDispose($hImage)
$hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & '\Sectorz6.png')
$hBitmap6 = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
_GDIPlus_ImageDispose($hImage)
$hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & '\Sectorz7.png')
$hBitmap7 = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
_GDIPlus_ImageDispose($hImage)
$hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & '\Sectorz8.png')
$hBitmap8 = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
_GDIPlus_ImageDispose($hImage)
_GDIPlus_Shutdown()
$hForm = GUICreate('', 300, 300, -1, -1, $WS_POPUPWINDOW, BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST), GUICreate('', -1, -1, -1, -1, -1, $WS_EX_TOOLWINDOW))

$Index = 1

While 1
    Sleep(100)
    If _IsPressed('04') Then
        $XY = MouseGetPos()
        WinMove($hForm, '', $XY[0] - 40, $XY[1] - 40)
        GUISetState(@SW_SHOW, $hForm)
        For $i = 5 To 125 Step 5
            _WinAPI_UpdateLayeredWindowEx($hForm, $hBitmap, $i)
            $Timer = TimerInit()
            While Not Floor(TimerDiff($Timer))
                ; Задержка 1 мс
            WEnd
        Next
        _WinAPI_SetSystemCursor(_WinAPI_LoadCursor(0, 32649), 32512, 1)
        While _IsPressed('04')
            $Pos = MouseGetPos()
            $Ang = _Angle($Pos[0], $Pos[1], $XY[0], $XY[1]) ; Угол относительно 11:15 (часов:минут) по часовой стрелке (в градусах)
            $R = Sqrt(($XY[0] - $Pos[0]) ^ 2 + ($XY[1] - $Pos[1]) ^ 2) ; Удаление (радиус) от центра
            If $R > 40 Then ; Если курсор выходит за пределы окружности, радиус = 40
                MouseMove($XY[0] + 40 * Sin($Ang * ATan(1) / 45), $XY[1] - 40 * Cos($Ang * ATan(1) / 45), 0)
            EndIf
			If $R > 20 Then
				Select
					Case ($Ang >= 22.5 ) And ($Ang < 67.5 )
						_WinAPI_UpdateLayeredWindowEx($hForm, $hBitmap2, 255)
						ToolTip('Функция 2')
						$Index = 2
					Case ($Ang >= 67.5 ) And ($Ang < 112.5)
						_WinAPI_UpdateLayeredWindowEx($hForm, $hBitmap3, 255)
						ToolTip('Функция 3')
						$Index = 3
					Case ($Ang >= 112.5) And ($Ang < 157.5)
						_WinAPI_UpdateLayeredWindowEx($hForm, $hBitmap4, 255)
						ToolTip('Функция 4')
						$Index = 4
					Case ($Ang >= 157.5 ) And ($Ang < 202.5 )
						_WinAPI_UpdateLayeredWindowEx($hForm, $hBitmap5, 255)
						ToolTip('Функция 5')
						$Index = 2
					Case ($Ang >= 202.5 ) And ($Ang < 247.5)
						_WinAPI_UpdateLayeredWindowEx($hForm, $hBitmap6, 255)
						ToolTip('Функция 6')
						$Index = 3
					Case ($Ang >= 247.5) And ($Ang < 292.5)
						_WinAPI_UpdateLayeredWindowEx($hForm, $hBitmap7, 255)
						ToolTip('Функция 7')
						$Index = 4
					Case ($Ang >= 292.5) And ($Ang < 337.5)
						_WinAPI_UpdateLayeredWindowEx($hForm, $hBitmap8, 255)
						ToolTip('Функция 8')
						$Index = 4
					Case Else
						_WinAPI_UpdateLayeredWindowEx($hForm, $hBitmap1, 255)
						ToolTip('Функция 1')
						$Index = 1
				EndSelect
			Else
				$Index = 0
				_WinAPI_UpdateLayeredWindowEx($hForm, $hBitmap, 125)
				ToolTip('')
			EndIf
			Sleep(1)
        WEnd
        _WinAPI_SetSystemCursor($hCursor, 32512, 1)
        ToolTip('')
        For $i = 125 To 0 Step -5
            _WinAPI_UpdateLayeredWindowEx($hForm, $hBitmap, $i)
            $Timer = TimerInit()
            While Not Floor(TimerDiff($Timer))
                ; Задержка 1 мс
            WEnd
        Next
        GUISetState(@SW_HIDE, $hForm)
        ConsoleWrite('Функция ' & $Index & '...' & @CR)
    EndIf
WEnd

Func _Angle($X, $Y, $XC, $YC)
    If ($X = $XC) And ($Y = $YC) Then
        Return 0
    Else
        Return Mod(360 + ($Y > $YC) * 180 - ATan(($XC - $X) / ($YC - $Y)) * 45 / ATan(1), 360)
    EndIf
EndFunc   ;==>_Angle
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Размер и код - что надо. Ждем дизайнера :smile:

Попробую в ворде нарисовать. Там есть фигуры настраиваемые.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Сделайте что-нибудь на подобии этого, т.к. надписи в 45 градусах особо не поместятся или круг будет слишком большой.

P.S

А какое разнообразие для анимации появления/исчезновения круга... Можно сделать появление с поворотом вокруг центра + изменение прозрачность, или разлет секторов в разные стороны.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Вот мой вариант в стиле iKey. AutoIt скрипт и все необходимые изображения, включая .psd, в архиве. Так же сделал прикольное появление меню...

Код:
#Include <GDIPlus.au3>
#Include <Misc.au3>
#Include <WinAPIEx.au3>
#Include <WindowsConstants.au3>

Opt('WinWaitDelay', 0)

_GDIPlus_Startup()

$hHand = _WinAPI_LoadCursorFromFile(@ScriptDir & '\Arrow.cur')
$hPrev = _WinAPI_CopyCursor(_WinAPI_LoadCursor(0, 32512))

Dim $hImage[9][2]
For $i = 0 To 8
	$hImage[$i][0] = _GDIPlus_ImageLoadFromFile(StringFormat(@ScriptDir & '\%02d.png', $i))
	$hImage[$i][1] = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage[$i][0])
Next

$hForm = GUICreate('', 190, 190, -1, -1, $WS_POPUPWINDOW, BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST), GUICreate('', -1, -1, -1, -1, -1, $WS_EX_TOOLWINDOW))

$Index = 0
$Prev = 0

While 1
	Sleep(100)
	If _IsPressed('04') Then
		$XY = MouseGetPos()
		GUISetState(@SW_SHOW, $hForm)
		For $i = 5 To 255 Step 5
			WinMove($hForm, '', $XY[0] - 95 * $i / 255, $XY[1] - 95 * $i / 255, 190 * $i / 255, 190 * $i / 255)
			$hPng = _GDIPlus_ImageGetThumbnail($hImage[0][0], 190 * $i / 255, 190 * $i / 255)
			_WinAPI_UpdateLayeredWindowEx($hForm, _GDIPlus_BitmapCreateHBITMAPFromBitmap($hPng), $i, 1)
			_GDIPlus_ImageDispose($hPng)
;			_Sleep(1)
		Next
;		WinMove($hForm, '', $XY[0] - 95, $XY[1] - 95, 190, 190)
;		For $i = 5 To 255 Step 5
;			_WinAPI_UpdateLayeredWindowEx($hForm, $hImage[0][1], $i)
;			_Sleep(1)
;		Next
		_WinAPI_SetSystemCursor($hHand, 32512, 1)
		While _IsPressed('04')
			$Pos = MouseGetPos()
			$R = Sqrt(($XY[0] - $Pos[0]) ^ 2 + ($XY[1] - $Pos[1]) ^ 2)
			If ($R < 47) Or ($R > 95) Then
				$Index = 0
			Else
				$Ang = _Angle($Pos[0], $Pos[1], $XY[0], $XY[1])
				Select
					Case ($Ang >= 0  ) And ($Ang < 45 )
						$Index = 1
					Case ($Ang >= 45 ) And ($Ang < 90 )
						$Index = 2
					Case ($Ang >= 90 ) And ($Ang < 135)
						$Index = 3
					Case ($Ang >= 135) And ($Ang < 180)
						$Index = 4
					Case ($Ang >= 180) And ($Ang < 225)
						$Index = 5
					Case ($Ang >= 225) And ($Ang < 270)
						$Index = 6
					Case ($Ang >= 270) And ($Ang < 315)
						$Index = 7
					Case Else
						$Index = 8
				EndSelect
			EndIf
			If $Prev <> $Index Then
				_WinAPI_UpdateLayeredWindowEx($hForm, $hImage[$Index][1])
				$Prev = $Index
			EndIf
		WEnd
		_WinAPI_SetSystemCursor($hPrev, 32512, 1)
;		For $i = 250 To 0 Step -5
;			WinMove($hForm, '', $XY[0] - 95 * $i / 255, $XY[1] - 95 * $i / 255, 190 * $i / 255, 190 * $i / 255)
;			$hPng = _GDIPlus_ImageGetThumbnail($hImage[$Index][0], 190 * $i / 255, 190 * $i / 255)
;			_WinAPI_UpdateLayeredWindowEx($hForm, _GDIPlus_BitmapCreateHBITMAPFromBitmap($hPng), $i, 1)
;			_GDIPlus_ImageDispose($hPng)
;			_Sleep(1)
;		Next
		For $i = 250 To 0 Step -5
			_WinAPI_UpdateLayeredWindowEx($hForm, $hImage[$Index][1], $i)
			_Sleep(1)
		Next
		GUISetState(@SW_HIDE, $hForm)
		If $Index Then
			MsgBox(0, '', 'Функция ' & $Index & '...')
		EndIf
	EndIf
WEnd

Func _Angle($X, $Y, $XC, $YC)
	If ($X = $XC) And ($Y = $YC) Then
		Return 0
	Else
		Return Mod(360 + 22.5 + ($Y > $YC) * 180 - ATan(($XC - $X) / ($YC - $Y)) * 45 / ATan(1), 360)
	EndIf
EndFunc   ;==>_Angle

Func _Sleep($iDelay)

	Local $Timer = TimerInit()

	While TimerDiff($Timer) < $iDelay
	WEnd
EndFunc   ;==>_Sleep

Func _GDIPlus_ImageGetThumbnail($hImage, $iWidth, $iHeight)

	Local $aResult = DllCall($ghGDIPDll, 'uint', 'GdipGetImageThumbnail', 'ptr', $hImage, 'int', $iWidth, 'int', $iHeight, 'ptr*', 0, 'ptr', 0, 'ptr', 0)

	If @error Then
		Return SetError(@error, @extended, 0)
	EndIf
	Return $aResult[4]
EndFunc   ;==>_GDIPlus_ImageGetThumbnail


post_img_073.png
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Yashied
практически произведение искусства! :smile:

Один момент меня смущает. Надписи 1, 2, 3, 4 и т.д. недостаточно информативны. Т.е. пользователь не поймет, какая цифра какую функцию обозначает. Т.е. нужна какая-то всплывающая подсказка с именем функции при наведении на определенную кнопку.

Для своей программы я выписал функции в ini-файл в виде:

[ЖЕСТЫ МЫШКОЙ В ПРОГРАММЕ А]
; список доступных функций: здесь перечисляются различные функции, которые пользователь может назначить на жест.
включить жесты мышкой = да
север = функция 1
юг = функция 2
запад = функция 3
восток = функция 4
северо-запад = функция 5
северо-восток = функция 6
юго-запад = функция 7
юго-восток = функция 8

[ЖЕСТЫ МЫШКОЙ В ПРОГРАММЕ Б] (у меня в двух программах разные жесты мышкой)
...

При зажатии средней мышки отображается небольшая картинка с обозначением стрелок. Когда пользователь ведет в какую-либо сторону, возникает подсказка (ToolTip) с названием этой функции.

Пользователь в ini-файле может повесить на любой жест любую функцию.

+ хочу, чтобы на жест мышкой можно было повесить исполнения хоткея. Пользователь в ini прописывает хоткей, и этот хоткей сработает при данном жесте мышкой.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Yashied
Красиво!!!
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Suppir сказал(а):
Один момент меня смущает.

Suppir, я же не писал программу специально под твои условия, это просто пример. Специально для тебя, я выложил .psd, делай с ним, что хочешь (там все элементы в отдельных слоях). Я бы посоветовал тебе вместо цифр поставить небольшие иконки (лучше белые), а подсказки можно сделать в центре круга с помощью GDI+ функций, или так:

Код:
#Include <GDIPlus.au3>
#Include <Misc.au3>
#Include <WinAPIEx.au3>
#Include <WindowsConstants.au3>

Opt('WinWaitDelay', 0)

_GDIPlus_Startup()

$hHand = _WinAPI_LoadCursorFromFile(@ScriptDir & '\Arrow.cur')
$hPrev = _WinAPI_CopyCursor(_WinAPI_LoadCursor(0, 32512))

Dim $hImage[9][2]
For $i = 0 To 8
	$hImage[$i][0] = _GDIPlus_ImageLoadFromFile(StringFormat(@ScriptDir & '\%02d.png', $i))
	$hImage[$i][1] = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage[$i][0])
Next

$hForm = GUICreate('', 190, 190, -1, -1, $WS_POPUPWINDOW, BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST), GUICreate('', -1, -1, -1, -1, -1, $WS_EX_TOOLWINDOW))

Dim $Tip[2]

While 1
	Sleep(100)
	If _IsPressed('04') Then
		$XY = MouseGetPos()
		GUISetState(@SW_SHOW, $hForm)
		For $i = 5 To 255 Step 5
			WinMove($hForm, '', $XY[0] - 95 * $i / 255, $XY[1] - 95 * $i / 255, 190 * $i / 255, 190 * $i / 255)
			$hPng = _GDIPlus_ImageGetThumbnail($hImage[0][0], 190 * $i / 255, 190 * $i / 255)
			_WinAPI_UpdateLayeredWindowEx($hForm, _GDIPlus_BitmapCreateHBITMAPFromBitmap($hPng), $i, 1)
			_GDIPlus_ImageDispose($hPng)
;			_Sleep(1)
		Next
;		WinMove($hForm, '', $XY[0] - 95, $XY[1] - 95, 190, 190)
;		For $i = 5 To 255 Step 5
;			_WinAPI_UpdateLayeredWindowEx($hForm, $hImage[0][1], $i)
;			_Sleep(1)
;		Next
		$Timer = 0
		$Tip[0] = -1
		$Tip[1] = -1
		$Item = 0
		$Prev = 0
		_WinAPI_SetSystemCursor($hHand, 32512, 1)
		While _IsPressed('04')
			$Pos = MouseGetPos()
			$R = Sqrt(($XY[0] - $Pos[0]) ^ 2 + ($XY[1] - $Pos[1]) ^ 2)
			If ($R < 47) Or ($R > 95) Then
				$Item = 0
			Else
				$Ang = _Angle($Pos[0], $Pos[1], $XY[0], $XY[1])
				Select
					Case ($Ang >= 0  ) And ($Ang < 45 )
						$Item = 1
					Case ($Ang >= 45 ) And ($Ang < 90 )
						$Item = 2
					Case ($Ang >= 90 ) And ($Ang < 135)
						$Item = 3
					Case ($Ang >= 135) And ($Ang < 180)
						$Item = 4
					Case ($Ang >= 180) And ($Ang < 225)
						$Item = 5
					Case ($Ang >= 225) And ($Ang < 270)
						$Item = 6
					Case ($Ang >= 270) And ($Ang < 315)
						$Item = 7
					Case Else
						$Item = 8
				EndSelect
			EndIf
			If $Prev <> $Item Then
				_WinAPI_UpdateLayeredWindowEx($hForm, $hImage[$Item][1])
				$Prev = $Item
			EndIf
			If ($Pos[0] = $Tip[0]) And ($Pos[1] = $Tip[1]) Then
				If ($Item) And ($Timer) And (TimerDiff($Timer) > 500) Then
					ToolTip('Функция ' & $Item, $Pos[0] + 8, $Pos[1] + 22)
					$Timer = 0
				EndIf
			Else
				$Timer = TimerInit()
				$Tip[0] = $Pos[0]
				$Tip[1] = $Pos[1]
				ToolTip('')
			EndIf
		WEnd
		_WinAPI_SetSystemCursor($hPrev, 32512, 1)
		ToolTip('')
;		For $i = 250 To 0 Step -5
;			WinMove($hForm, '', $XY[0] - 95 * $i / 255, $XY[1] - 95 * $i / 255, 190 * $i / 255, 190 * $i / 255)
;			$hPng = _GDIPlus_ImageGetThumbnail($hImage[$Item][0], 190 * $i / 255, 190 * $i / 255)
;			_WinAPI_UpdateLayeredWindowEx($hForm, _GDIPlus_BitmapCreateHBITMAPFromBitmap($hPng), $i, 1)
;			_GDIPlus_ImageDispose($hPng)
;			_Sleep(1)
;		Next
		For $i = 250 To 0 Step -5
			_WinAPI_UpdateLayeredWindowEx($hForm, $hImage[$Item][1], $i)
			_Sleep(1)
		Next
		GUISetState(@SW_HIDE, $hForm)
		If $Item Then
			MsgBox(0, '', 'Функция ' & $Item & '...')
		EndIf
	EndIf
WEnd

Func _Angle($X, $Y, $XC, $YC)
	If ($X = $XC) And ($Y = $YC) Then
		Return 0
	Else
		Return Mod(360 + 22.5 + ($Y > $YC) * 180 - ATan(($XC - $X) / ($YC - $Y)) * 45 / ATan(1), 360)
	EndIf
EndFunc   ;==>_Angle

Func _Sleep($iDelay)

	Local $Timer = TimerInit()

	While TimerDiff($Timer) < $iDelay
	WEnd
EndFunc   ;==>_Sleep

Func _GDIPlus_ImageGetThumbnail($hImage, $iWidth, $iHeight)

	Local $aResult = DllCall($ghGDIPDll, 'uint', 'GdipGetImageThumbnail', 'ptr', $hImage, 'int', $iWidth, 'int', $iHeight, 'ptr*', 0, 'ptr', 0, 'ptr', 0)

	If @error Then
		Return SetError(@error, @extended, 0)
	EndIf
	Return $aResult[4]
EndFunc   ;==>_GDIPlus_ImageGetThumbnail
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Однозначно в полезняшки ;)
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Suppir, я немного изменил предыдущий пример. Теперь всплывающие подсказки ведут себя более "правильно".
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Имхо, пауза при появлении ToolTip лишняя.
Жесты мышкой призваны ускорить работу, а с этой паузой функциональность принесена в жертву правильности :smile:
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Suppir сказал(а):
Имхо, пауза при появлении ToolTip лишняя.

Подсказки, как правило, нужны на первые несколько вызовов, а далеее, они ох как раздражают... В любом случае, лучше придерживаться стандартного поведения Windows.
 

beve

Осваивающий
Сообщения
104
Репутация
31
Suppir [?]
Имхо, пауза при появлении ToolTip лишняя
По-моему, учитывая то что сдесь функций может быть не много, и их легко можно будет запомнить, то вспл.подсказка, при ненадобности, не будет мешать, а если нужно будет припомнить, то подождать чуточку дольше и все. Также, учитывая то что клик средней клавиши мыши может потребоваться в других приложениях, то можно просто в начало главного цикла, после If _IsPressed('04') Then добавить
Код:
$nCount=0
		While _IsPressed('04')
			$nCount+=1
			Sleep(10)
			if $nCount>15 then ExitLoop
		Wend
		if $nCount<15 then ContinueLoop

задержка должна быть чуточку дольше чем занимает обычный клик и отжатие кнопки...
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
beve [?]
Также, учитывая то что клик средней клавиши мыши может потребоваться в других приложениях


У меня в оригинале написано:

if _IsPressed('04') And WinActive("Программа А") Then ...
if _IsPressed('04') And WinActive("Программа Б") Then ...

т.е. жесты мышкой включены только для двух программ определенных.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Вот окончательный вариант с 4-я эффектами появления меню. Надеюсь кому-нибудь понравится.

Код:
#Include <GDIPlus.au3>
#Include <Misc.au3>
#Include <WinAPIEx.au3>
#Include <WindowsConstants.au3>

Opt('WinWaitDelay', 0)

_GDIPlus_Startup()

$hHand = _WinAPI_LoadCursorFromFile(@ScriptDir & '\Arrow.cur')
$hPrev = _WinAPI_CopyCursor(_WinAPI_LoadCursor(0, 32512))

Dim $hImage[9][2]
For $i = 0 To 8
	$hImage[$i][0] = _GDIPlus_ImageLoadFromFile(StringFormat(@ScriptDir & '\%02d.png', $i))
	$hImage[$i][1] = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage[$i][0])
Next

$hForm = GUICreate('', 190, 190, -1, -1, $WS_POPUPWINDOW, BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST), GUICreate('', -1, -1, -1, -1, -1, $WS_EX_TOOLWINDOW))

Dim $Tip[2]

While 1
	Sleep(100)
	If _IsPressed('04') Then
		$XY = MouseGetPos()
		GUISetState(@SW_SHOWNOACTIVATE, $hForm)

; Эффект 1

		WinMove($hForm, '', $XY[0] - 95, $XY[1] - 95, 190, 190)
		$hPng = _GDIPlus_ImageClone($hImage[0][0])
		$hGraphic = _GDIPlus_ImageGetGraphicsContext($hPng)
		For $i = 5 To 255 Step 5
			$Size = Round(190 * $i / 255)
			If Mod($Size, 2) Then
				$Size += 1
			EndIf
			_GDIPlus_GraphicsClear($hGraphic, 0)
			_GDIPlus_GraphicsDrawImageRect($hGraphic, $hImage[0][0], (190 - $Size) / 2, (190 - $Size) / 2, $Size, $Size)
			_WinAPI_UpdateLayeredWindowEx($hForm, _GDIPlus_BitmapCreateHBITMAPFromBitmap($hPng), $i, 1)
;			_Sleep(1)
		Next
		_WinAPI_UpdateLayeredWindowEx($hForm,  $hImage[0][1])
		_GDIPlus_GraphicsDispose($hGraphic)
		_GDIPlus_ImageDispose($hPng)

; Эффект 2

#cs
		WinMove($hForm, '', $XY[0] - 190, $XY[1] - 190, 380, 380)
		$hPng = _GDIPlus_ImageGetThumbnail($hImage[0][0], 380, 380)
		$hGraphic = _GDIPlus_ImageGetGraphicsContext($hPng)
		For $i = 5 To 255 Step 5
			$Size = Round(190 * (2 - $i / 255))
			If Mod($Size, 2) Then
				$Size += 1
			EndIf
			_GDIPlus_GraphicsClear($hGraphic, 0)
			_GDIPlus_GraphicsDrawImageRect($hGraphic, $hImage[0][0], (380 - $Size) / 2, (380 - $Size) / 2, $Size, $Size)
			_WinAPI_UpdateLayeredWindowEx($hForm, _GDIPlus_BitmapCreateHBITMAPFromBitmap($hPng), $i, 1)
;			_Sleep(1)
		Next
		_WinAPI_UpdateLayeredWindowEx($hForm,  $hImage[0][1], 0)
		WinMove($hForm, '', $XY[0] - 95, $XY[1] - 95, 190, 190)
		_WinAPI_UpdateLayeredWindowEx($hForm,  $hImage[0][1])
		_GDIPlus_GraphicsDispose($hGraphic)
		_GDIPlus_ImageDispose($hPng)
#ce

; Эффект 3

#cs
		WinMove($hForm, '', $XY[0] - 95, $XY[1] - 95, 190, 190)
		$hMatrix = _GDIPlus_MatrixCreate()
		$hPng = _GDIPlus_ImageClone($hImage[0][0])
		$hGraphic = _GDIPlus_ImageGetGraphicsContext($hPng)
		_GDIPlus_MatrixTranslate($hMatrix, 95, 95)
		For $i = 5 To 255 Step 5
			If $i = 5 Then
				_GDIPlus_MatrixRotate($hMatrix, -75)
			Else
				_GDIPlus_MatrixRotate($hMatrix, 1.5)
			EndIf
			_GDIPlus_GraphicsSetTransform($hGraphic, $hMatrix)
			_GDIPlus_GraphicsClear($hGraphic, 0)
			_GDIPlus_GraphicsDrawImageRect($hGraphic, $hImage[0][0], -95, -95, 190, 190)
			_WinAPI_UpdateLayeredWindowEx($hForm, _GDIPlus_BitmapCreateHBITMAPFromBitmap($hPng), $i, 1)
;			_Sleep(1)
		Next
		_WinAPI_UpdateLayeredWindowEx($hForm,  $hImage[0][1])
		_GDIPlus_GraphicsDispose($hGraphic)
		_GDIPlus_MatrixDispose($hMatrix)
		_GDIPlus_ImageDispose($hPng)
#ce

; Эффект 4

#cs
		WinMove($hForm, '', $XY[0] - 95, $XY[1] - 95, 190, 190)
		For $i = 5 To 255 Step 5
			_WinAPI_UpdateLayeredWindowEx($hForm, $hImage[0][1], $i)
			_Sleep(1)
		Next
#ce

; Эффект 5

#cs
		WinMove($hForm, '', $XY[0] - 95, $XY[1] - 95, 190, 190)
		$hMatrix = _GDIPlus_MatrixCreate()
		$hPng = _GDIPlus_ImageClone($hImage[0][0])
		$hGraphic = _GDIPlus_ImageGetGraphicsContext($hPng)
		_GDIPlus_MatrixTranslate($hMatrix, 95, 95)
		For $i = 5 To 255 Step 5
			$Size = Round(190 * $i / 255)
			If Mod($Size, 2) Then
				$Size += 1
			EndIf
			If $i = 5 Then
				_GDIPlus_MatrixRotate($hMatrix, -100)
			Else
				_GDIPlus_MatrixRotate($hMatrix, 2)
			EndIf
			_GDIPlus_GraphicsSetTransform($hGraphic, $hMatrix)
			_GDIPlus_GraphicsClear($hGraphic, 0)
			_GDIPlus_GraphicsDrawImageRect($hGraphic, $hImage[0][0], (190 - $Size) / 2 - 95, (190 - $Size) / 2 - 95, $Size, $Size)
			_WinAPI_UpdateLayeredWindowEx($hForm, _GDIPlus_BitmapCreateHBITMAPFromBitmap($hPng), $i, 1)
			_Sleep(1)
		Next
		_WinAPI_UpdateLayeredWindowEx($hForm,  $hImage[0][1])
		_GDIPlus_GraphicsDispose($hGraphic)
		_GDIPlus_MatrixDispose($hMatrix)
		_GDIPlus_ImageDispose($hPng)
#ce

		$Timer = 0
		$Tip[0] = -1
		$Tip[1] = -1
		$Item = 0
		$Prev = 0
		_WinAPI_SetSystemCursor($hHand, 32512, 1)
		While _IsPressed('04')
			$Pos = MouseGetPos()
			$R = Sqrt(($XY[0] - $Pos[0]) ^ 2 + ($XY[1] - $Pos[1]) ^ 2)
			If ($R < 47) Or ($R > 95) Then
				$Item = 0
			Else
				$Ang = _Angle($Pos[0], $Pos[1], $XY[0], $XY[1])
				Select
					Case ($Ang >= 0  ) And ($Ang < 45 )
						$Item = 1
					Case ($Ang >= 45 ) And ($Ang < 90 )
						$Item = 2
					Case ($Ang >= 90 ) And ($Ang < 135)
						$Item = 3
					Case ($Ang >= 135) And ($Ang < 180)
						$Item = 4
					Case ($Ang >= 180) And ($Ang < 225)
						$Item = 5
					Case ($Ang >= 225) And ($Ang < 270)
						$Item = 6
					Case ($Ang >= 270) And ($Ang < 315)
						$Item = 7
					Case Else
						$Item = 8
				EndSelect
			EndIf
			If $Prev <> $Item Then
				_WinAPI_UpdateLayeredWindowEx($hForm, $hImage[$Item][1])
				$Prev = $Item
			EndIf
			If ($Pos[0] = $Tip[0]) And ($Pos[1] = $Tip[1]) Then
				If ($Item) And ($Timer) And (TimerDiff($Timer) > 500) Then
					ToolTip('Функция ' & $Item, $Pos[0] + 8, $Pos[1] + 22)
					$Timer = 0
				EndIf
			Else
				$Timer = TimerInit()
				$Tip[0] = $Pos[0]
				$Tip[1] = $Pos[1]
				ToolTip('')
			EndIf
		WEnd
		_WinAPI_SetSystemCursor($hPrev, 32512, 1)
		ToolTip('')
		For $i = 250 To 0 Step -5
			_WinAPI_UpdateLayeredWindowEx($hForm, $hImage[$Item][1], $i)
			_Sleep(1)
		Next
		GUISetState(@SW_HIDE, $hForm)
		If $Item Then
			MsgBox(0, '', 'Функция ' & $Item & '...')
		EndIf
	EndIf
WEnd

Func _Angle($X, $Y, $XC, $YC)
	If ($X = $XC) And ($Y = $YC) Then
		Return 0
	Else
		Return Mod(360 + 22.5 + ($Y > $YC) * 180 - ATan(($XC - $X) / ($YC - $Y)) * 45 / ATan(1), 360)
	EndIf
EndFunc   ;==>_Angle

Func _Sleep($iDelay)

	Local $Timer = TimerInit()

	While TimerDiff($Timer) < $iDelay
	WEnd
EndFunc   ;==>_Sleep

#Region GDI+ Functions

Func _GDIPlus_ImageClone($hImage)

	Local $aResult = DllCall($ghGDIPDll, 'uint', 'GdipCloneImage', 'ptr', $hImage, 'ptr*', 0)

	If @error Then
		Return SetError(@error, @extended, 0)
	EndIf
	Return $aResult[2]
EndFunc   ;==>_GDIPlus_ImageClone

Func _GDIPlus_ImageGetThumbnail($hImage, $iWidth, $iHeight)

	Local $aResult = DllCall($ghGDIPDll, 'uint', 'GdipGetImageThumbnail', 'ptr', $hImage, 'int', $iWidth, 'int', $iHeight, 'ptr*', 0, 'ptr', 0, 'ptr', 0)

	If @error Then
		Return SetError(@error, @extended, 0)
	EndIf
	Return $aResult[4]
EndFunc   ;==>_GDIPlus_ImageGetThumbnail

#EndRegion GDI+ Functions
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
третий (поворот) и четвертый (простой) понравились :ok:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Yashied
Просто супер!
Мне больше всего понравился Эффект 3. :ok: :IL_AutoIt_1:
 

Viktor217

Осваивающий
Сообщения
233
Репутация
31
Очень красиво, если бы ещё совместить эфекты(=
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Viktor217 сказал(а):
...если бы ещё совместить эфекты.

Код:
WinMove($hForm, '', $XY[0] - 95, $XY[1] - 95, 190, 190)
$hMatrix = _GDIPlus_MatrixCreate()
$hPng = _GDIPlus_ImageClone($hImage[0][0])
$hGraphic = _GDIPlus_ImageGetGraphicsContext($hPng)
_GDIPlus_MatrixTranslate($hMatrix, 95, 95)
For $i = 5 To 255 Step 5
	$Size = Round(190 * $i / 255)
	If Mod($Size, 2) Then
		$Size += 1
	EndIf
	If $i = 5 Then
		_GDIPlus_MatrixRotate($hMatrix, -100)
	Else
		_GDIPlus_MatrixRotate($hMatrix, 2)
	EndIf
	_GDIPlus_GraphicsSetTransform($hGraphic, $hMatrix)
	_GDIPlus_GraphicsClear($hGraphic, 0)
	_GDIPlus_GraphicsDrawImageRect($hGraphic, $hImage[0][0], (190 - $Size) / 2 - 95, (190 - $Size) / 2 - 95, $Size, $Size)
	_WinAPI_UpdateLayeredWindowEx($hForm, _GDIPlus_BitmapCreateHBITMAPFromBitmap($hPng), $i, 1)
	_Sleep(1)
Next
_WinAPI_UpdateLayeredWindowEx($hForm, $hImage[0][1])
_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_MatrixDispose($hMatrix)
_GDIPlus_ImageDispose($hPng)
 

Viktor217

Осваивающий
Сообщения
233
Репутация
31
Спасибо, только немножко другое имел в виду(=
Сначала большой круг, потом он постепенно вращается и уменьшается...
В общем второй и третий эффект...
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Viktor217 сказал(а):
Сначала большой круг, потом он постепенно вращается и уменьшается...

Код:
WinMove($hForm, '', $XY[0] - 190, $XY[1] - 190, 380, 380)
$hMatrix = _GDIPlus_MatrixCreate()
$hPng = _GDIPlus_ImageGetThumbnail($hImage[0][0], 380, 380)
$hGraphic = _GDIPlus_ImageGetGraphicsContext($hPng)
_GDIPlus_MatrixTranslate($hMatrix, 190, 190)
For $i = 5 To 255 Step 5
	$Size = Round(190 * (2 - $i / 255))
	If Mod($Size, 2) Then
		$Size += 1
	EndIf
	If $i = 5 Then
		_GDIPlus_MatrixRotate($hMatrix, -100)
	Else
		_GDIPlus_MatrixRotate($hMatrix, 2)
	EndIf
	_GDIPlus_GraphicsSetTransform($hGraphic, $hMatrix)
	_GDIPlus_GraphicsClear($hGraphic, 0)
	_GDIPlus_GraphicsDrawImageRect($hGraphic, $hImage[0][0], (380 - $Size) / 2 - 190, (380 - $Size) / 2 - 190, $Size, $Size)
	_WinAPI_UpdateLayeredWindowEx($hForm, _GDIPlus_BitmapCreateHBITMAPFromBitmap($hPng), $i, 1)
	_Sleep(1)
Next
_WinAPI_UpdateLayeredWindowEx($hForm, $hImage[0][1], 0)
WinMove($hForm, '', $XY[0] - 95, $XY[1] - 95, 190, 190)
_WinAPI_UpdateLayeredWindowEx($hForm, $hImage[0][1])
_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_MatrixDispose($hMatrix)
_GDIPlus_ImageDispose($hPng)
 
Верх