Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > .NET > C#.NET > 利用Visual C#打造一个平滑的进度条
【标  题】:利用Visual C#打造一个平滑的进度条
【关键字】:C,C#,Visual,进度条,is,Visual
【来  源】:网络

利用Visual C#打造一个平滑的进度条

Your Ad Here 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、在 Build 菜单中,点击 Build Solution 来编译整个项目。

建立一个简单的客户端应用

   1、在 File 菜单中,点击 New ,再点击Project。

   2、在 Add New Project 对话框中,在 Project Types 中点击 Visual C# Projects,在 Templates 中点击 Windows Application,并点击 OK。

   3、按照下面的步骤,在 Form 上添加两个 SmoothProgressBar 实例:

   a、在 Tools 菜单上,点击 Customize Toolbox。

   b、点击 .NET Framework Components 页。

   c、点击 Browse,然后选中你在 Create a Custom ProgressBar Control 段中建立的 SmoothProgressBar.dll 文件。

   d、点击 OK。您可以看到在 toolbox 中已经有 SmoothProgressBar 控件了。

   e、从 toolbox 中拖两个 SmoothProgressBar 控件的实例到该 Windows Application 项目中的默认 form 上。

   4、从 toolbox 页中拖一个 Timer 控件到 form 上。

   5、将下面的代码添加到 Timer 控件的 Tick 事件中:

if (this.smoothProgressBar1.Value > 0)
{
  this.smoothProgressBar1.Value--;
  this.smoothProgressBar2.Value++;
}
else
{
  this.timer1.Enabled = false;
}

   6、从 toolbox 页中拖一个 Button 控件到 form 上。

   7、将下面的代码添加到 Button 控件的 Click 事件中:

this.smoothProgressBar1.Value = 100;
this.smoothProgressBar2.Value = 0;

this.timer1.Interval = 1;
this.timer1.Enabled = true;

   8、在 Debug 菜单中,点击 Start 来运行样例项目。

   9、点击Button。注意观察那两个进度指示器。一个逐渐减小,另一个逐渐增加。
贪婪算法---货箱装船:【上一篇】
双向链表的排序:【下一篇】
【相关文章】
  • C语言常用的三种排序方法总结与探讨
  • C#程序控制开始菜单的弹出
  • 用C#制作一个目录选择对话框
  • Visual C#中实现窗体间的数据传递之一
  • Visual C#实现窗体间数据传递之二
  • 经典C程序100例==11--20
  • 经典C程序100例==21--30
  • 经典C程序100例==31--40
  • 经典C程序100例==41--50
  • 通过键盘操作的,想进行c图形化编程的可能有参考价值
  • 【随机文章】
  • 网络实验报告 2006.5.26
  • 广域网网络基础知识(-)
  • CoolMenus Pro ver 2.03c
  • java多线程设计wait/notify机制
  • FreeBSD idled 命令介绍
  • /etc/logindevperm
  • Asp.net导航控件真的值得用吗?
  • 准确、完整地把握Flash动画设计的知识体系——Flash用户入门必读
  • linux网络知识(三):TCP/IP设置内容
  • WinForm控件开发总结(六)-----控件属性类型转换器代码详解
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.