Создать 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 с надписью
Использовать стандартный элемент msctls_progress32 не будем, вместо него возьмем элемент EDIT или STATIC, как и в предыдущем примере. Полоса индикатора и надпись реализуется путем рисования прямо на канве элемента диалогового окна, которое выделено под индикатор.
Основная загвоздка заключается в том, что при отрисовке текста поверх индикатора прогресса, надо учитывать разницу в цвете фона и полосы выполненной части. Посмотрите на скриншоте, чтобы стало понятно, о чем идет речь. В некоторых случаях при определенной комбинации цветов можно использовать единый цвет, но это не самое хорошее решение. Так что сделаем все правильно.
Взаимодействие основного потока приложения и кастомного индикатора реализуется через субклассирование. Установка обработчика ничем не отличается от десятка других примеров, которые мы ранее разбирали.
Code (Assembler) : Убрать нумерациюВыделить код
- ; Субклассирование ProgressBar
- invoke GetDlgItem , [ hwnddlg ] , ID_PROGRESS
- movebx , eax
- ; Установить наш собственный обработчик
- invoke SetWindowLong , ebx , GWL_WNDPROC , ProgressWindowProc
- ; Сохранить хэндл предыдущего обработчика
- mov [ OldProc ] , eax
Процедура обработчика заточена на перехват сообщения WM_PAINT, при поступлении которого рисуется все содержимое ProgressBar. Главная особенность заключается в том, что сперва весь элемент заливается фоновым цветом, на нем рисуется текст, а затем с помощью функции SelectClipRgn от всей площади элемента выделяется участок, на котором выполняется рисование полосы прогресса и дублируется тот же текст, но уже другим цветом. При таком способе незадействованная часть остается без изменений. Ширина полосы прогресса вычисляется в процентном значении от ширины всей площади элемента.
Code (Assembler) : Убрать нумерациюВыделить код
- ;————————————————
- ; Субклассированный обработчик
- ;————————————————
- proc ProgressWindowProc hEdit : DWORD , uMsg : DWORD , wParam : DWORD , lParam : DWORD
- locals
- text dd ?
- ps PAINTSTRUCT
- hDC dd ?
- rcClient RECT
- endl
- cmp [ uMsg ] , WM_PAINT
- je . wm_paint
- . char_ok :
- ; Передать управление предыдущему обработчику
- invoke CallWindowProc , [ OldProc ] , [ hEdit ] , [ uMsg ] , \
- [ wParam ] , [ lParam ]
- ret
- . wm_paint :
- movebx , [ hEdit ]
- ; Размеры окна
- leaedi , [ rcClient ]
- invoke GetClientRect , ebx , edi
- ; Получить текст из свойств
- invoke GetProp , ebx , szProp
- mov [ text ] , eax
- ; Начать рисование
- leaeax , [ ps ]
- invoke BeginPaint , ebx , eax
- mov [ hDC ] , eax
- ; Шрифт
- invoke SelectObject , [ hDC ] , [ hFont ]
- invoke SetBkMode , [ hDC ] , TRANSPARENT
- ; Отрисовать общий фон
- invoke GetSysColorBrush , COLOR_WINDOW
- invoke FillRect , [ hDC ] , edi , eax
- ; Текст для отрисовки есть?
- cmp [ text ] , 0
- je @ f
- invoke GetSysColor , COLOR_WINDOWTEXT
- invoke SetTextColor , [ hDC ] , eax
- invoke DrawText , [ hDC ] , buff , — 1 , edi , \
- DT_NOPREFIX + DT_SINGLELINE + DT_VCENTER + DT_CENTER
- @ @ :
- ; Вычислить размеры области для заливки
- invoke GetProp , ebx , szPerc
- movecx , eax
- moveax , [ edi + RECT . right ]
- subeax , [ edi + RECT . left ]
- xoredx , edx
- mulecx
- movecx , 100
- divecx
- ; Позиция выполненного прогресса
- addeax , [ edi + RECT . left ]
- ; Наложить выполненный прогресс
- invoke CreateRectRgn , [ edi + RECT . left ] , [ edi + RECT . top ] , \
- eax , [ edi + RECT . bottom ]
- invoke SelectClipRgn , [ hDC ] , eax
- invoke GetSysColorBrush , COLOR_HIGHLIGHT
- invoke FillRect , [ hDC ] , edi , eax
- ; Текст для отрисовки есть?
- cmp [ text ] , 0
- je @ f
- invoke GetSysColor , COLOR_HIGHLIGHTTEXT
- invoke SetTextColor , [ hDC ] , eax
- invoke DrawText , [ hDC ] , buff , — 1 , edi , \
- DT_NOPREFIX + DT_SINGLELINE + DT_VCENTER + DT_CENTER
- @ @ :
- leaeax , [ ps ]
- invoke EndPaint , [ hDC ] , eax
- invoke ReleaseDC , ebx , [ hDC ]
- xoreax , eax
- ret
- endp
- szProp db ‘text’ , 0
- szPerc db ‘percent’ , 0
Я использую системные цвета, но никто не мешает вам заменить их по своему усмотрению. Шрифт настраивается в основном приложении, накладываемый текст и значение процентов передается через свойства функцией SetProp, что позволяет использовать одновременно несколько независимых индикаторов. В принципе, точно так же через свойства можно передавать шрифты и цвета, но это все тоже в зависимости от ваших задач.
Code (Assembler) : Убрать нумерациюВыделить код
- ; Шрифт текста
- invoke CreateFont , 32 , 12 , 0 , 0 , FW_BOLD , FALSE , FALSE , FALSE , \
- ANSI_CHARSET , OUT_RASTER_PRECIS , \
- CLIP_DEFAULT_PRECIS , PROOF_QUALITY , \
- FIXED_PITCH + FF_DONTCARE , szFont
- mov [ hFont ] , eax
- ; Хэндл ProgressBar
- invoke GetDlgItem , [ hwnddlg ] , ID_PROGRESS
- movebx , eax
- ; Сформировать строку для отрисовки
- invoke wsprintf , buff , szText , [ percent ]
- addesp , 12
- ; Назначить строку свойством ProgressBar
- invoke SetProp , ebx , szProp , buff
- ; Назначить значение процента свойством ProgressBar
- invoke SetProp , ebx , szPerc , [ percent ]
- ; Перерисовать содержимое окна
- 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 — Вызывается если значение прогресса достигло максимума;