如何建立平滑的進度列在 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 Form 控制項程式庫

      附註在 Visual 的 Studio.NET 2003年中按一下 [Visual C# 專案 而非 Visual C#]。
    4. 在 [名稱] 方塊中輸入 SmoothProgressBar,],然後再按一下 [確定]]。
    5. 在 [專案總管] 中重新命名到 SmoothProgressBar.cs UserControl1.cs 從預設類別模組]。
    6. 在為 使用者控制項 物件的 [屬性] 視窗中變更 [名稱] 屬性從 UserControl1SmoothProgressBar
  2. 這個時候您通常是繼承自該控制項的類別,然後再新增額外的功能,來擴充現有的控制項。不過,ProgressBar 類別是 密封,而且無法被繼承。因此,您就必須建置控制項從開始處。

    將下列程式碼加入至 SmoothProgressBar.cs 檔案的衍生自使用者控制項的類別中。

    附註在 Visual 的 Studio.NET 2003年中將程式碼加入至使用者控制項衍生] 類別的類別模組,只在 「 Windows Form 設計工具產生的程式碼 」 一節之後。
    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 Form 應用程式] 範本,] 下方,然後再按一下 [[確定]]。

    附註在 Visual 的 Studio.NET 2003年中按一下 [Visual C# 專案 而非 Visual C#]。
  3. 請依照下列步驟將 SmoothProgressBar 控制項的兩個執行個體加入至表單:
    1. 在 [工具] 功能表上按一下 [選擇工具箱項目]。

      附註在 Visual 的 Studio.NET 2003年中按一下 [自訂工具箱 代替 選擇工具箱項目]。
    2. 按一下 [.NET Framework 元件] 索引標籤。
    3. 按一下 [瀏覽],然後再找出 SmoothProgressBar.dll 檔案在 Create a custom ProgressBar control 」 一節中建立。
    4. 按一下 [確定]。請注意 SmoothProgressBar 控制項加入至工具箱。
    5. 將兩個 SmoothProgressBar 控制項執行個體從工具箱拖曳至 Windows 應用程式專案的預設表單。
  4. Timer 控制項從工具箱拖曳至表單。
  5. 將下列程式碼加入至 Tick 事件的 Timer 控制項:
    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
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本: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