Кажется, что если вы вызываете SetStyle (ControlStyles.UserPaint, true), стандартный метод OnPaint, реализованный для ProgressBar, не может быть вызван (использование base.OnPaint (e) вообще не работает). Самое странное, что даже если вы на самом деле создаете UserControl и пытаетесь нарисовать какой-то текст на индикаторе выполнения ... он, похоже, тоже не работает ... Конечно, вы можете разместить над ним метку. ... но я полагаю, что это не то, чего вы хотели достичь.
Хорошо, похоже, мне удалось решить эту проблему. Хотя это немного сложно. Сначала вам нужно создать прозрачный элемент управления Label. Код ниже:
</p>
<pre><code>public class TransparentLabel : System.Windows.Forms.Label
{
public TransparentLabel()
{
this.SetStyle(ControlStyles.Opaque, true);
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, false);
}
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x20;
return cp;
}
}
}
Второе - создать UserControl, поместить на него ProgressBar (Dock = Fill) - это будет элемент управления, который мы будем использовать вместо стандартного ProgressBar. Код:
</p>
<pre><code>public partial class UserControl2 : UserControl
{
public UserControl2()
{
InitializeComponent();
}
protected override void OnPaint(PaintEventArgs e)
{
this.progressBar1.SendToBack();
this.transparentLabel1.BringToFront();
this.transparentLabel1.Text = this.progressBar1.Value.ToString();
this.transparentLabel1.Invalidate();
}
public int Value
{
get { return this.progressBar1.Value; }
set
{
this.progressBar1.Value = value;
}
}
}
Странная вещь в ProgressBar заключается в том, что он «перезаписывает» элементы управления, которые на него накладываются, поэтому необходимо отправить индикатор прогресса назад и перенести элемент управления меткой вперед. На данный момент я не нашел более элегантного решения.
Это работает, метка отображается на индикаторе прогресса, фон элемента управления меткой прозрачен, поэтому я думаю, что выглядело так, как вы хотели, чтобы это выглядело:)
Я могу поделиться своим примером кода, если вы хотите ...
О, кстати. это странное поведение элемента управления ProgressBar, о котором я упоминал, является причиной того, что невозможно использовать объект Graphics для рисования чего-либо на элементе управления, производном от ProgressBar. Текст (или что-то, что вы рисуете с использованием объекта Graphics) на самом деле рисуется, но ... за элементом управления ProgressBar (если вы посмотрите поближе, вы можете увидеть, что этот пользователь рисует вещи, мерцающие, когда изменяется значение ProgressBar, и ему нужно перекрасить себя).