1

我正在用 C# 制作一个自定义进度条,我想在进度条顶部显示百分比。我需要它,以便当栏到达文本时,它会改变颜色。以我在下面制作的图像为例:

在此处输入图像描述

假设左边的橙色矩形是进度条,黑色矩形是空白。

无论如何我可以使用 GDI 重新创建它吗?

在此先感谢,帕特

4

1 回答 1

4

您可以通过在您选择的控件上覆盖绘画来做到这一点,

首先绘制黑色背景和橙色文字

    e.Graphics.FillRectangle(Brushes.Black, panel1.ClientRectangle);
    e.Graphics.DrawString("StackOverflow", Font, Brushes.Orange, panel1.ClientRectangle);

然后绘制覆盖并剪辑到进度值的大小

    var clipRect = new Rectangle(0, 0, (panel1.Width / 100) * _progress, panel1.Height);
    e.Graphics.SetClip(clipRect);
    e.Graphics.FillRectangle(Brushes.Orange, clipRect);
    e.Graphics.DrawString("StackOverflow", Font, Brushes.Black, 0, 0);

这是一个工作示例,Panel用作覆盖绘画的控件(只需将面板添加到表单)

例子:

public partial class Form1 : Form
{
    private Timer _progresstimer = new Timer();
    private int _progress = 0;

    public Form1()
    {
        InitializeComponent();
        panel1.Paint += new PaintEventHandler(panel1_Paint);
        _progresstimer.Interval = 250;
        _progresstimer.Tick += (s, e) =>
         {
             if (_progress < 100)
             {
                 _progress++;
                 panel1.Invalidate();
                 return;
             }
             _progress = 0;
             panel1.Invalidate();
         };
        _progresstimer.Start();
    }



    void panel1_Paint(object sender, PaintEventArgs e)
    {
        e.Graphics.FillRectangle(Brushes.Black, panel1.ClientRectangle);
        e.Graphics.DrawString("StackOverflow", Font, Brushes.Orange, panel1.ClientRectangle);

        var clipRect = new Rectangle(0, 0, (panel1.Width / 100) * _progress, panel1.Height);
        e.Graphics.SetClip(clipRect);
        e.Graphics.FillRectangle(Brushes.Orange, clipRect);
        e.Graphics.DrawString("StackOverflow", Font, Brushes.Black, 0, 0);
    }
}

您将需要设置DoubleBuffering等,因为这会闪烁,但这应该是一个很好的开始示例。

结果:

在此处输入图像描述

在此处输入图像描述

于 2013-06-24T00:26:27.547 回答