Что нового

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

FlatX007

Tattoo!
Сообщения
197
Репутация
35
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!
Сообщения
197
Репутация
35
Найдена одна досадная недоработка.

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

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

kaster

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

FlatX007

Tattoo!
Сообщения
197
Репутация
35
Код:
#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,724
Трудно сказать почему именно происходит утечка памяти, нужно тщательно все тестировать... Мне сейчас влом этим заниматься. Но если ты заменишь следующую строку в функции _ProgressSetEx(), то все будет OK.

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

FlatX007

Tattoo!
Сообщения
197
Репутация
35
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,724
Память утекает при использовании GUICtrlSetImage(..., "") с пустой строкой. Функция убивает картинку в контроле, но почему-то не освобождает HBITMAP. Почему так - х.з. Если ты сделаешь то, что я посоветовал, то утечек не будет. Будь внимательнее.
 
Автор
F

FlatX007

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