【发布时间】:2015-05-04 15:08:35
【问题描述】:
我正在尝试了解如何自定义或创建一个没有边框和方形角的 .NET ProgressBar。我不尝试使用已经可用的自定义进度条的主要原因是我没有找到与系统默认进度条具有相同主题的任何进度条。
所以我有三个问题。
如何从进度条中移除边框?
如何显示带有方角的进度条?
如何让系统默认 ProgressBar 主题在自定义控件中使用?
我怀疑前两个是否可行,但我认为第三个可以完成,即使我不知道该怎么做。
更新:
以下代码不知何故解决了前两个问题,但出现了一个新问题,即当进度条的值为1 时,它显示没有进度。我相信这不是一个大问题,但理想情况下不应该是这样。
class ProgressBarEx : ProgressBar
{
const int WmPaint = 15;
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
switch (m.Msg)
{
case WmPaint:
using (var graphics = Graphics.FromHwnd(Handle))
{
GraphicsPath path = new GraphicsPath();
Rectangle newRectangle = ClientRectangle;
newRectangle.Inflate(-2, -2);
path.AddRectangle(newRectangle);
Region = new Region(path);
}
break;
}
}
}
更新 2:
我通过为自定义进度条声明一个新属性percentProgress 并利用它来设置真正的Value,设法“修复”了Value;
this.Value = Convert.ToInt32(((((float)percentProgress / 100f) * (float)98) + 1) / 100f) * ((float)Maximum - (float)Minimum));
我会将这个问题留待一段时间,以防万一有人有更好的解决方案。
【问题讨论】:
-
WPF?表格? ASP? GTK#?你正在开发什么 UI 框架?
-
@RonBeyer 哦。对不起。忘了提。这是winforms。
-
如果您使用的是 WPF,这将非常简单,但 winforms 是一个不同的怪物。您基本上最好创建一个新控件,从
ProgressBar继承,并处理绘制事件。 -
@RonBeyer 我确实尝试处理绘制事件并排除了进度条的边框,但是当进度条的宽度为 100 或更少像素时,进度条不会显示任何进度,并且
Value是1,同样,当Value是99时,它看起来就像是100。 -
当您覆盖绘画事件时,您将接管所有绘画,而不仅仅是您要排除的部分。显示您尝试的绘制事件的代码,我们可以指出您做错了什么。
标签: c# .net winforms progress-bar