我正在用 C# 制作一个自定义进度条,我想在进度条顶部显示百分比。我需要它,以便当栏到达文本时,它会改变颜色。以我在下面制作的图像为例:
假设左边的橙色矩形是进度条,黑色矩形是空白。
无论如何我可以使用 GDI 重新创建它吗?
在此先感谢,帕特
您可以通过在您选择的控件上覆盖绘画来做到这一点,
首先绘制黑色背景和橙色文字
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
等,因为这会闪烁,但这应该是一个很好的开始示例。
结果: