将文本拆分为2种颜色

时间:2013-06-23 23:03:51

标签: c# .net text gdi+

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

enter image description here

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

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

提前致谢, 专利

1 个答案:

答案 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等,因为这会闪烁,但这应该是一个很好的开始示例。

结果:

enter image description here

enter image description here