Что нового

[Элементы GUI] ProgressBarEx.au3 (UDF для создания прогресс бара из текстур)

FlatX007

Tattoo!
Сообщения
174
Репутация
33
AutoIt: 3.3.6.0
Версия: 1.00

Категория: Элементы GUI, GDI+

Описание: UDF для создания прогресс бара из текстур, в комплекте со скриптом идёт 9 градиентных текстур.
Возможности: Создание "градиентных", как вертикальных так и горизонтальных прогресс баров, можно использовать свои текстуры.

Код / Простой пример №1:
Код:
#include <ProgressBarEx.au3>

_OptProgressBarEx()

Global $hProgesEx

$hGUI = GUICreate("ProgressBarEx", 800, 300, -1, -1, BitOR($WS_SIZEBOX, $WS_VISIBLE))
$hButton = GUICtrlCreateButton("Ок", 700, 235, 75, 25, 0)

$hProgesEx = _CreateProgressBarEx($hGUI, 10, 10, 10, 200, BitOR($PBEX_BORDER, $PBEX_GORIZONTAL))

While 1
    Switch GUIGetMsg()
        Case -3
            Exit

        Case $hButton
            For $i = 0 To 100
                Sleep(20)
				GUICtrlSetData($hButton, $i & " %")
                _ProgressSetEx($i, $hProgesEx, 5)
            Next
    EndSwitch
WEnd

Код / Пример №2:
Код:
#include <ProgressBarEx.au3>

_OptProgressBarEx()

Dim $aProgesEx[5]

$hGUI = GUICreate("ProgressBarEx", 800, 500, -1, -1, BitOR($WS_SIZEBOX, $WS_VISIBLE))
$hButton = GUICtrlCreateButton("Ок", 700, 425, 75, 25, 0)

$aProgesEx[0] = _CreateProgressBarEx($hGUI, 120, 10)
$aProgesEx[1] = _CreateProgressBarEx($hGUI, 120, 50, 45, 100, $PBEX_GORIZONTAL)
$aProgesEx[2] = _CreateProgressBarEx($hGUI, 120, 80, 180, 200, BitOR($PBEX_BORDER, $PBEX_GORIZONTAL))

$aProgesEx[3] = _CreateProgressBarEx($hGUI, 10, 10, 10, 30, BitOR($PBEX_BORDER, $PBEX_VERTICAL))
$aProgesEx[4] = _CreateProgressBarEx($hGUI, 10, 50, 70, 30, BitOR($PBEX_BORDER, $PBEX_VERTICAL))

While 1
	Switch GUIGetMsg()
		Case -3
			Exit

		Case $hButton
			For $i = 0 To 100
				Sleep(20)
				$g =  StringRight($i, 1)
				GUICtrlSetData($hButton, $i & " %")

				_ProgressSetEx($i, $aProgesEx[0])

				Switch $i
					Case 0 To 30
						_ProgressSetEx($i + 10, $aProgesEx[1], 6)
					Case 30 To 60
						_ProgressSetEx($i + 10, $aProgesEx[1], 3)
					Case 60 To 100
						_ProgressSetEx($i + 10, $aProgesEx[1], 5)
				EndSwitch

				_ProgressSetEx(100 - $i, $aProgesEx[3], 5)
				_ProgressSetEx($i, $aProgesEx[4], 4)

				If $g = 0 Or $g = 2 Or $g = 4 Or $g = 6 Or $g = 8 Then
					_ProgressSetEx($i + 3, $aProgesEx[2], 3)
				Else
					_ProgressSetEx($i + 3, $aProgesEx[2], 6)
				EndIf

			Next
	EndSwitch
WEnd

Код / Пример №3 (Изображения берутся из ресурсов) :
Код:
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Run_After=Utilities\ResHacker\ResHacker.exe -add %out%, %out%, IMAGE_1.png, rcdata, IMAGE_1, 0
#AutoIt3Wrapper_Run_After=Utilities\ResHacker\ResHacker.exe -add %out%, %out%, IMAGE_2.png, rcdata, IMAGE_2, 0
#AutoIt3Wrapper_Run_After=Utilities\ResHacker\ResHacker.exe -add %out%, %out%, IMAGE_3.png, rcdata, IMAGE_3, 0
#AutoIt3Wrapper_Run_After=Utilities\ResHacker\ResHacker.exe -add %out%, %out%, IMAGE_4.png, rcdata, IMAGE_4, 0
#AutoIt3Wrapper_Run_After=Utilities\ResHacker\ResHacker.exe -add %out%, %out%, IMAGE_5.png, rcdata, IMAGE_5, 0
#AutoIt3Wrapper_Run_After=Utilities\ResHacker\ResHacker.exe -add %out%, %out%, IMAGE_6.png, rcdata, IMAGE_6, 0
#AutoIt3Wrapper_Run_After=Utilities\ResHacker\ResHacker.exe -add %out%, %out%, IMAGE_7.png, rcdata, IMAGE_7, 0
#AutoIt3Wrapper_Run_After=Utilities\ResHacker\ResHacker.exe -add %out%, %out%, IMAGE_8.png, rcdata, IMAGE_8, 0
#AutoIt3Wrapper_Run_After=Utilities\ResHacker\ResHacker.exe -add %out%, %out%, IMAGE_9.png, rcdata, IMAGE_9, 0
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

#include <ProgressBarEx.au3>

_OptProgressBarEx($OPT_LOAD_IMAGE_FROM_RESOURSE, "C:\ResProgressBarEx", $OPT_NO_DEL_IMAGE, $OPT_MANUAL_EXIT)

Dim $aProgesEx[5]

$hGUI = GUICreate("ProgressBarEx", 800, 500, -1, -1, BitOR($WS_SIZEBOX, $WS_VISIBLE))
$hButton = GUICtrlCreateButton("Ок", 700, 425, 75, 25, 0)

$aProgesEx[0] = _CreateProgressBarEx($hGUI, 120, 10)
$aProgesEx[1] = _CreateProgressBarEx($hGUI, 120, 50, 45, 100, $PBEX_GORIZONTAL)
$aProgesEx[2] = _CreateProgressBarEx($hGUI, 120, 80, 180, 200, BitOR($PBEX_BORDER, $PBEX_GORIZONTAL))

$aProgesEx[3] = _CreateProgressBarEx($hGUI, 10, 10, 10, 30, BitOR($PBEX_BORDER, $PBEX_VERTICAL))
$aProgesEx[4] = _CreateProgressBarEx($hGUI, 10, 50, 70, 30, BitOR($PBEX_BORDER, $PBEX_VERTICAL))

While 1
	Switch GUIGetMsg()
		Case -3
			_CloseBrogressBarEx()
			Exit

		Case $hButton
			For $i = 0 To 100
				Sleep(20)
				$g =  StringRight($i, 1)
				GUICtrlSetData($hButton, $i & " %")

				_ProgressSetEx($i, $aProgesEx[0])

				Switch $i
					Case 0 To 30
						_ProgressSetEx($i + 10, $aProgesEx[1], 6)
					Case 30 To 60
						_ProgressSetEx($i + 10, $aProgesEx[1], 3)
					Case 60 To 100
						_ProgressSetEx($i + 10, $aProgesEx[1], 5)
				EndSwitch

				_ProgressSetEx(100 - $i, $aProgesEx[3], 5)
				_ProgressSetEx($i, $aProgesEx[4], 4)

				If $g = 0 Or $g = 2 Or $g = 4 Or $g = 6 Or $g = 8 Then
					_ProgressSetEx($i + 3, $aProgesEx[2], 3)
				Else
					_ProgressSetEx($i + 3, $aProgesEx[2], 6)
				EndIf

			Next
	EndSwitch
WEnd

Файл: Архив с утилитами отдельным файлом пароль - autoit-script.ru
Файл: ProgressBarEx.7z


Снимок:


История версий: Релиз
Автор(ы): FlatX007, помощь по GDI+ Yashied
 
Автор
F

FlatX007

Tattoo!
Сообщения
174
Репутация
33
Найдена одна досадная недоработка.

При повторения цикла (0% - 100% - 0% - 100% прогресса) растёт количество используемой памяти.
Я не понимаю из за чего, я пробовал устранить у меня не получилось.

Может кто посмотрит ?
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
FlatX007
ты бы привел код где это происходит, или указал какой из примером в шапке.
 
Автор
F

FlatX007

Tattoo!
Сообщения
174
Репутация
33
Код:
#include <ProgressBarEx.au3>

_OptProgressBarEx()

Dim $aProgesEx[5]

$hGUI = GUICreate("Examples #1 -  ProgressBarEx", 800, 500, -1, -1, BitOR($WS_SIZEBOX, $WS_VISIBLE))
$hButton = GUICtrlCreateButton("Ок", 700, 425, 75, 25, 0)

$aProgesEx[0] = _CreateProgressBarEx($hGUI, 120, 10)
$aProgesEx[1] = _CreateProgressBarEx($hGUI, 120, 50, 45, 100, $PBEX_GORIZONTAL)
$aProgesEx[2] = _CreateProgressBarEx($hGUI, 120, 80, 180, 200, BitOR($PBEX_BORDER, $PBEX_GORIZONTAL))

$aProgesEx[3] = _CreateProgressBarEx($hGUI, 10, 10, 10, 30, BitOR($PBEX_BORDER, $PBEX_VERTICAL))
$aProgesEx[4] = _CreateProgressBarEx($hGUI, 10, 50, 70, 30, BitOR($PBEX_BORDER, $PBEX_VERTICAL))

While 1
	Switch GUIGetMsg()
		Case -3
			Exit

		Case $hButton
			For $i = 0 To 100
				Sleep(20)
					_ProgressSetEx($i, $aProgesEx[0], 2)
					_ProgressSetEx($i, $aProgesEx[1], 3)
					_ProgressSetEx($i, $aProgesEx[2], 4)
					_ProgressSetEx($i, $aProgesEx[3], 5)
					_ProgressSetEx($i, $aProgesEx[4], 6)
			Next
	EndSwitch
WEnd
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 702
Трудно сказать почему именно происходит утечка памяти, нужно тщательно все тестировать... Мне сейчас влом этим заниматься. Но если ты заменишь следующую строку в функции _ProgressSetEx(), то все будет OK.

Код:
;GUICtrlSetImage($hID_PIC[$i][$IndexArrayStart], "")
__SetImage($hID_PIC[$i][$IndexArrayStart], 0)
 
Автор
F

FlatX007

Tattoo!
Сообщения
174
Репутация
33
Yashied сказал(а):
Трудно сказать почему именно происходит утечка памяти, нужно тщательно все тестировать... Мне сейчас влом этим заниматься. Но если ты заменишь следующую строку в функции _ProgressSetEx(), то все будет OK.

Код:
;GUICtrlSetImage($hID_PIC[$i][$IndexArrayStart], "")
__SetImage($hID_PIC[$i][$IndexArrayStart], 0)
Пробовал даже так ... память всё равно утекает :blink:
Код:
$h_Bitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($ahIMAGE[$iImage][$ImageNormal])
					__SetImage($hID_PIC[$i][$IndexArrayStart], $h_Bitmap) ;1
					_WinAPI_DeleteObject($h_Bitmap)
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 702
Память утекает при использовании GUICtrlSetImage(..., "") с пустой строкой. Функция убивает картинку в контроле, но почему-то не освобождает HBITMAP. Почему так - х.з. Если ты сделаешь то, что я посоветовал, то утечек не будет. Будь внимательнее.
 
Автор
F

FlatX007

Tattoo!
Сообщения
174
Репутация
33
Да точно всё заработало ... немного погодя обновлю архив.
 
Верх