程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#發現之旅第七講 C#圖形開發高級篇(2)

C#發現之旅第七講 C#圖形開發高級篇(2)

編輯:關於C語言
圖控件

設計的簽名信息文檔對象模 型後,我們還需要設計一個控件來顯示和操作簽名信息文檔。這個控件是從UserControl派生 的,它重寫了OnPaint方法來顯示簽名圖形,重寫了鼠標事件來添加新的簽名信息。還有一些 控件狀態控制模塊。

程序代碼說明

現根據軟件設計,使用VS.Net2003開發出 這個簽名軟件,現對該軟件的代碼進行說明,首先說明一下文檔對象模型相關的代碼。

PointArrayList

本類型用於維護一個可變長度的專門用於存儲點坐標數據的 列表。該對象實現了ICollection接口,還實現了自定義的枚舉器。本類型提供了Add, RemoveAt,Clear方法來維護點數據列表,還使用Offset方法來移動對象。內部還定義了一個 MyPointEnumerator對象實現了自定義的枚舉器。這裡還定義了一個Bounds 屬性來獲得包含 所有點的最小外切矩形區域。

在這裡我們順便研究一下C#中的枚舉器結構。我們都知 道,在VB.Net或C#中可以使用foreach 語法結構來遍歷枚舉一個數組中的所有的元素,使用 foreach比使用for要簡單不少。從本質上說能應用到foreach語法結構的對象都是實現了 System.Collections.IEnumerable接口,該接口只有一個方法 GetEnumerator(),任何類 型只要實現了IEnumerable接口即可用於foreach語句中。函數GetEnumerator()返回一個實 現了System.Collection.IEnumerator的對象。

為了實現自定義的枚舉器,我們需要 定義兩個類型,一個類型是實現了IEnumerable接口,另外一個實現了IEnumerator接口,其 具體內部實現毫無限制,因此我們可以根據需要開發出各種各樣的枚舉器來應用到foreach語 句中。

PointArryList對象沒有明確的定義實現IEnumerable接口,但它實現了 ICollection接口,而ICollection接口是從IEnumerable接口派生的,因此PointArrayList對 象是間接實現了IEnumerable接口。

關於枚舉器的詳細情況可參考MSDN中的相關說明 。

PenMarkInfo

本類型用於維護一個簽名信息對象。這個對象保存了簽名人的 姓名,簽名時間,簽名線條顏色,寬度。此外還有一個Lines屬性用於存放若干個 PointArrayList對象,這個Lines屬性就保存了多條簽名書寫軌跡信息。

PenMarkInfo 對象定義了一個Bounds屬性,用於獲得包含所有簽名軌跡的最小外切矩形。

PenMarkInfo對象定義了Lines屬性,該屬性返回一個列表,該列表的元素是 PointArryList類型,用於保存多個簽名線條的軌跡信息。這裡使用了一個類型為 XmlArrayItem的特性,這個特性影響對象的XML序列化。該特性說明該列表的元素類型是 PointArrayList,而且保存數組元素的XML元素名稱為Line。

該對象還定義了Draw函 數來繪制簽名圖形,在Draw函數中使用了Graphics對象的DrawLines函數,該函數是根據N個 點來繪制首尾相連的N減1個線段。Draw函數的代碼如下

/// <summary>
/// 繪制簽名圖形
/// </summary>
/// <param name="g">圖形繪制對象</param>
/// <param name="ClipRectangle">前切矩形</param>
public void Draw( Graphics g , Rectangle ClipRectangle )
{
  using( Pen pen = new Pen( this.Color , this.LineWidth ))
  {
    foreach( PointArrayList line in myLines )
    {
      if( ClipRectangle.IntersectsWith( line.Bounds ))
      {
         g.DrawLines( pen , line.ToArray());
      }
    }
   }
  }

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved