Где-то мне попадалась тема по прогрессу, там различные установки типа постоянно бегать влево-вправо, или только справа на лево. Но теперь понадобилось и не могу найти. Не поможете, может есть у кого примеры кода?
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
Может речь про веб архив?
да о нём, чтобы его выкачать