ASP.NET可互動式位元影像表單設計(3)

來源:互聯網
上載者:User
asp.net|互動|設計 建構函式
    建構函式傳遞三個參數:包含圓的中心座標的點、圓的半徑以及一個 System.Drawing.Color 結構(包含用於繪製圓輪廓的顏色)。
  
    然後我們根據中心和半徑計算邊框,並將筆顏色項設定為我們傳遞的顏色對象。
  
    繪圖代碼
    Draw 方法重載實際上非常簡單:它根據我們儲存在建構函式中的顏色對象建立一個筆對象,然後使用該筆,調用 Graphics.DrawEllipse 方法繪製圓,同時傳遞了我們早先建立的邊框。
  
    圖形、筆和畫筆
    這裡我們需要解釋一下 Graphics、Pen 和 Brush 對象。(在開始填充我們的可填充對象時,就會看到 Brush 對象。)
  
    Graphics 對象代表一個與某個真實繪圖空間相關聯的虛擬化的繪圖空間。虛擬化是指,通過在 Graphics 對象上繪圖,我們可以使用相同的 Graphics 方法在與該對象相關聯的任何類型的實際表面上繪圖。對於那些習慣於使用 MFC 或 Microsoft Windows? SDK 編程的使用者,Graphics 對象相當於 Windows 中稱為“裝置上下文”(或 DC)的 .NET 版本。
  
    在此 Windows 表單應用程式中,傳遞到 Draw 方法的 Graphics 對象將與螢幕上的一個視窗相關聯 -- 這裡是 PictureBox。在我們的 Microsoft ASP.NET 應用程式中使用這一代碼時,傳遞給 Draw 方法的 Graphics 對象將與一個位元影像映像相關聯。它也可以和印表機或其他裝置相關聯。
  
    這個方案的優點是我們可以使用相同的繪圖代碼在不同的表面上繪圖。在我們的繪圖代碼中,我們不需要知道任何有關螢幕、位元影像、印表機等等之間的不同 -- .NET Framework(以及底層的作業系統)可以為我們處理所有細節。
  
    利用相同的標記,筆和畫筆成為虛擬化的繪圖工具。筆代表線條屬性 -- 顏色、寬度、樣式,甚至可以是用來繪製線的位元影像。畫筆代表一個填充地區的屬性 -- 顏色、樣式,甚至可以是用來填充地區的位元影像。
  
    在使用 Using 後清除(或至少 Dispose)
    Graphics、Pen 和 Brush 對象都與相似類型的 Windows 對象相關聯。這些 Windows 對象分配在作業系統的記憶體中 -- 這些記憶體尚未被 .NET 運行時管理。長時間將這些對象駐留在記憶體中會導致效能問題,並且在 Microsoft Windows 98 下,當圖形堆填滿時會導致繪圖問題。因此,我們應儘快釋放這些 Windows 對象。
  
    當相應的 .NET Framework 對象完成操作並回收記憶體後,.NET 運行時會自動釋放 Windows 對象。但回收記憶體的時間會很長 -- 如果我們不迅速釋放這些對象,所有不幸的事情(包括填滿 Windows 堆)都可能發生。在該應用程式的 ASP.NET 版本中,由於很多使用者在同一台伺服器上訪問該應用程式,所以這種現象會更加嚴重。
  
    因為這些對象與未管理的資源相關聯,所以它們實現 IDisposable 介面。該介面有一個方法,即 Dispose,它將 .NET Framework 對象從 Windows 對象中分離出來,並釋放 Windows 對象,從而使電腦處於良好的狀態。
  
    這時您只需完成一項任務:確保在使用完該對象後,調用 Dispose 方法。
  
    Visual Basic .NET 代碼中顯示了這一內容的經典形式:首先建立對象,然後在一個 Try 塊中使用該對象,最後在 Finally 塊中清理該對象。Try/Finally 能夠確保即使出現異常也會清理對象。(在本例中,我們調用的繪圖方法可能不會引發異常,所以可能並不需要 Try/Finally 塊。但掌握這些技巧很有用,因此 Dr. GUI 也希望向您示範這一正確方法。)
  
    這種形式很常見,因此 C# 為其提供了一個私人語句:using。C# 代碼中的 using 語句等同於 Visual Basic .NET 代碼中的聲明和 Try/Finally -- 但更為簡潔、方便,並減少了發生錯誤的可能性。(Dr. GUI 不清楚為什麼 Visual Basic .NET 不包含一些諸如 using 的語句。)
  
    介面
    有些(但不是全部)可繪製對象可以被填充。某些對象(如點和線)不能被填充,因為它們不是封閉的地區,而矩形和圓等對象可以是中空的,或者被填充。
  
    另一方面,就象將所有可繪製對象作為多態處理一樣,我們也可以將所有可填充對象作為多態處理,這會很方便。例如,如同我們將所有可繪製對象放到一個集合中,通過遍曆集合并在每個對象上調用 Draw 來繪製對象一樣,我們可以將所有可填充對象放到一個集合中,而不考慮這些可填充對象的實際類型。因此,我們使用某種機制(如繼承)來獲得真正的多態。
  
    因為不是所有的可繪製對象都可以被填充,因此不能將 Fill 方法的聲明放在抽象基類中。.NET Framework 不允許類的多重繼承,所以也不能將其放在另一個抽象基類中。並且如果我們從不是非可填充類的其他基類中派生出可填充對象,則不能將所有可繪製對象作為多態處理。
  
    但 .NET Framework 支援介面 -- 並提供了一個可實現任意數量的介面的類。介面不具有任何實現 -- 沒有代碼,也沒有任何資料。因此,實現介面的類必須提供所有內容。
  
    介面所能包含的只有聲明。以下是我們在 C# 中的介面 IFillable。單擊此處在新視窗中查看全部源檔案。
  
  
  
    C#
  public interface IFillable {
  void Fill(Graphics g);
  Color FillBrushColor { get; set; }
  }
  
  
    以下是等同的 Visual Basic .NET 代碼。單擊此處在新視窗中查看全部源檔案。
  
    Visual Basic .NET
  
  Public Interface IFillable
  Sub Fill(ByVal g As Graphics)
  Property FillBrushColor() As Color
  End Interface
  
    我們不需要聲明方法或者 virtual/Overridable 或 abstract/MustOverride 屬性以及任何其他項,因為介面中的所有方法和屬性都自動化佈建為公開的和 abstract/MustOverride。
  
    使用一個屬性:不能在介面中包含資料
    請注意,雖然我們不能在介面中聲明欄位,但可以聲明一個屬性,因為屬性實際上是作為方法實現的。
  
    但這樣做會給介面的實現者帶來負擔,下面就會看到。實現者必須實現 get 和 set 方法,以及實現該屬性所必需的任何資料。如果實現非常複雜,則可以編寫一個 helper 類以封裝某些部分。在本文稍後我們將就一個略微不同的上下文環境顯示如何使用 helper 類。
  
    實現介面
    我們已經定義了介面,現在可以在類中實現它了。請注意,我們必須提供所實現介面的完整實現:不能只從中選取一部分。
  
    下面我們看看 C# 中 DFilledRectangle 類的代碼。
  
  
    C#
  public class DFilledCircle : DHollowCircle, IFillable
  {
  public DFilledCircle(Point center, int radius, Color penColor,
  Color brushColor) : base(center, radius, penColor) {
  this.brushColor = brushColor;
  }
  
  public void Fill(Graphics g) {
  using (Brush b = new SolidBrush(brushColor)) {
  g.FillEllipse(b, bounding);
  }
  }
  protected Color brushColor;
  public Color FillBrushColor {
  get {
  return brushColor;
  }
  set {
  brushColor = value;
  }
  }
  public override void Draw(Graphics g) {
  Fill(g);
  base.Draw(g);
  }
  }
  
  
    以下是 Visual Basic .NET 中 DFilledRectangle 類的代碼。
  
  
    Visual Basic .NET
  Public Class DFilledRectangle
  Inherits DHollowRectangle
  Implements IFillable
  Public Sub New(ByVal rect As Rectangle, _
  ByVal penColor As Color, ByVal brushColor As Color)
  MyBase.New(rect, penColor)
  Me.brushColor = brushColor
  End Sub
  Public Sub Fill(ByVal g As Graphics) Implements IFillable.Fill
  Dim b = New SolidBrush(FillBrushColor)
  Try
  g.FillRectangle(b, bounding)
  Finally
  b.dispose()
  End Try
  End Sub
  Protected brushColor As Color
  Public Property FillBrushColor() As Color _
  Implements IFillable.FillBrushColor
  Get
  Return brushColor
  End Get
  Set(ByVal Value As Color)
  brushColor = Value
  End Set
  End Property
  Public Overrides Sub Draw(ByVal g As Graphics)
  Dim p = New Pen(penColor)
  Try
  Fill(g)
  MyBase.Draw(g)
  Finally
  p.Dispose()
  End Try
  End Sub
  End Class
  
  
    以下是有關這些類的注意事項。
  
    從 HollowRectangle 中派生
    我們從這個類的空心版本中派生出填充類。這個類中的多數內容都發生了改變:Draw 方法和建構函式都是新的(但兩者都調用基類的版本),並且為 IFillable 介面的 Fill 方法以及 FillBrushColor 屬性添加了實現。
  
    需要新建構函式的原因是我們在這個類中包含了需要初始化的其他資料,即填充畫筆。(您可以回顧我們前面討論的畫筆。)請注意此建構函式是如何調用基類建構函式的:在 C# 中,該調用被內建到聲明 (: base(center, radius, penColor)) 中;在 Visual Basic .NET 中,我們將它明確放在 New 方法(即建構函式)的第一行 (MyBase.New(rect, penColor))。
  
    因為我們已經向基類建構函式中傳遞了三個參數中的兩個,現在只需初始化最後的欄位即可。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.