如何创建一个平滑的进度栏在 Visual C# 中

文章翻译 文章翻译
文章编号: 323116 - 查看本文应用于的产品
为这篇文章的一个 Microsoft Visual Basic.net 版本,请参阅 323088
展开全部 | 关闭全部

本文内容

概要

本文演示了如何创建一个简单的自定义 用户控件 创建一个平滑滚动 ProgressBar 控件。

在早期版本的 ProgressBar 控件的如用 Microsoft Windows 公共控件 ActiveX 控件提供的版本中您可以在两个不同的视图中查看进度。若要控制这些视图,使用包括标准和平滑设置 滚动 属性。平滑滚动功能产生纯色块的类型的值,该值代表进度,颜色和标准滚动显示分段和由一系列小块或矩形组成。

ProgressBar 控件,包括用 Microsoft Visual C# 支持标准的设置。

在这篇文章中的代码示例阐释了如何创建一个控件,支持以下属性:
  • 最小值。此属性获取或设置有关进度的有效值的范围较小的值。此属性的默认值是零 (0) ; 您不能将此属性设置为负值。
  • 最大。此属性获取或设置有关进度的有效值的范围上限的值。此属性的默认值为 100。
  • 。此属性获取或设置在当前级别的进度。值必须 最小最大 属性定义的范围内。
  • ProgressBarColor。此属性获取或设置进度栏的颜色。

创建自定义 ProgressBar 控件

  1. 请按照下列步骤创建一个新的 Windows 控件库项目在 Visual C# 中操作:
    1. 启动 Microsoft Visual Studio。
    2. 文件 菜单上指向 新建,然后单击 项目
    3. 新建项目 对话框中单击 Visual C#项目类型,下,然后单击在 模板 下的 Windows 窗体控件库

      注意在 Visual Studio.net 2003 年单击而不是 Visual C#Visual C# 项目
    4. 名称 框中键入 SmoothProgressBar,然后单击 确定
    5. 在方案管理中重命名默认类模块从 UserControl1.cs SmoothProgressBar.cs。
    6. 为该 用户控件 对象属性窗口中 名称 属性从改 UserControl1SmoothProgressBar
  2. 此位置,您通常从该控件的类继承,然后添加来扩展现有控件附加的功能。但是,ProgressBar 类是 密封 的并且不能被继承。因此,则必须生成该控件从一开始。

    将下面的代码添加到从用户控件派生的类中的该 SmoothProgressBar.cs 文件。

    注意在 Visual Studio.net 2003 年添加到用户控件派生类的类模块代码只是在 Windows 窗体设计器生成的代码节之后。
    int min = 0;	// Minimum value for progress range
    int max = 100;	// Maximum value for progress range
    int val = 0;		// Current progress
    Color BarColor = Color.Blue;		// Color of progress meter
    
    protected override void OnResize(EventArgs e)
    {
    	// Invalidate the control to get a repaint.
    	this.Invalidate();
    }
    
    protected override void OnPaint(PaintEventArgs e)
    {
    	Graphics g = e.Graphics;
    	SolidBrush brush = new SolidBrush(BarColor);
    	float percent = (float)(val - min) / (float)(max - min);
    	Rectangle rect = this.ClientRectangle;
    
    	// Calculate area for drawing the progress.
    	rect.Width = (int)((float)rect.Width * percent);
    
    	// Draw the progress meter.
    	g.FillRectangle(brush, rect);
    
    	// Draw a three-dimensional border around the control.
    	Draw3DBorder(g);
    
    	// Clean up.
    	brush.Dispose();
    	g.Dispose();		
    }
    
    public int Minimum
    {
    	get
    	{
    		return min;
    	}
    
    	set
    	{
    		// Prevent a negative value.
    		if (value < 0)
    		{
    			min = 0;
    		}
    		
    		// Make sure that the minimum value is never set higher than the maximum value.
    		if (value > max)
    		{
    			min = value;
    			min = value;
    		}
    		
    		// Ensure value is still in range
    		if (val < min)
    		{
    			val = min;
    		}
    
    		// Invalidate the control to get a repaint.
    		this.Invalidate();
    	}
    }
    
    public int Maximum
    {
    	get
    	{
    		return max;
    	}
    
    	set
    	{
    		// Make sure that the maximum value is never set lower than the minimum value.
    		if (value < min)
    		{
    			min = value;
    		}
    
    		max = value;
    
    		// Make sure that value is still in range.
    		if (val > max)
    		{
    			val = max;
    		}
    
    		// Invalidate the control to get a repaint.
    		this.Invalidate();
    	}
    }
    
    public int Value
    {
    	get
    	{
    		return val;
    	}
    
    	set
    	{
    		int oldValue = val;
    
    		// Make sure that the value does not stray outside the valid range.
    		if (value < min)
    		{
    			val = min;
    		}
    		else if (value > max)
    		{
    			val = max;
    		}
    		else
    		{
    			val = value;
    		}
    
    		// Invalidate only the changed area.
    		float percent;
    
    		Rectangle newValueRect = this.ClientRectangle;
    		Rectangle oldValueRect = this.ClientRectangle;
    
    		// Use a new value to calculate the rectangle for progress.
    		percent = (float)(val - min) / (float)(max - min);
    		newValueRect.Width = (int)((float)newValueRect.Width * percent);
    
    		// Use an old value to calculate the rectangle for progress.
    		percent = (float)(oldValue - min) / (float)(max - min);
    		oldValueRect.Width = (int)((float)oldValueRect.Width * percent);
    
    		Rectangle updateRect = new Rectangle();
    		
    		// Find only the part of the screen that must be updated.
    		if (newValueRect.Width > oldValueRect.Width)
    		{
    			updateRect.X = oldValueRect.Size.Width;
    			updateRect.Width = newValueRect.Width - oldValueRect.Width;
    		}
    		else
    		{
    			updateRect.X = newValueRect.Size.Width;
    			updateRect.Width = oldValueRect.Width - newValueRect.Width;
    		}
    
    		updateRect.Height = this.Height;
    
    		// Invalidate the intersection region only.
    		this.Invalidate(updateRect);
    	}
    }
    
    public Color ProgressBarColor
    {
    	get
    	{
    		return BarColor;
    	}
    
    	set
    	{
    		BarColor = value;
    
    		// Invalidate the control to get a repaint.
    		this.Invalidate();
    	}
    }
    
    private void Draw3DBorder(Graphics g)
    {
    	int PenWidth = (int)Pens.White.Width;
    
    	g.DrawLine(Pens.DarkGray, 
    		new Point(this.ClientRectangle.Left, this.ClientRectangle.Top),
    		new Point(this.ClientRectangle.Width - PenWidth, this.ClientRectangle.Top));
    	g.DrawLine(Pens.DarkGray,
    		new Point(this.ClientRectangle.Left, this.ClientRectangle.Top), 
    		new Point(this.ClientRectangle.Left, this.ClientRectangle.Height - PenWidth));
    	g.DrawLine(Pens.White,
    		new Point(this.ClientRectangle.Left, this.ClientRectangle.Height - PenWidth), 
    		new Point(this.ClientRectangle.Width - PenWidth, this.ClientRectangle.Height - PenWidth));
    	g.DrawLine(Pens.White,
    		new Point(this.ClientRectangle.Width - PenWidth, this.ClientRectangle.Top), 
    		new Point(this.ClientRectangle.Width - PenWidth, this.ClientRectangle.Height - PenWidth));
    } 
    					
  3. 生成 菜单上单击以编译该项目的 生成解决方案

创建一个示例客户端应用程序

  1. 文件 菜单上指向 新建,然后单击 项目
  2. 添加新项目 对话框中单击 Visual C#项目类型 下,单击 模板,下的 Windows 窗体应用程序,然后单击 确定

    注意在 Visual Studio.net 2003 年单击而不是 Visual C#Visual C# 项目
  3. 请按照下列步骤将 SmoothProgressBar 控件的两个实例添加到窗体:
    1. 工具 菜单上单击 选择工具箱项

      注意在 Visual Studio.net 2003 年单击 选择工具箱项 代替 自定义工具箱
    2. 单击 .net Framework 组件 选项卡。
    3. 单击 浏览,然后找到您在"Create a custom ProgressBar control"一节中创建该 SmoothProgressBar.dll 文件。
    4. 单击 确定。请注意将 SmoothProgressBar 控件添加到工具箱中。
    5. SmoothProgressBar 控件的两个实例从工具箱拖动到 Windows 应用程序项目的默认窗体中。
  4. 将一个 Timer 控件从工具箱拖动到窗体。
  5. 将下面的代码添加到的 Timer 控件 Tick 事件:
    if (this.smoothProgressBar1.Value > 0)
    {
    	this.smoothProgressBar1.Value--;
    	this.smoothProgressBar2.Value++;
    }
    else
    {
    	this.timer1.Enabled = false;
    } 
    					
  6. 将一个 按钮 控件从工具箱拖动到窗体。
  7. 将下面的代码添加到 按钮 控件的 Click 事件:
    this.smoothProgressBar1.Value = 100;
    this.smoothProgressBar2.Value = 0;
    			
    this.timer1.Interval = 1;
    this.timer1.Enabled = true; 
    					
  8. 调试 菜单上单击 $ 开始 以运行该示例项目。
  9. 单击按钮。请注意,两个进度指示器显示文本"进度"。一个进度指示器显示进度不断增加的方式和其他进度指示器显示一个降低或 $ 倒计时方式中的进度。

属性

文章编号: 323116 - 最后修改: 2008年8月1日 - 修订: 4.1
这篇文章中的信息适用于:
  • Microsoft Visual C# 2008 Express Edition
  • Microsoft Visual C# 2005 Express Edition
关键字:?
kbmt kbsweptvs2008 kbhowtomaster KB323116 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 323116
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com