65.9K
CodeProject 正在变化。 阅读更多。
Home

进度条上的文本自定义控件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.89/5 (25投票s)

2009年1月14日

CPOL

1分钟阅读

viewsIcon

120762

downloadIcon

9753

一个简单的自定义控件,允许在进度条顶部写入文本;基于 Jacob Jordan 的代码

CustomControls_src

Example2.png

引言

这是一个非常简单的进度条自定义控件实现,允许在进度条上显示文本。

背景

多年来,微软制作了一些进度条控件,但它们都缺少一些有用的功能。其中一项功能是在控件上居中显示文本。2008年12月,Jacob Jordan发布了一些代码来实现这一点。

int percent = (int)(((double)(progressBar1.Value - progressBar1.Minimum) /
(double)(progressBar1.Maximum - progressBar1.Minimum)) * 100);
using (Graphics gr = progressBar1.CreateGraphics())
{
    gr.DrawString(percent.ToString() + "%",
        SystemFonts.DefaultFont,
        Brushes.Black,
        new PointF(progressBar1.Width / 2 - (gr.MeasureString(percent.ToString() + "%",
            SystemFonts.DefaultFont).Width / 2.0F),
        progressBar1.Height / 2 - (gr.MeasureString(percent.ToString() + "%",
            SystemFonts.DefaultFont).Height / 2.0F)));
}

这是一个很好的解决方案,但必须手动对每个进度条进行操作。我认为直接从窗体设计器拖放预先制作好的自定义控件会更容易,所以我构建了一个控件,它封装了一个进度条,并处理文本的绘制和/或自动绘制百分比。

Using the Code

要使用此控件,只需将CustomControls.dll拖放到您的VS工具箱中,然后像拖放普通进度条一样将控件拖放到您的窗体中即可。

我没有公开进度条的所有属性。我公开的属性有:

  • int Minimum
  • int Maximum
  • int Value
  • int Step
  • ProgressBarStyle Style
  • Color BarColor(对应于ProgressBar.ForeColor

如果您需要访问其他内容,只需更改ProgressBar控件成员的访问修饰符并重新编译即可。

添加了两个新属性来处理文本

  • bool ShowPercentage
  • string CenterText

如果ShowPercentagetrue,则会自动计算并显示完成百分比,否则将显示CenterText的值。为了实现这一点,对原始代码进行了一些细微的修改。

private void UpdateText()
{
    string s;
    if (ShowPercentage)
    {
        int percent = (int)(((double)(Value - Minimum) / 
			(double)(Maximum - Minimum)) * 100);
        s = percent.ToString() + "%";
    }
    else
    {
        if (string.IsNullOrEmpty(CenterText))
        {
            //Don't draw anything
            return;
        }
        else
        {
            s = CenterText;
        }
    }

    using (Graphics gr = thePB.CreateGraphics())
    {
        gr.DrawString(s, Font, new SolidBrush(ForeColor),
            new PointF(Width / 2 - (gr.MeasureString(s, Font).Width / 2.0F),
            Height / 2 - (gr.MeasureString(s, Font).Height / 2.0F)));
    }
}

这是一个非常简单的实现,还有很多改进空间,但对于大多数用途来说,它是一个开箱即用的解决方案。

历史

  • 2009年1月14日:初始发布
© . All rights reserved.