using System.Windows.Forms; using System.Drawing; using System.Drawing.Drawing2D; using System.ComponentModel; public class NewProgressBar : ProgressBar { public NewProgressBar() { this.SetStyle(ControlStyles.UserPaint, true); base.ForeColor = Color.LimeGreen; base.BackColor = Color.LightGreen; } private Font _Font = SystemFonts.DefaultFont; private string _Text = ""; private bool _ShowPercent = true; [DefaultValue(typeof(System.Drawing.Color), "LimeGreen")] public override Color ForeColor { get { return base.ForeColor; } set { base.ForeColor = value; } } [DefaultValue(typeof(System.Drawing.Color), "LightGreen")] public override Color BackColor { get { return base.BackColor; } set { base.BackColor = value; } } [Category("Appearance")] [Description("The font of the progress text.")] [Browsable(true), EditorBrowsable(EditorBrowsableState.Always)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] public override Font Font { get { return _Font; } set { if (value == null) ResetFont(); else _Font = value; this.Invalidate(); } } public override void ResetFont() { this.Font = SystemFonts.DefaultFont; } private bool ShouldSerializeFont() { return !this.Font.Equals(SystemFonts.DefaultFont); } [Category("Appearance")] [Description("The text of the progress text.")] [Browsable(true), EditorBrowsable(EditorBrowsableState.Always)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] public override string Text { get { return _Text; } set { if (value == null) ResetText(); else _Text = value; this.Invalidate(); } } public override void ResetText() { this.Text = ""; } private bool ShouldSerializeText() { return !this.Text.Equals(""); } [Category("Appearance")] [Description("Show the percentage on the control.")] [Browsable(true), EditorBrowsable(EditorBrowsableState.Always)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] public bool ShowPercent { get { return _ShowPercent; } set { _ShowPercent = value; this.Invalidate(); } } public void ResetShowPercent() { this.ShowPercent = true; } private bool ShouldSerializeShowPercent() { return !this.ShowPercent.Equals(true); } protected override void OnPaintBackground(PaintEventArgs pevent) { // None... Helps control the flicker. } protected override void OnPaint(PaintEventArgs e) { const int inset = 2; // A single inset value to control teh sizing of the inner rect. using (Image offscreenImage = new Bitmap(this.Width, this.Height)) { using (Graphics offscreen = Graphics.FromImage(offscreenImage)) { Rectangle rect = new Rectangle(0, 0, this.Width, this.Height); if (ProgressBarRenderer.IsSupported) ProgressBarRenderer.DrawHorizontalBar(offscreen, rect); rect.Inflate(new Size(-inset, -inset)); // Deflate inner rect. rect.Width = (int)(rect.Width * ((double)this.Value / this.Maximum)); if (rect.Width == 0) rect.Width = 1; // Can't draw rec with width of 0. LinearGradientBrush brush = new LinearGradientBrush(rect, this.BackColor, this.ForeColor, LinearGradientMode.Vertical); offscreen.FillRectangle(brush, inset, inset, rect.Width, rect.Height); e.Graphics.DrawImage(offscreenImage, 0, 0); offscreenImage.Dispose(); int percent = (int)(((double)(this.Value - this.Minimum) / (double)(this.Maximum - this.Minimum)) * 100); using (Graphics gr = this.CreateGraphics()) { string text = this.Text.ToString(); string percentText = ""; if (_ShowPercent) { if (gr.MeasureString(text + " (100%)", _Font).Width > this.Width) { while (gr.MeasureString(text + "... (100%)", _Font).Width > this.Width) text = text.Substring(0, text.Length - 1); text += "..."; } percentText = text + " (" + percent.ToString() + "%)"; } else { if (gr.MeasureString(text, _Font).Width > this.Width) { while (gr.MeasureString(text + "...", _Font).Width > this.Width) text = text.Substring(0, text.Length - 1); text += "..."; } percentText = text; } gr.DrawString(percentText, _Font,//SystemFonts.DefaultFont, Brushes.Black, new PointF(this.Width / 2 - (gr.MeasureString(percentText, _Font).Width / 2.0F), this.Height / 2 - (gr.MeasureString(percentText, _Font).Height / 2.0F))); } } } } }
Wednesday, 25 March 2015
[C#] Progress Bar with Text
Subscribe to:
Post Comments (Atom)
Nice write up, thank you
ReplyDelete