Что нового

Проблемы с воспроизведением gif анимации в GUI при помощи GIFAnimation.au3

ramzesranec

Новичок
Сообщения
4
Репутация
0
Код:
Func SomeFunc($sFileSet)
   Local $aGIFSet = [0], $msg
   Local $hGUI = GUICreate("Click to delete", 0, 310, 0, -1)
   Local $aFileSet = StringSplit($sFileSet, ';')

   For $i = 1 To $aFileSet[0]
	  $aGIFSet[0] = $i
	  ReDim $aGIFSet[$i+1]
	  $aGIFSet[$i] = _GUICtrlCreateGIF($aFileSet[$i], "", 305*$i-300, 5, 300, 300)
	  GUICtrlSetTip($aGIFSet[$i], $aFileSet[$i])
   Next

   For $i = 1 To $aGIFSet[0]
	  _GIF_PauseAnimation($aGIFSet[$i])
	  _GIF_RefreshGIF($aGIFSet[$i])
   Next

   ;For $i = 1 To $aGIFSet[0]
   ;   _GIF_ResumeAnimation($aGIFSet[$i])
   ;Next

   WinMove($hGUI, Default, Default, Default, 305*$aFileSet[0]+11)
   GUISetState()

   Local $GIFcount = $aGIFSet[0]

   While $GIFcount > 1
	  $msg = GUIGetMsg()
	  If $msg = -3 Then ExitLoop
	  For $i = 1 To $aGIFSet[0]
		 If $msg = $aGIFSet[$i] Then
			Switch MsgBox(1, 'Confirmation', 'Are you sure you want to delete this file?')
			Case 1
			   $GIFcount -= 1
			   _GIF_DeleteGIF($aGIFSet[$i])
			   FileDelete($aFileSet[$i])
			EndSwitch
		 EndIf
	  Next
   WEnd

   GUIDelete($hGUI)
EndFunc


При первом вызове SomeFunc все гифки стопаются и рефрешатся, но при следующих вызовах (другой набор гиф файлов, новое окно гуи) гифки проигрываются. Не могу понять причину.
Далее, если раскомментить строки с продолжением воспроизведения (или закомментить паузу с рефрешем), гифки проигрываются не одновременно, а нужно, чтобы одновременно. Как правило, в окне гуи находится минимум 2 гифки. Помогите разобраться с проблемой.
 

joiner

Модератор
Локальный модератор
Сообщения
3 338
Репутация
571
Код:
Func SomeFunc($sFileSet)
	Local $aGIFSet = [0], $msg
	Local $hGUI = GUICreate("Click to delete", 200, 200, 300, 300)
	Local $aFileSet = StringSplit($sFileSet, ';')
	WinMove($hGUI, '', Default, Default, 305 * $aFileSet[0] + 11)
	For $i = 1 To $aFileSet[0]
		$aGIFSet[0] = $i
		ReDim $aGIFSet[$i + 1]
		$aGIFSet[$i] = _GUICtrlCreateGIF($aFileSet[$i], "", 305 * $i - 300, 5, 100, 100)
		_GIF_PauseAnimation($aGIFSet[$i])
		GUICtrlSetTip($aGIFSet[$i], $aFileSet[$i])
	Next
	For $i = 1 To $aGIFSet[0]
		_GIF_ResumeAnimation($aGIFSet[$i])
	Next
	GUISetState()

	Local $GIFcount = $aGIFSet[0]

	While $GIFcount > 1
		$msg = GUIGetMsg()
		If $msg = -3 Then ExitLoop
		For $i = 1 To $aGIFSet[0]
			If $msg = $aGIFSet[$i] Then
				Switch MsgBox(1, 'Confirmation', 'Are you sure you want to delete this file?')
					Case 1
						$GIFcount -= 1
						_GIF_DeleteGIF($aGIFSet[$i])
;~                FileDelete($aFileSet[$i])
				EndSwitch
			EndIf
		Next
	WEnd

	GUIDelete($hGUI)
EndFunc   ;==>SomeFunc
 
Автор
R

ramzesranec

Новичок
Сообщения
4
Репутация
0
К сожалению, но ваш вариант мне не помог ни по одному пункту((
К тому же, хотелось бы еще услышать причину, по которой все работает не так, как мне бы хотелось.
 

joiner

Модератор
Локальный модератор
Сообщения
3 338
Репутация
571
Я б не выкладывал код, если бы у меня не работал. Устанавливал несколько гифок. Все воспроизводятся одновременно. Рефрешаться в смысле мигают?
 
Автор
R

ramzesranec

Новичок
Сообщения
4
Репутация
0
У вас код от моего не отличается практически ничем, все то же, что и у меня. На некоторых гифках отставание в кадрах еле заметно, на других отставание очень большое. Возможно, это связано с количеством кадров в гифке и\или в размере кадров. Компьютер у меня относительно мощный, win7.
Рефреш - я имел в виду функцию _GIF_RefreshGIF(), насколько я понимаю, она сбрасывает гифку на 1 кадр.

Я правильно понял, что у вас мой код не работает как надо, а ваш работает? В чем же дело, если у меня разницы нет вообще? Даже количество инструкций одинаковое, время исполнения тоже. Изначально мой код выглядел точно так же, как и у вас, только WinMove() был после цикла. Я думал, что из-за цикла гифки паузятся на разных кадрах, поэтому решил паузу вынести в отдельный чистый цикл, чтобы ничего не мешало, но все без толку.

Основная задача - найти причину того, почему гифки рассинхронизированы (если убрать паузу из кода вначале топика), потом надо разобраться, почему, если гифки поставить на паузу в коде, то при втором вызове функции гифки снова пляшут.


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

Заметил одну интересную вещь, гифки работают как надо только в первом окне гуи (при первом вызове), а дальше облом.


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

Частично решил проблему, освободив память от гифок после закрытия окна GUI. В первом окне идет теперь рассинхрон, зато в следующих уже все гифки проигрываются одновременно. Бывает, если гифок много или они много весят, то программа зависает :(

Код:
Func SomeFunc($sFileSet)
   Local $aGIFSet = [0], $msg
   Local $hGUI = GUICreate("Click to delete", 0, 310, 0, -1)
   Local $aFileSet = StringSplit($sFileSet, ';')

   WinMove($hGUI, '', Default, Default, 305*$aFileSet[0]+11)

   For $i = 1 To $aFileSet[0]
	  $aGIFSet[0] = $i
	  ReDim $aGIFSet[$i+1]
	  $aGIFSet[$i] = _GUICtrlCreateGIF($aFileSet[$i], "", 305*$i-300, 5, 300, 300)
	  _GIF_PauseAnimation($aGIFSet[$i])
	  GUICtrlSetTip($aGIFSet[$i], $aFileSet[$i])
   Next

   GUISetState()

   For $i = 1 To $aGIFSet[0]
	  _GIF_ResumeAnimation($aGIFSet[$i])
   Next

   Local $GIFcount = $aGIFSet[0]

   While $GIFcount > 1
	  $msg = GUIGetMsg()
	  If $msg = -3 Then ExitLoop
	  For $i = 1 To $aGIFSet[0]
		 If $msg = $aGIFSet[$i] Then
			Switch MsgBox(1, 'Confirmation', 'Are you sure you want to delete this file?')
			Case 1
			   $GIFcount -= 1
			   _GIF_DeleteGIF($aGIFSet[$i])
			   FileDelete($aFileSet[$i])
			EndSwitch
		 EndIf
	  Next
   WEnd

   GUIDelete($hGUI)

   For $i = 1 To $aGIFSet[0]
	  _GIF_DeleteGIF($aGIFSet[$i])
   Next
EndFunc
 
Верх