Где-то мне попадалась тема по прогрессу, там различные установки типа постоянно бегать влево-вправо, или только справа на лево. Но теперь понадобилось и не могу найти. Не поможете, может есть у кого примеры кода?
Progress Bar
Сообщений 1 страница 16 из 16
Поделиться221.03.2023 09:58:03
глянь тут
Программа поиска и выбора констант API
вот эти #PBS_
Поделиться321.03.2023 15:51:25
Написано, что #PB_ProgressBar_Unknown для функции SetGadgetState() делает неопределённый позицию, фактически превращает прогрессбар в тоже что делает #PBS_MARQUEE.
EnableExplicit
Global StopStart = 0
Procedure potok(z)
Protected i, j
For j = 0 To 5
For i = 0 To 100
Delay(50)
SetGadgetState(0, i)
If Not StopStart
ProcedureReturn
EndIf
Next
Next
EndProcedure
If OpenWindow(0, 0, 0, 270, 100, "Прогресс бар", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ProgressBarGadget(0, 10, 10, 250, 30, 0, 100, #PBS_MARQUEE)
ButtonGadget (1, 10, 60, 150, 30, "Стоп/старт")
Repeat
Select WaitWindowEvent()
Case #PB_Event_Gadget
Select EventGadget()
Case 1
StopStart = 1 - StopStart
If StopStart
CreateThread(@potok(), 23)
EndIf
EndSelect
Case #PB_Event_CloseWindow
CloseWindow(0)
End
EndSelect
ForEver
EndIfОтредактировано AZJIO (21.03.2023 16:06:22)
Поделиться421.03.2023 17:17:07
Спасибо, но это не совсем то.
Примеры были через win_api, и там различные были варианты. Кажется, это было на форуме, который сейчас недоступен.
Поделиться522.03.2023 14:27:22
в примерах есть варианты, больше не знаю
а зачем такой прогресс? если он не показывает когда всё это кончится?
хотя бы примерно показать где конец
Поделиться622.03.2023 14:49:54
Вот такой пример - считывание памяти микроконтроллера. Я не знаю, что это конкретно за девайс - серия, модель, архитектура его памяти, вводить ли защитный код и т.п. Сначала нужно получить эти данные. Учитывая работу через UART на скорости 9600, на это тоже уходит какое-то время. При этом я пока не знаю, сколько займёт времени в итоге весь процесс из-за отсутствия данных о контроллере. Вот в это первоначальное время хотелось бы, что бы прогресс бар был с какой-нибудь анимацией. Показать, так сказать, что программа выполняется, а не висит.
Винда позволяет это сделать через api, один раз задал значение и винда сама поддерживает анимацию.
Я видел такие примеры, но, к сожалению, не могу сейчас найти ни у себя, ни в инете. На форуме, который сейчас не доступен была тема с некоторыми интересными примерами, в том числе и с прогрессом. Но, увы, тот форум, похоже, канул в лету(((
Поделиться723.03.2023 12:43:24
для таких целей и свою фигнюшку можно создать, типа гифки
Пётр когда то давал адрес архива того форума, спроси у него, может он знает где лежит сей адрес
если это ещё существует может этот сайт можно закачать себе на комп, спец проги имеются
я в феврале закачал сайт по винде, и поклал теперь на наличие инета, на винте всегда быстрей искать чем в инете
Поделиться823.03.2023 13:53:11
newJS
Скинь архивом сайт. То что давали там тормозило сильно и внутри какой то странице открывался, там искать не реально. Если бы знал что сайт прекратит существование, конечно бы качалкой сайтов выкачал бы.
Поделиться923.03.2023 20:22:01
Я нашёл, как передать управление анимацией бегущей полоски в прогрессе винде. Но есть пара моментов.
Во-первых, на сколько помню, в примерах были бегущие полоски наоборот, и ещё интересный какой-то вариант. Но в win api я больше ничего интересного не нашёл.
А во-вторых, я почему-то не могу изменить цвет полоски. Только зелёная. Ни средствами win api, ни средствами PB, ни внешней библиотекой. Почему? Не могу понять.
EnableExplicit
Enumeration
#WIN
#GADGET_1
#GADGET_2
EndEnumeration
#PBM_SETMARQUEE=#WM_USER+10
#PBM_SETSTATE = #WM_USER + 16
#PBST_ERROR = $0002;
;#PBST_PAUSED = 3
#PBM_SETBARCOLOR = #WM_USER + 9
;#PBM_GETBKCOLOR = #WM_USER + 14
#PBM_GETBARCOLOR = #WM_USER + 15
;#PBM_SETBKCOLOR = $2001
If OpenWindow(0, 0, 0, 270, 100, "Прогресс бар", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ProgressBarGadget(#GADGET_1, 10, 10, 250, 30, 0, 100, #PBS_MARQUEE)
ButtonGadget (#GADGET_2, 10, 60, 150, 30, "Стоп")
SendMessage_(GadgetID(#GADGET_1), #PBM_SETMARQUEE, #True, 30); передать управление анимацией прогресса винде. Работает.
SendMessage_(GadgetID(#GADGET_1), #PBM_SETBARCOLOR, 0, $00FF0000); закрасить полоску прогресса. НЕ работает.
;SendMessage_(GadgetID(#GADGET_1), #PBM_SETBKCOLOR, 0, $FFFFFF); закрасить фон прогресса. НЕ работает.
;debug SendMessage_(GadgetID(#GADGET_1), #PBM_GETBARCOLOR, 0, 0); получить текущее значение цвета полоски. Получаем то, что установили, но визуально цвет не поменялся. ПОЧЕМУ???
Repeat
Select WaitWindowEvent()
Case #PB_Event_Gadget
Select EventGadget()
Case #GADGET_2
SetWindowLong_(GadgetID(#GADGET_1), #GWL_STYLE, GetWindowLong_(GadgetID(#GADGET_1), #GWL_STYLE) & ~#PBS_MARQUEE); отменить предидущий стиль, что бы работало снова как обычно. Работает.
SetGadgetState (#GADGET_1, 50)
SendMessage_(GadgetID(#GADGET_1), #PBM_SETSTATE, #PBST_ERROR, 0); сигнализация об ошибке, просто пример. Работает.
EndSelect
Case #PB_Event_CloseWindow
CloseWindow(#WIN)
End
EndSelect
ForEver
EndIfПоделиться1023.03.2023 21:50:31
ибл
Вы же не знаете сколько данных должны считать= неизвестное значение,значит как отображать полосу трека если неизвестен процент обработанных данных?(не как).
А чтобы видеть что цикл обработки выполняется то встройте время входа в цикл и в нём отображение его изминения и смотрите и ждите,а когда обмен допустим прекратится
то при выходе покажите результат затраченного времени и типа ок обмен закончен. 
Поделиться1123.03.2023 23:28:10
Вы же не знаете сколько данных должны считать= неизвестное значение,значит как отображать полосу трека если неизвестен процент обработанных данных?(не как).
А чтобы видеть что цикл обработки выполняется то встройте время входа в цикл и в нём отображение его изминения и смотрите и ждите,а когда обмен допустим прекратится
то при выходе покажите результат затраченного времени и типа ок обмен закончен.
Я сначала не знаю. А потом, как только получу сведения о микроконтроллере от него, я буду знать. И тогда я уже могу настроить прогресс как следует. Но первые несколько секунд нужно что бы пользователь программы видел, что она не висит.
Я делал в предыдущем проекте крутящийся кружок, а так же надпись ЧТЕНИЕ и бегающие многоточия после надписи. Но всё это лишнее (ведь за анимацией надо следить), если можно сделать бегающий прогресс, который управляется системой (куда проще?), а не моей программой.
Тем более, что я в принципе уже нашёл, только вот, на сколько помню, в примерах было больше вариантов и как буд-то были варианты поинтересней. Хотя может и ошибаюсь.
И почему я не могу цвет изменить полосы прогресса, не пойму...
Поделиться1224.03.2023 06:29:13
в примерах есть раскраска
AZJIO
ты не понял, я не архив скачал, а вындовый по АПИ, 14 часов качал
а выкладывать инет позволяет только несколько метров
https://learn.microsoft.com/ru-ru/windows/win32/api/
а на архив у меня нет адреса, ждём когда Пётр появится
Поделиться1326.03.2023 01:44:00
Пётр когда то давал адрес архива того форума
У меня нет архива того форума и никогда не было...
Может речь про веб архив? Что случилось с сайтом purebasic.info?
А во-вторых, я почему-то не могу изменить цвет полоски. Только зелёная. Ни средствами win api, ни средствами PB, ни внешней библиотекой. Почему?
Из-за включенного стиля. Его нужно выключить в настройках компилятора или через WinAPI http://rusproject.narod.ru/winapi/s/setwindowtheme.html
Поделиться1426.03.2023 12:34:44
EnableExplicit
Enumeration
#WIN
#GADGET_1
#GADGET_2
EndEnumeration
#PBM_SETMARQUEE=#WM_USER+10
#PBM_SETSTATE = #WM_USER + 16
#PBST_ERROR = $0002;
;#PBST_PAUSED = 3
#PBM_SETBARCOLOR = #WM_USER + 9
#PBM_GETBKCOLOR = #WM_USER + 14
#PBM_GETBARCOLOR = #WM_USER + 15
#PBM_SETBKCOLOR = $2001
If OpenWindow(0, 0, 0, 270, 100, "Прогресс бар", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ProgressBarGadget(#GADGET_1, 10, 10, 250, 30, 0, 100, #PBS_MARQUEE)
ButtonGadget (#GADGET_2, 10, 60, 150, 30, "Стоп")
SendMessage_(GadgetID(#GADGET_1), #PBM_SETMARQUEE, #True, 50); передать управление анимацией прогресса винде. Работает.
SetWindowTheme_(GadgetID(#GADGET_1),@"",@"") ;Выключает тему без этого следующие 2 не работают а с этим типа не так красиво
SendMessage_(GadgetID(#GADGET_1), #PBM_SETBARCOLOR, 0, $eb4ae8); закрасить полоску прогресса. НЕ работает.
SendMessage_(GadgetID(#GADGET_1), #PBM_SETBKCOLOR, 0, $29d4ec); закрасить фон прогресса. НЕ работает.
;Debug SendMessage_(GadgetID(#GADGET_1), #PBM_GETBARCOLOR, 0, 0); получить текущее значение цвета полоски. Получаем то, что установили, но визуально цвет не поменялся. ПОЧЕМУ???
Repeat
Select WaitWindowEvent()
Case #PB_Event_Gadget
Select EventGadget()
Case #GADGET_2
SetWindowLong_(GadgetID(#GADGET_1), #GWL_STYLE, GetWindowLong_(GadgetID(#GADGET_1), #GWL_STYLE) & ~#PBS_MARQUEE); отменить предидущий стиль, что бы работало снова как обычно. Работает.
SetGadgetState (#GADGET_1, 50)
SendMessage_(GadgetID(#GADGET_1), #PBM_SETSTATE, #PBST_ERROR, 0); сигнализация об ошибке, просто пример. Работает.
EndSelect
Case #PB_Event_CloseWindow
CloseWindow(#WIN)
End
EndSelect
ForEver
EndIf
ps:Попробывал темами стиля поупровлять но что то загвоздка,может свою надо как то создавать?
EnableExplicit
Enumeration
#WIN
#GADGET_1
#GADGET_2
EndEnumeration
#PBM_SETMARQUEE=#WM_USER+10
#PBM_SETSTATE = #WM_USER + 16
#PBST_ERROR = $0002;
;#PBST_PAUSED = 3
#PBM_SETBARCOLOR = #WM_USER + 9
#PBM_GETBKCOLOR = #WM_USER + 14
#PBM_GETBARCOLOR = #WM_USER + 15
#PBM_SETBKCOLOR = $2001
Procedure.i GetThemeBackgroundContentRect(hwhd,hTheme,*rect.rect)
Protected hdc=GetDC_(hwhd)
; GetThemeBackgroundContentRect_(hTheme,hdc,iPartId,iStateId,
; [in] LPCRECT pBoundingRect,
; [out] LPRECT pContentRect
ReleaseDC_(hwhd,hdc)
ProcedureReturn
EndProcedure
Global hthema.i
Procedure.i DrawThemeBackground(hwhd)
;progress
#PP_BAR = 1
#PP_BARVERT = 2
#PP_CHUNK = 3
#PP_CHUNKVERT = 4
#PP_FILL = 5;PBFS_ERROR=2, PBFS_NORMAL=1, PBFS_PARTIAL=4, PBFS_PAUSED=3
#PP_FILLVERT = 6;PBFVS_ERROR=2, PBFVS_NORMAL=1, PBFVS_PARTIAL=4, PBFVS_PAUSED=3
#PP_PULSEOVERLAY = 7
#PP_MOVEOVERLAY = 8
#PP_PULSEOVERLAYVERT = 9
#PP_MOVEOVERLAYVERT = 10
#PP_TRANSPARENTBAR = 11;PBBS_NORMAL=1, PBBS_PARTIAL=2
#PP_TRANSPARENTBARVERT = 12;PBBVS_NORMAL=1, PBBVS_PARTIAL=2
#PBBS_NORMAL = 1
#PBBS_PARTIAL = 2
;==========================
;edit EDIT_PARTS
#EP_EDITTEXT = 1:#ETS_ASSIST=7: #ETS_CUEBANNER=8:#ETS_DISABLED=4:#ETS_FOCUSED=5:#ETS_HOT=2:#ETS_NORMAL=1:#ETS_READONLY=6:#ETS_SELECTED=3
#EP_CARET = 2
#EP_BACKGROUND = 3;EBS_ASSIST=6, EBS_DISABLED=3, EBS_FOCUSED=4, EBS_HOT=2, EBS_NORMAL=1, EBS_READONLY=5
#EP_PASSWORD = 4
#EP_BACKGROUNDWITHBORDER = 5;EBWBS_DISABLED=3, EBWBS_FOCUSED=4, EBWBS_HOT=2, EBWBS_NORMAL=1
#EP_EDITBORDER_NOSCROLL = 6;EPSN_DISABLED=4, EPSN_FOCUSED=3, EPSN_HOT=2, EPSN_NORMAL=1
#EP_EDITBORDER_HSCROLL = 7;EPSH_DISABLED=4, EPSH_FOCUSED=3, EPSH_HOT=2, EPSH_NORMAL=1
#EP_EDITBORDER_VSCROLL = 8;EPSV_DISABLED=4, EPSV_FOCUSED=3, EPSV_HOT=2, EPSV_NORMAL=1
#EP_EDITBORDER_HVSCROLL = 9;EPSHV_DISABLED=4, EPSHV_FOCUSED=3, EPSHV_HOT=2, EPSHV_NORMAL=1
;===========================
Protected dc=GetDC_(hwhd)
Protected rect.rect
Protected rect2.rect
GetWindowRect_(hwhd,@rect)
rect2\left=5
rect2\right=60
rect2\top=5
rect2\bottom=65
;draw the progressbar background.
DrawThemeBackground_(hthema,dc,#EP_BACKGROUND ,4 ,@rect,0);последний параметр rect обрезки
;DrawThemeBackground_(hthema,dc,11, 2 ,@rect,0);
;SetRect_(&r,10,10,50,25);
;DrawThemeBackground_(hthema,dc,5, 4 ,@rect,0);
ReleaseDC_(hwhd,dc)
EndProcedure
If OpenWindow(0, 0, 0, 800, 300, "Прогресс бар", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ProgressBarGadget(#GADGET_1, 10, 10, 250, 30, 0, 100, #PBS_MARQUEE)
ButtonGadget(#GADGET_2, 10, 60, 150, 30, "Стоп")
EditorGadget(3,300,0,300,300)
SendMessage_(GadgetID(#GADGET_1), #PBM_SETMARQUEE, #True, 50); передать управление анимацией прогресса винде. Работает.
;Debug IsCompositionActive_()
;Debug GetThemeAppProperties_()
;Чтобы проверить доступность визуальных стилей, вызовите функцию IsAppThemed . Если визуальные стили недоступны, используйте резервный код для рисования элемента управления
Debug "тема поддерживается?" + " "+Str(IsAppThemed_());Сообщает, отображается ли пользовательский интерфейс текущего приложения с помощью визуальных стилей ;TRUE;FALSE
If IsAppThemed_()=1;приложение с помощью визуальных стилей.
Debug IsThemeActive_();Проверяет, активен ли визуальный стиль для текущего приложения
;
;hthema = OpenThemeData_(GadgetID(3),@"EDITSTYLE;Edit");получить тему классы возможно в Vsstyle.h и Vssym32.h(сейчас типа 2 класса через ;)
hthema = GetWindowTheme_(GadgetID(3))
Debug hthema
Debug "дескриптор темы" + " "+Str(hthema)
Else
;Если возвращаемое значение равно NULL, используйте функции рисования, не являющиеся визуальными стилями
EndIf
;Debug SetWindowTheme_(GadgetID(#GADGET_1), @"Progress",0);
;Debug GetWindowTheme_(GadgetID(#GADGET_1))
;Debug SetWindowThemeAttribute_(GadgetID(#GADGET_1),0,)
;
DrawThemeBackground(GadgetID(3))
;SetWindowTheme_(GadgetID(#GADGET_1),0,@"") ;Выключает тему без этого следующие 2 не работают а с этим типа не так красиво
;SendMessage_(GadgetID(#GADGET_1),#WM_THEMECHANGED,0,0)
;SendMessage_(GadgetID(#GADGET_1), #PBM_SETBARCOLOR, 0, $eb4ae8); закрасить полоску прогресса. НЕ работает.
; SendMessage_(GadgetID(#GADGET_1), #PBM_SETBKCOLOR, 0, $29d4ec); закрасить фон прогресса. НЕ работает.
;Debug SendMessage_(GadgetID(#GADGET_1), #PBM_GETBARCOLOR, 0, 0); получить текущее значение цвета полоски. Получаем то, что установили, но визуально цвет не поменялся. ПОЧЕМУ???
Repeat
Select WaitWindowEvent()
Case #PB_Event_Gadget
Select EventGadget()
Case #GADGET_2
SetWindowLong_(GadgetID(#GADGET_1), #GWL_STYLE, GetWindowLong_(GadgetID(#GADGET_1), #GWL_STYLE) & ~#PBS_MARQUEE); отменить предидущий стиль, что бы работало снова как обычно. Работает.
SetGadgetState (#GADGET_1, 50)
SendMessage_(GadgetID(#GADGET_1), #PBM_SETSTATE, #PBST_ERROR, 0); сигнализация об ошибке, просто пример. Работает.
EndSelect
Case #PB_Event_CloseWindow
If hthema
CloseThemeData_(hthema);удалить дескриптор темы
EndIf
CloseWindow(#WIN)
End
EndSelect
ForEver
EndIf
Отредактировано Sergeihik (26.03.2023 19:58:15)
Поделиться1529.03.2023 14:27:16
Большое спасибо всем откликнувшимся!
Поделиться1629.03.2023 20:15:33
Может речь про веб архив?
да о нём, чтобы его выкачать