File: System\Windows\Forms\Controls\ProgressBar\ProgressBarRenderer.cs
Web Access
Project: src\src\System.Windows.Forms\src\System.Windows.Forms.csproj (System.Windows.Forms)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Drawing;
using System.Windows.Forms.VisualStyles;
 
namespace System.Windows.Forms;
 
/// <summary>
///  This is a rendering class for the ProgressBar control.
/// </summary>
public static class ProgressBarRenderer
{
    // Make this per-thread, so that different threads can safely use these methods.
    [ThreadStatic]
    private static VisualStyleRenderer? t_visualStyleRenderer;
 
    /// <summary>
    ///  Returns true if this class is supported for the current OS and user/application settings,
    ///  otherwise returns false.
    /// </summary>
    public static bool IsSupported => VisualStyleRenderer.IsSupported; // no downlevel support
 
    /// <summary>
    ///  Renders a horizontal bar.
    /// </summary>
    public static void DrawHorizontalBar(Graphics g, Rectangle bounds)
    {
        InitializeRenderer(VisualStyleElement.ProgressBar.Bar.Normal);
 
        t_visualStyleRenderer.DrawBackground(g, bounds);
    }
 
    /// <summary>
    ///  Renders a vertical bar.
    /// </summary>
    public static void DrawVerticalBar(Graphics g, Rectangle bounds)
    {
        InitializeRenderer(VisualStyleElement.ProgressBar.BarVertical.Normal);
 
        t_visualStyleRenderer.DrawBackground(g, bounds);
    }
 
    /// <summary>
    ///  Renders a number of constant size horizontal chunks in the given bounds.
    /// </summary>
    public static void DrawHorizontalChunks(Graphics g, Rectangle bounds)
    {
        InitializeRenderer(VisualStyleElement.ProgressBar.Chunk.Normal);
 
        t_visualStyleRenderer.DrawBackground(g, bounds);
    }
 
    /// <summary>
    ///  Renders a number of constant size vertical chunks in the given bounds.
    /// </summary>
    public static void DrawVerticalChunks(Graphics g, Rectangle bounds)
    {
        InitializeRenderer(VisualStyleElement.ProgressBar.ChunkVertical.Normal);
 
        t_visualStyleRenderer.DrawBackground(g, bounds);
    }
 
    /// <summary>
    ///  Returns the  width/height of a single horizontal/vertical progress bar chunk.
    /// </summary>
    public static int ChunkThickness
    {
        get
        {
            InitializeRenderer(VisualStyleElement.ProgressBar.Chunk.Normal);
 
            return t_visualStyleRenderer.GetInteger(IntegerProperty.ProgressChunkSize);
        }
    }
 
    /// <summary>
    ///  Returns the  width/height of the space between horizontal/vertical progress bar chunks.
    /// </summary>
    public static int ChunkSpaceThickness
    {
        get
        {
            InitializeRenderer(VisualStyleElement.ProgressBar.Chunk.Normal);
 
            return t_visualStyleRenderer.GetInteger(IntegerProperty.ProgressSpaceSize);
        }
    }
 
    [MemberNotNull(nameof(t_visualStyleRenderer))]
    private static void InitializeRenderer(VisualStyleElement element)
    {
        if (t_visualStyleRenderer is null)
        {
            t_visualStyleRenderer = new VisualStyleRenderer(element);
        }
        else
        {
            t_visualStyleRenderer.SetParameters(element);
        }
    }
}