Перейти к содержимому

Как сделать progress bar c

  • автор:

Создать progressBar с заполнением в течении 3 секунд

Суть создать progressBar , который будет заполняться 3 секунды. Он должен начинать заполняться по открытию формы. Тоеть , к примеру , с другой формы по кнопке переходит на форму с прогрессБаром и он начинает автоматически заполнятся

Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Заполнение progressbar в течении 3 секунд
на форме прогрессбар и лабел. Необходимо заполнять прогресс бар в течении 3х секунд и в label.

Как создать цикл, который будет выполнять тело цикла раз в секунду в течении 5 секунд?
Здравствуйте , подскажите пожалуйста , как создать цикл , который будет выполнять тело цикла раз в.

ProgressBar — заполнение в течении 30 минут
Доброго времени суток, помоги пожалуйста, у меня на форме есть ТАймер и прогресс бар, как сделать.

Функция, меняющая переменную в течении 20 секунд
Нужна ф-ция, которая будет записывать в переменную значения из массива в течении 20 секунд.

2746 / 1656 / 878
Регистрация: 14.04.2015
Сообщений: 5,639

Лучший ответ

Сообщение было отмечено AngreOptinus как решение

Решение

AngreOptinus, и в чем проблема?

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
using System; using System.Windows.Forms; namespace WindowsFormsApp33 { public partial class Form2 : Form { public Form2() { InitializeComponent(); progressBar1.Maximum = 2; } private void Form2_Load(object sender, EventArgs e) { FillProgressBar(); } private void FillProgressBar() { for (int i = 0; i  2; i++) { System.Threading.Thread.Sleep(1000); progressBar1.Value = i; } } } }

само собой Form2_Load нужно создать через события второй формы.
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

При старте мышка не реагирует в течении 6-7 секунд
В общем такая проблема. Искал на этом форуме и на других формах ответа, но не нашел. При старте.

Если ответ от сервера не пришел в течении 45 секунд то
Нужно сделать так: Отсылаем реквест.Если через 45 секунд ответ не пришел или пришел,но.

Выдача сигнала в течении 80 секунд после команды (Step 7)
Нужна помощь в написании программ в Step 7: 1 Создать программу обеспечивающая выдачу сигнала в.

Не могу входить в инет в течении 1 минуты 34 секунд после включения компа(((
Случилось это уже давно. думаю что это вирус. но антивири аваст и каспер не находят! ща стоит.

Таймер: если положение объекта не изменяется по X в течении 5 секунд, то объект уничтожается
если положение обьекта не изменяется по X в течении 5 секунд то обьект уничтожается. как сделать с#

При наведении на кнопку заливать фон слева направо в течении двух секунд
Доброго времени суток! хочу спросить, как мне сделать так, чтобы при наведении на кнопку фон.

Как сделать progress bar?

Выполняется сортировка в потоках. В любой момент из переменной last_index я могу узнать сколько отсортированных элементов уже есть. Так же в переменной count есть их количество. Нужно сделать чтоб отдельный поток выводил progress bar в консоль. Не могу понять как это сделать на с++. Если не сложно можно код для этого потока.

Отслеживать
51.6k 199 199 золотых знаков 59 59 серебряных знаков 242 242 бронзовых знака
задан 12 окт 2019 в 12:05
Oleksii Havryshkiv Oleksii Havryshkiv
111 1 1 золотой знак 1 1 серебряный знак 12 12 бронзовых знаков
Какая хоть операционная система?
12 окт 2019 в 13:31
@MrBin Windows.
12 окт 2019 в 14:15

У вас 2 пути. Либо использовать прогресс бар из WinAPI напрямую, либо использовать фреймворк по типу Qt.

12 окт 2019 в 18:32

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Есть ширина width , есть прогресс progress . Ширина — размер прогресс-бара в единицах консоли, прогресс — текущий прогресс сортировки (принимает значения [0; 1]). В каждый момент времени прогресс равен отношению количества отсортированных к общему количеству элементов массива. Для отрисовки прогресс-бара отрисовываем progress * width активных ячеек и width — progress * width неактивных ячеек.

Решение для Windows.

#include // std::cout #include // std::thread #include // WinApi auto handle = GetStdHandle(STD_OUTPUT_HANDLE); // устанавливает курсор в консоли на указанную позицию void set_cursor(int x, int y) < SetConsoleCursorPosition(handle, < static_cast(x), static_cast(y) >); > // отрисовывает прогресс-бар в консоли по указанным координатам // x - х-координата для прогресс-бара // y - у-координата для прогресс-бара // width - ширина прогресс-бара // progress - пройденный прогресс [0; 1] // fill_symbol - символ, которым будет заполнятся пройденный отрезок // void render_progress_bar(int x, int y, int width, double progress, char fill_symbol) < int fill_w = static_cast(width * progress); int empty_w = width - fill_w; set_cursor(x, y); for (int i = 0; i < fill_w; ++i) std::cout int main() < const int progress_x = 1; const int progress_y = 1; const int progress_width = 50; double progress = 0; // поток отрисовки auto thread = std::thread< [progress_x, progress_y, progress_width, &progress] < const int size = 3; char symbols[size] = < '|', '/', '-' >; int symbol_idx = 0; do < render_progress_bar(progress_x, progress_y, progress_width, progress, symbols[symbol_idx]); std::this_thread::sleep_for(std::chrono::milliseconds(100)); ++symbol_idx; if (symbol_idx >= size) symbol_idx = 0; > while (progress < 1); render_progress_bar(progress_x, progress_y, progress_width, progress, symbols[symbol_idx]); >>; int count = 100; int last_index = 0; // имитация изменения прогресса while (last_index < count) < last_index += 1 + rand() % 5; if (last_index >count) last_index = count; progress = static_cast(last_index) / count; std::this_thread::sleep_for(std::chrono::milliseconds(400)); > thread.join(); return 0; > 

Как сделать progress bar c

Не перестаю удивляться, почему разработчики Microsoft с самого начала не реализовали «из коробки» очевиднейшие решения. Например, есть хороший и удобный элемент диалоговых окон — Progress Bar. Легко реализовать, удобно управлять, но по какой-то причине нет никаких инструментов, чтобы системными средствами наложить на индикатор прогресса какую-нибудь надпись типа «42% завершено». Градиентный ProgressBar мы уже делали, настала очередь реализовать ProgressBar с надписью.

ProgressBar с надписью

ProgressBar с надписью

Использовать стандартный элемент msctls_progress32 не будем, вместо него возьмем элемент EDIT или STATIC, как и в предыдущем примере. Полоса индикатора и надпись реализуется путем рисования прямо на канве элемента диалогового окна, которое выделено под индикатор.

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

Взаимодействие основного потока приложения и кастомного индикатора реализуется через субклассирование. Установка обработчика ничем не отличается от десятка других примеров, которые мы ранее разбирали.

Code (Assembler) : Убрать нумерациюВыделить код

  1. ; Субклассирование ProgressBar
  2. invoke GetDlgItem , [ hwnddlg ] , ID_PROGRESS
  3. movebx , eax
  4. ; Установить наш собственный обработчик
  5. invoke SetWindowLong , ebx , GWL_WNDPROC , ProgressWindowProc
  6. ; Сохранить хэндл предыдущего обработчика
  7. mov [ OldProc ] , eax

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

Code (Assembler) : Убрать нумерациюВыделить код

  1. ;————————————————
  2. ; Субклассированный обработчик
  3. ;————————————————
  4. proc ProgressWindowProc hEdit : DWORD , uMsg : DWORD , wParam : DWORD , lParam : DWORD
  5. locals
  6. text dd ?
  7. ps PAINTSTRUCT
  8. hDC dd ?
  9. rcClient RECT
  10. endl
  11. cmp [ uMsg ] , WM_PAINT
  12. je . wm_paint
  13. . char_ok :
  14. ; Передать управление предыдущему обработчику
  15. invoke CallWindowProc , [ OldProc ] , [ hEdit ] , [ uMsg ] , \
  16. [ wParam ] , [ lParam ]
  17. ret
  18. . wm_paint :
  19. movebx , [ hEdit ]
  20. ; Размеры окна
  21. leaedi , [ rcClient ]
  22. invoke GetClientRect , ebx , edi
  23. ; Получить текст из свойств
  24. invoke GetProp , ebx , szProp
  25. mov [ text ] , eax
  26. ; Начать рисование
  27. leaeax , [ ps ]
  28. invoke BeginPaint , ebx , eax
  29. mov [ hDC ] , eax
  30. ; Шрифт
  31. invoke SelectObject , [ hDC ] , [ hFont ]
  32. invoke SetBkMode , [ hDC ] , TRANSPARENT
  33. ; Отрисовать общий фон
  34. invoke GetSysColorBrush , COLOR_WINDOW
  35. invoke FillRect , [ hDC ] , edi , eax
  36. ; Текст для отрисовки есть?
  37. cmp [ text ] , 0
  38. je @ f
  39. invoke GetSysColor , COLOR_WINDOWTEXT
  40. invoke SetTextColor , [ hDC ] , eax
  41. invoke DrawText , [ hDC ] , buff , — 1 , edi , \
  42. DT_NOPREFIX + DT_SINGLELINE + DT_VCENTER + DT_CENTER
  43. @ @ :
  44. ; Вычислить размеры области для заливки
  45. invoke GetProp , ebx , szPerc
  46. movecx , eax
  47. moveax , [ edi + RECT . right ]
  48. subeax , [ edi + RECT . left ]
  49. xoredx , edx
  50. mulecx
  51. movecx , 100
  52. divecx
  53. ; Позиция выполненного прогресса
  54. addeax , [ edi + RECT . left ]
  55. ; Наложить выполненный прогресс
  56. invoke CreateRectRgn , [ edi + RECT . left ] , [ edi + RECT . top ] , \
  57. eax , [ edi + RECT . bottom ]
  58. invoke SelectClipRgn , [ hDC ] , eax
  59. invoke GetSysColorBrush , COLOR_HIGHLIGHT
  60. invoke FillRect , [ hDC ] , edi , eax
  61. ; Текст для отрисовки есть?
  62. cmp [ text ] , 0
  63. je @ f
  64. invoke GetSysColor , COLOR_HIGHLIGHTTEXT
  65. invoke SetTextColor , [ hDC ] , eax
  66. invoke DrawText , [ hDC ] , buff , — 1 , edi , \
  67. DT_NOPREFIX + DT_SINGLELINE + DT_VCENTER + DT_CENTER
  68. @ @ :
  69. leaeax , [ ps ]
  70. invoke EndPaint , [ hDC ] , eax
  71. invoke ReleaseDC , ebx , [ hDC ]
  72. xoreax , eax
  73. ret
  74. endp
  75. szProp db ‘text’ , 0
  76. szPerc db ‘percent’ , 0

Я использую системные цвета, но никто не мешает вам заменить их по своему усмотрению. Шрифт настраивается в основном приложении, накладываемый текст и значение процентов передается через свойства функцией SetProp, что позволяет использовать одновременно несколько независимых индикаторов. В принципе, точно так же через свойства можно передавать шрифты и цвета, но это все тоже в зависимости от ваших задач.

Code (Assembler) : Убрать нумерациюВыделить код

  1. ; Шрифт текста
  2. invoke CreateFont , 32 , 12 , 0 , 0 , FW_BOLD , FALSE , FALSE , FALSE , \
  3. ANSI_CHARSET , OUT_RASTER_PRECIS , \
  4. CLIP_DEFAULT_PRECIS , PROOF_QUALITY , \
  5. FIXED_PITCH + FF_DONTCARE , szFont
  6. mov [ hFont ] , eax
  7. ; Хэндл ProgressBar
  8. invoke GetDlgItem , [ hwnddlg ] , ID_PROGRESS
  9. movebx , eax
  10. ; Сформировать строку для отрисовки
  11. invoke wsprintf , buff , szText , [ percent ]
  12. addesp , 12
  13. ; Назначить строку свойством ProgressBar
  14. invoke SetProp , ebx , szProp , buff
  15. ; Назначить значение процента свойством ProgressBar
  16. invoke SetProp , ebx , szPerc , [ percent ]
  17. ; Перерисовать содержимое окна
  18. invoke InvalidateRect , ebx , 0 , FALSE

Непосредственно обновление ProgressBar выполняется при помощи функции InvalidateRect, ее надо вызывать сразу после установки новых значений в свойствах.

В приложении пример программы с исходным текстом, которая выводит на форму кастомизированный индикатор прогресса с наложением текста.

Пример программы с исходным текстом (FASM)

C#: Custom ProgressBar или меняем цвет у прогресс бара

Блог доброго программиста

Вопрос «Как поменять цвет полоски у ProgressBar» достаточно частый для языка C#. На самом деле не знаю почему разработчики .NET не добавили свойство изменения цвета полоски на другой — а ведь штука то на самом деле нужная. Так же не плохой была бы возможность отображения текущего прогресса в процентах или относительно какого либо числа, например 5 из 1000. Сегодня я решил поделиться с Вами набросками прогресса который может менять цвет полоски и отображать текущий прогресс в виде текста в двух вариантах: проценты и текущее значение относительно максимального значения.

К сожалению то, о чем я сейчас Вам говорю нельзя реализовать с помощью стандартного контрола ProgressBar. Поэтому если Вы хотите поменять цвет полоски, то Вам нужно будет писать свой прогресс бар. Я не буду вдаваться в подробности о том как создавать свой собственный control. Об это я уже говорил в данном посте. Так же я не буду наводить красоту в нашем разрабатываемом контроле, а остановлюсь лишь на минимальном функционале. Если Вы захотите как-то украсить наш control, то без проблем сможете это сделать, например добавив градиенты и т.п.

Сейчас я приведу листинг нашего ProgressBar который может менять цвет полоски, а затем опишу как им пользоваться:

using System; using System.Drawing; using System.Windows.Forms; namespace FsLib < class FsProgressBar: Control < public enum FsProgressTextType < AsIs, Percent >//Cal when Value was changed public event EventHandler ValueChanged; //Call when Value == MaxValue public event EventHandler ValuesIsMaximum; private Int32 minValue; public Int32 MinValue < get < return this.minValue; >set < if (value >= this.MaxValue) < throw new Exception("MinValue must be less than MaxValue"); >this.minValue = value; this.Invalidate(); > > private Int32 maxValue; public Int32 MaxValue < get < return this.maxValue; >set < if (value this.maxValue = value; this.Invalidate(); > > private Int32 value; public Int32 Value < get < return this.value; >set < if (value < this.MinValue || value >this.maxValue) < throw new Exception("Value must be between MinValue and MaxValue"); >this.value = value; if (this.value == this.MaxValue && this.ValuesIsMaximum != null) < this.ValuesIsMaximum(this, new EventArgs()); >if (this.ValueChanged != null) < this.ValueChanged(this, new EventArgs()); >this.Invalidate(); > > private Int32 borderWidth; public Int32 BorderWidth < get < return this.borderWidth; >set < if (value < 0) < throw new Exception("Border width can not be negative"); >this.borderWidth = value; > > public System.Drawing.Color BorderColor < get; set; >public System.Drawing.Color ProgressColor < get; set; >public Boolean ShowProgressText < get; set; >public FsProgressTextType ProgressTextType < get; set; >public FsProgressBar() < SetStyle(ControlStyles.UserPaint, true); SetStyle(ControlStyles.OptimizedDoubleBuffer, true); SetStyle(ControlStyles.SupportsTransparentBackColor, true); this.minValue = 0; this.maxValue = 100; this.value = 0; this.BorderWidth = 0; this.BorderColor = Color.Black; this.BackColor = SystemColors.Control; this.ForeColor = Color.Black; this.ProgressColor = Color.Yellow; this.ShowProgressText = true; this.Paint += new PaintEventHandler(FsProgressBar_Paint); this.Size = new Size(200, 30); this.ProgressTextType = FsProgressTextType.AsIs; >protected void FsProgressBar_Paint(object sender, PaintEventArgs e) < e.Graphics.FillRectangle(new SolidBrush(this.BackColor), new Rectangle(0, 0, this.Width, this.Height)); e.Graphics.FillRectangle(new SolidBrush(this.ProgressColor), new Rectangle(0, 0, (this.Value * this.Width) / this.MaxValue, this.Height)); if (this.BorderWidth >0) < e.Graphics.DrawRectangle(new Pen(this.BorderColor, this.BorderWidth), this.DisplayRectangle); >if (this.ShowProgressText) < string text = String.Empty; switch (this.ProgressTextType) < case FsProgressTextType.AsIs: text = this.Value + " / " + this.MaxValue; break; case FsProgressTextType.Percent: text = ((this.Value * 100) / this.MaxValue).ToString() + "%"; break; >System.Drawing.SizeF size = e.Graphics.MeasureString(text, this.Font); e.Graphics.DrawString(text, this.Font, new SolidBrush(this.ForeColor), new PointF(this.Width / 2 - size.Width / 2, this.Height / 2 - size.Height / 2)); > > > >

Чтобы создать данный контрол Вам нужно написать следующий код:

FsLib.FsProgressBar fsProgress = new FsLib.FsProgressBar();

Рассмотрим основные свойства нашего объекта:
fsProgress.ForeColor — Цвет отображаемого текста;
fsProgress.Font — Стиль отображаемого текста;
fsProgress.ProgressTextType — Как отображать текст прогресса (проценты или текущее значение);
fsProgress.ShowProgressText — Нужно ли отображать текст прогресса;
fsProgress.BackColor — Цвет фона;
fsProgress.ProgressColor — Цвет полоски прогресса;
fsProgress.BorderColor — Цвет рамки;
fsProgress.BorderWidth — Ширина рамки;
fsProgress.MinValue — Минимальное значение;
fsProgress.MaxValue — Максимальное значение;
fsProgress.Value — Текущее значение прогресса;

Рассмотрим основные события:
fsProgress.ValuesChanged — Вызывается при изменении значения;
fsProgress.ValuesIsMaximum — Вызывается если значение прогресса достигло максимума;

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Luxury Car Rental in Miami | Reserve a Premium Vehicle with RealCar