向标准进度条控件添加百分比(或任何文本)






4.78/5 (19投票s)
非常快速和简单
引言
这篇非常简短的文章讨论了如何将文本(如标题中提到的百分比,但您可以添加任何您喜欢的内容)添加到进度条的中间。 您可以以非常简单的方式自己完成此操作,而无需为一些价格过高的 .NET 控件付费。 大约一年前,当我根本不是一个非常好的程序员时,我尝试完成这件事,但失败了。 我当时的尝试是在进度条的中心放置一个标签,并将其背景颜色设置为透明。 但是,这不起作用,因为当控件的背景颜色为透明时,它会显示其容器中后面的内容。 由于标签包含在表单本身中,而不是在进度条中,因此您会透过标签和进度条直接看到表单的背景颜色或背景图像。 因此,进度条中的标签已失效,接下来是什么? 我想出的解决方案是使用进度条的图形在中心绘制一个string
。
这是一张我制作的进度条的图片,显示了中间的百分比。

那是我应用程序的实际裁剪屏幕截图。它使用 8.25 Arial 字体。
Using the Code
我最初用于执行此操作的代码只需要 2 行代码。 但是,它存在一些错误,这就是我现在使用的代码
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)));
}
让我们分析一下。 percent 变量是进度条值的计算百分比。 现在,下一行有点复杂。 首先,它使用System.Drawing.Graphics
类的DrawString()
方法在进度条中绘制文本。 让我们分析一下每个参数
-
percent.ToString() + "%"
这确实是不言自明的。 它说明将显示什么文本。
-
SystemFonts.DefaultFont
那是显示的字体。 在我的示例屏幕截图中,我使用了 Arial。 但是,对于应用程序来说,这可能是一个更好的选择,因为它正在获取默认系统字体。
-
Brushes.Black
那是文本的颜色,可以很容易地更改。 它可以是
SolidBrush
,它是纯色的画笔。 或者,如果您想变得花哨,它可以是另一种类型的画笔(例如,TextureBrush
,它具有由图像定义的纹理来分配它)。 -
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))
那是文本将相对于进度条的左上角绘制的位置。 它定义了文本将被绘制位置的左上角。 这是最重要的部分,需要最多的解释。 让我们看一下我如何得出这些方程式来使文本居中
X 轴位置
progressBar1.Width / 2 - (gr.MeasureString(percent.ToString() + "%", SystemFonts.DefaultFont).Width / 2.0F)
progressBar1.Width / 2
部分将返回进度条的水平中心点(以像素为单位)。 现在,使用MeasureString
的部分计算要绘制的string
(percent.ToString() + "%"
)的宽度(以像素为单位)。 然后将其值减半并从progressBar1.Width / 2
中减去,以便最终的 X 轴位置会将文本的中心点精确定位在进度条的中心点。Y 轴位置
progressBar1.Height / 2 - (gr.MeasureString(percent.ToString() + "%", SystemFonts.DefaultFont).Height / 2.0F)
与 X 点一样,
progressBar1.Height / 2
计算进度条的垂直中心点。 同样像 X 点一样,MeasureString
方法用于计算文本的高度。 然后将其减半,并从“progressBar1.Height / 2
”中减去,以完美地垂直居中文本。
结论
要实际使用此代码,必须在更改进度条的值后立即将其放置。 如果由于某种原因,进度条值的更改没有刷新它并清除先前绘制的文本,只需在使用此代码之前调用进度条的Refresh
方法。 当然,我的进度条被称为progressBar1
,但这可以很容易地更改。 所需要的只是复制/粘贴。 尽情享受!