PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » PureBasic для Windows » Progress Bar


Progress Bar

Сообщений 1 страница 16 из 16

1

Где-то мне попадалась тема по прогрессу, там различные установки типа постоянно бегать влево-вправо, или только справа на лево. Но теперь понадобилось и не могу найти. Не поможете, может есть у кого примеры кода?

0

2

глянь тут
Программа поиска и выбора констант API
вот эти #PBS_

0

3

Написано, что #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)

0

4

Спасибо, но это не совсем то.
Примеры были через win_api, и там различные были варианты. Кажется, это было на форуме, который сейчас недоступен.

0

5

в примерах есть варианты, больше не знаю

а зачем такой прогресс? если он не показывает когда всё это кончится?
хотя бы примерно показать где конец

0

6

Вот такой пример - считывание памяти микроконтроллера. Я не знаю, что это конкретно за девайс - серия, модель, архитектура его памяти, вводить ли защитный код и т.п. Сначала нужно получить эти данные. Учитывая работу через UART на скорости 9600, на это тоже уходит какое-то время. При этом я пока не знаю, сколько займёт времени в итоге весь процесс из-за отсутствия данных о контроллере. Вот в это первоначальное время хотелось бы, что бы прогресс бар был с какой-нибудь анимацией. Показать, так сказать, что программа выполняется, а не висит.
Винда позволяет это сделать через api, один раз задал значение и винда сама поддерживает анимацию.
Я видел такие примеры, но, к сожалению, не могу сейчас  найти ни у себя, ни в инете. На форуме, который сейчас не доступен была тема с некоторыми интересными примерами, в том числе и с прогрессом. Но, увы, тот форум, похоже, канул в лету(((

0

7

для таких целей и свою фигнюшку можно создать, типа гифки

Пётр когда то давал адрес архива того форума, спроси у него, может он знает где лежит сей адрес
если это ещё существует может этот сайт можно закачать себе на комп, спец проги имеются
я в феврале закачал сайт по винде, и поклал теперь на наличие инета, на винте всегда быстрей искать чем в инете

0

8

newJS
Скинь архивом сайт. То что давали там тормозило сильно и внутри какой то странице открывался, там искать не реально. Если бы знал что сайт прекратит существование, конечно бы качалкой сайтов выкачал бы.

0

9

Я нашёл, как передать управление анимацией бегущей полоски в прогрессе винде. Но есть пара моментов.
Во-первых, на сколько помню, в примерах были бегущие полоски наоборот, и ещё интересный какой-то вариант. Но в 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

0

10

Timon написал(а):

ибл

Вы же не знаете сколько данных должны считать= неизвестное значение,значит как отображать полосу трека если неизвестен процент обработанных данных?(не как).
А чтобы видеть что цикл обработки выполняется то встройте время входа в цикл и в нём отображение его изминения и смотрите и ждите,а когда обмен допустим прекратится
то при выходе покажите результат затраченного времени и типа ок обмен закончен. :disappointed:

0

11

Sergeihik написал(а):

Вы же не знаете сколько данных должны считать= неизвестное значение,значит как отображать полосу трека если неизвестен процент обработанных данных?(не как).
А чтобы видеть что цикл обработки выполняется то встройте время входа в цикл и в нём отображение его изминения и смотрите и ждите,а когда обмен допустим прекратится
то при выходе покажите результат затраченного времени и типа ок обмен закончен.

Я сначала не знаю. А потом, как только получу сведения о микроконтроллере от него, я буду знать. И тогда я уже могу настроить прогресс как следует. Но первые несколько секунд нужно что бы пользователь программы видел, что она не висит.
Я делал в предыдущем проекте крутящийся кружок, а так же надпись ЧТЕНИЕ и бегающие многоточия после надписи. Но всё это лишнее (ведь за анимацией надо следить), если можно сделать бегающий прогресс, который управляется системой (куда проще?), а не моей программой.
Тем более, что я в принципе уже нашёл, только вот, на сколько помню, в примерах было больше вариантов и как буд-то были варианты поинтересней. Хотя может и ошибаюсь.
И почему я не могу цвет изменить полосы прогресса, не пойму...

0

12

в примерах есть раскраска

AZJIO
ты не понял, я не архив скачал, а вындовый по АПИ, 14 часов качал
а выкладывать инет позволяет только несколько метров
https://learn.microsoft.com/ru-ru/windows/win32/api/
а на архив у меня нет адреса, ждём когда Пётр появится

0

13

newJS написал(а):

Пётр когда то давал адрес архива того форума

У меня нет архива того форума и никогда не было...
Может речь про веб архив? Что случилось с сайтом purebasic.info?

Timon написал(а):

А во-вторых, я почему-то не могу изменить цвет полоски. Только зелёная. Ни средствами win api, ни средствами PB, ни внешней библиотекой. Почему?

Из-за включенного стиля. Его нужно выключить в настройках компилятора или через WinAPI http://rusproject.narod.ru/winapi/s/setwindowtheme.html

0

14

Код:
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)

0

15

Большое спасибо всем откликнувшимся!

0

16

Пётр написал(а):

Может речь про веб архив?

да о нём, чтобы его выкачать

0


Вы здесь » PureBasic - форум » PureBasic для Windows » Progress Bar