Top.Mail.Ru
Ответы

C# Как вывести текст на ProgressBar?

Здравствуйте. Только учусь программированию и решил сделать "самоделку" для любимой веб игрушки, но возникли некоторые трудности ). Суть проблемы заключается в том, что введя число в первое поле, должен заполняться прогресс бар и выводиться текст. Под номером 2 прогресс бар + лейбел. Всё работает, но из-за фона лейбла смотрится некрасиво и несколько не эстетично =). В общем, совесть не позволяет оставить так. Поэтому возник вопрос, а как сделать чтобы было без фона? Обшарил интернет, много разных рекомендаций, в том числе сделать прозрачный фон у лейбла, который на деле, как я понял, делает прозрачность сквозь прогресс бар до самой формы. Был ещё вариант с пиктури боксом поверх прогресс бара, но тоже что-то не то... возник вопрос, а можно ли сделать базовый прогресс бар с функцией текста из лейбла? Стал искать. На форуме нашёл похожий вопрос, там был предложен код, который я нагло скопировал... ну... пока знания не позволяют знать самому что-то такое придумать =(. В итоге, на свет появился новый класс, призванный объединить функции прогресс бара и текста из лейбла, код будет ниже. Однако, возникли проблемы... при вводе значения в поле 1, текст в новом прогресс баре появляется, но не заполняется сам прогресс. При вводе нового значения, текст снова обновляется своевременно, а вот прогресс заполнения отстаёт на одну операцию и заполняется на уровень первого значения. Долго пытался понять что не так... по существу, класс должен полностью наследовать функционал стандартного прогресс бара и плюс к этому выводить текст. Логика подсказывается, что необходимо добавить один или несколько методов чтобы дополнить нужный функционал, но вот что делать? Методом перебора стал добавлять то и сё, что потенциально может повлиять на мою проблему, но решения проблемы так и не нашёл... надеюсь, что сможете помочь и подсказать начинающему... не поворачивается язык назвать себя программистом )).

Код нового прогресс бара:
class MyProgressBar : UserControl
{
public MyProgressBar() : base() { }
private ProgressBar progressBar = new ProgressBar();
private Bitmap bm;

public int Value
{
get
{
return progressBar.Value;
}
set
{
progressBar.Value = value;
Refresh();
}
}

public int Minimum
{
get
{
return progressBar.Minimum;
}
set
{
progressBar.Minimum = value;
}
}

public int Maximum
{
get
{
return progressBar.Maximum;
}
set
{
progressBar.Maximum = value;
}
}

public int Step
{
get
{
return progressBar.Step;
}
set
{
progressBar.Step = value;
}
}

protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
bm = new Bitmap(Size.Width, Size.Height);
Graphics gr = CreateGraphics();
progressBar.DrawToBitmap(bm, new Rectangle(0, 0, Size.Width, Size.Height));
gr.DrawImage(bm, 0, 0);
gr.DrawString(Value.ToString() + " / " + Maximum.ToString(), Font, new SolidBrush(ForeColor), new PointF(Width / 2f, Height / 2f));
}

protected override void OnSizeChanged(EventArgs e)
{
base.OnSizeChanged(e);
progressBar.Size = Size;
}
}

Дополнен

P.S. Нашёл решение своего вопроса на данном сайте. Вдруг кому пригодится =).

http://qaru.site/questions/75869/how-do-i-put-text-on-progressbar

Только авторизированные пользователи могут оставлять свои ответы
Дата
Популярность
Аватар пользователя
Новичок
7лет

А что, если сделать label1.BackColor=Color.Transparent - не полегчает?

Аватар пользователя
Искусственный Интеллект
7лет

1. Во-первых, лучше использовать Invalidate() вместо Refresh.
2. Во-вторых, незачем в Paint создавать объект графики через CreateGraphics, если ты и так получаешь объект графики в параметре "e".
3. Что за Image ты там рисуешь?