Что нового

Как заполнять прогресс без анимации? мгновенно?

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Я использую такую конструкцию для заполнения прогресса:
Код:
GUICtrlSetData($Progress_4, Floor($current * 100 / $maximum))

Каждый раз я передаю текущее значение и максимальное. Но заполняться шкала начинает с анимацией, "медленно" слева направо, и прогресс вместо равномерного заполнения - дергается.
Что я делаю не так и как побороть?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
inververs,
Можно примерно так попробовать.
Код:
#include <GUIConstantsEx.au3>

Global $hGui, $iPB, $iTimer, $iLbl, $iRnd

$hGui = GUICreate('ProgressBar', 220, 100, 100, 200)
$iPB = GUICtrlCreateProgress(10, 10, 200, 10)
DllCall('UxTheme.dll', 'uint', 'SetWindowTheme', 'hwnd', GUICtrlGetHandle($iPB), 'wstr', '', 'wstr', '')
GUICtrlSetColor($iPB, 0xFF0000)
GUICtrlSetBkColor($iPB, 0xE0DFE3)
$iLbl = GUICtrlCreateLabel('0%', 10, 40, 100, 20)
GUISetState()

While 1
	If TimerDiff($iTimer) > 2000 Then
		$iRnd = Random(0, 100, 1)
		GUICtrlSetData($iPB, $iRnd)
		GUICtrlSetData($iLbl, $iRnd & '%')
		$iTimer = TimerInit()
	EndIf
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
WEnd
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Вот это хорошо. Все решение в одной строчке DllCall('UxTheme.dll', 'uint', 'SetWindowTheme', 'hwnd', GUICtrlGetHandle($iPB), 'wstr', '', 'wstr', '')?
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Спасибо, а как отменить DllCall и вернуть по умолчанию?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
inververs [?]
а как отменить DllCall и вернуть по умолчанию?
Лень искать на MSDN. :smile:
Код:
#include <GUIConstantsEx.au3>

Global $hGui, $iPB, $iTimer, $iLbl, $iRnd, $iBtn, $fTheme

$hGui = GUICreate('ProgressBar', 220, 100, 100, 200)
$iPB = GUICtrlCreateProgress(10, 10, 200, 10)
DllCall('UxTheme.dll', 'uint', 'SetWindowTheme', 'hwnd', GUICtrlGetHandle($iPB), 'wstr', '', 'wstr', '')
GUICtrlSetColor($iPB, 0xFF0000)
GUICtrlSetBkColor($iPB, 0xE0DFE3)
$iLbl = GUICtrlCreateLabel('0%', 10, 30, 100, 20)
$iBtn = GUICtrlCreateButton('Click me', 60, 60, 100, 30)
GUISetState()

While 1
	If TimerDiff($iTimer) > 2000 Then
		$iRnd = Random(0, 100, 1)
		GUICtrlSetData($iPB, $iRnd)
		GUICtrlSetData($iLbl, $iRnd & '%')
		$iTimer = TimerInit()
	EndIf
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $iBtn
			$fTheme = Not $fTheme
			If $fTheme Then
				GUICtrlDelete($iPB)
				$iPB = GUICtrlCreateProgress(10, 10, 200, 10)
			Else
				DllCall('UxTheme.dll', 'uint', 'SetWindowTheme', 'hwnd', GUICtrlGetHandle($iPB), 'wstr', '', 'wstr', '')
				GUICtrlSetColor($iPB, 0xFF0000)
				GUICtrlSetBkColor($iPB, 0xE0DFE3)
			EndIf
	EndSwitch
WEnd
 

Yashied

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

Код:
#Include <GUIConstantsEx.au3>

GUICreate('MyGUI', 400, 134)
$Progress1 = GUICtrlCreateProgress(10, 35, 380, 30)
$Progress2 = GUICtrlCreateProgress(10, 35, 380, 30)
GUICtrlSetState(-1, $GUI_HIDE)
GUICtrlSetData(-1, 100)
$Button = GUICtrlCreateButton('Test', 165, 86, 80, 27)
GUISetState()

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button
			For $i = 20 To 100 Step 20
				If $i < 100 Then
					GUICtrlSetData($Progress1, $i + 1)
					GUICtrlSetData($Progress1, $i)
				Else
					GUICtrlSetState($Progress2, $GUI_SHOW)
					GUICtrlSetState($Progress1, $GUI_HIDE)
					GUICtrlSetData($Progress1, 100)
					_Swap($Progress1, $Progress2)
				EndIf
				Sleep(50)
			Next
	EndSwitch
WEnd

Func _Swap(ByRef $iNum1, ByRef $iNum2)
	Local $Temp = $iNum1
	$iNum1 = $iNum2
	$iNum2 = $Temp
EndFunc   ;==>_Swap
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
inververs [?]
Спасибо, а как отменить DllCall и вернуть по умолчанию?
Как вариант - получить тему по умолчанию ( до ее сброса ).

http://msdn.microsoft.com/en-us/library/windows/desktop/ff486120(v=vs.85).aspx
Код:
GetThemeString
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Есть решение получше
Код:
GUICtrlSendMsg($Progress1, $PBM_DELTAPOS, $delta, 0)




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

Нет, все равно не успевает показывать если быстро обновлять.
 
Верх