我在C#中制作自定义进度条,我想在条形图上显示百分比。我需要它,以便当栏到达文本时,它会改变颜色。以我下面的图像为例:
假设左侧的橙色矩形是进度条,黑色矩形是空白区域。
无论如何我可以使用GDI重新创建吗?
提前致谢, 专利
答案 0 :(得分: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
等,因为这会闪烁,但这应该是一个很好的开始示例。
结果: