Custom Implementation for Displaying Text on C# WinForms ProgressBar

Dec 07, 2025 · Programming · 7 views · 7.8

Keywords: C# | WinForms | ProgressBar | Custom Control | Text Display

Abstract: In C# WinForms applications, the standard ProgressBar control does not support direct text display. This article explores creating custom controls like InfoProgressBar by combining ProgressBar and Label, overriding OnPaint for custom drawing, and discusses flicker avoidance, Marquee style implementation, and thread safety considerations.

Problem Background

In C# WinForms development, the ProgressBar control is commonly used to indicate operation progress, but it lacks built-in text display functionality for status messages like "Initiating Registration". Users often need to update the control from different threads, adding complexity to implementation.

Solution Overview

Main solutions include creating custom controls or overriding the painting methods of existing controls. A best practice is to design a composite control, such as InfoProgressBar, which combines ProgressBar with Label for flexible text display. Alternatively, overriding the OnPaint method allows for finer control over text rendering.

Custom Control Method

Create a custom control named InfoProgressBar that inherits from UserControl. This control includes a ProgressBar sub-control and one or more Label sub-controls. Through layout management, the Label can be positioned above or inside the ProgressBar to display custom text. This approach avoids directly modifying the internal drawing logic of ProgressBar, enhancing maintainability.

Overriding OnPaint Method

Another method is to inherit from the ProgressBar class and override the OnPaint method for custom text drawing. In the override, first call the base implementation to draw the progress bar background, then use the Graphics object to draw text at a specified location. For example, define an enumeration to choose between displaying percentage or custom text, and set text styles accordingly.

Avoiding Flicker

When overriding OnPaint, text may flicker due to frequent repaints. To mitigate this, adjust ControlStyles flags, such as setting UserPaint and AllPaintingInWmPaint. Additionally, disabling visual styles via the SetWindowTheme API can reduce flicker. Example code:

[DllImportAttribute("uxtheme.dll")] private static extern int SetWindowTheme(IntPtr hWnd, string appname, string idlist); protected override void OnHandleCreated(EventArgs e) { SetWindowTheme(this.Handle, "", ""); base.OnHandleCreated(e); }

Marquee Progress Bar Implementation

The ProgressBar control supports Marquee style by setting the Style property to ProgressBarStyle.Marquee. In custom controls, expose this property to allow dynamic switching. Combined with text display, Marquee progress bars can provide a more dynamic user experience.

Thread Safety Considerations

Since ProgressBar is often updated from background threads, ensure UI updates are thread-safe. Use Control.Invoke or BeginInvoke methods to execute updates on the UI thread, such as setting the Value property or updating text. This prevents cross-thread exceptions and ensures smooth interface performance.

Code Examples

Below is a simplified InfoProgressBar class example demonstrating how to combine ProgressBar and Label:

public class InfoProgressBar : UserControl { private ProgressBar progressBar; private Label label; public InfoProgressBar() { progressBar = new ProgressBar(); label = new Label(); this.Controls.Add(progressBar); this.Controls.Add(label); // Set layout and properties } public string TextToDisplay { get { return label.Text; } set { label.Text = value; } } // Expose ProgressBar properties for external access public int Value { get { return progressBar.Value; } set { progressBar.Value = value; } } }

For the OnPaint override method, example code includes logic for drawing text and avoiding flicker.

Summary

Efficient text display on C# WinForms ProgressBar can be achieved through custom controls or overriding painting methods. The composite control approach is recommended for improved code readability and extensibility, while addressing flicker and thread safety issues. These techniques enhance application user interfaces and interaction experiences.

Copyright Notice: All rights in this article are reserved by the operators of DevGex. Reasonable sharing and citation are welcome; any reproduction, excerpting, or re-publication without prior permission is prohibited.