在本函數中首先是對圖形繪制對象和剪切矩形進行坐標轉化。 創建一個名為list的列表,列表中放置文檔中已經有的簽名對象和正在新建中的簽名對象, 然後遍歷所有的簽名對象,調用它們的Draw函數來繪制簽名圖形,最後根據當前簽名信息來 繪制焦點矩形,這裡的myCurrentInfo就是當前簽名信息對象。
這裡使用了類型 ControlPaint來繪制焦點矩形。在Windows用戶界面中,表示一個控件獲得輸入焦點,可以在 其界面上繪制焦點矩形。比如按鈕,當按鈕獲得焦點時,按紐裡就會繪制一個虛線的矩形邊 框,這個就是焦點矩形。類型ControlPaint中定義了一些靜態方法,用以模擬繪制一些 Windows標准控件的用戶界面,比如細邊框和3D的凸起或下陷邊框,模擬繪制菜單,單選框, 復選框等等。這個類型是一些Win32API函數的封裝,這些API函數有DrawEdge, DrawFrameControl等等,ControlPaint還提供一些方法能反轉屏幕上的像素,從而能實現橡 皮筋技術,而標准的Graphics對象是沒有像素反轉功能的。
PenMarkControl還重寫了 鼠標處理方法來實現新增簽名的功能。首先控件有兩種狀態,正在簽名狀態和普通狀態,當 控件處於正在簽名狀態,則用戶的鼠標拖拽操作就能增加新的簽名筆跡;否則用戶的鼠標拖 拽操作不會新增簽名筆跡。控件定義了一個名為Marking的屬性來表示控件是否處於新增簽名 狀態。其代碼如下
/// <summary>
/// 正在簽名中
/// </summary>
/// <remarks>若當前簽名對象存在而且還不屬於文檔則控件 處於新增簽名狀態</remarks>
public bool Marking
{
get{ return myCurrentInfo != null && myDocument.Contains( myCurrentInfo ) == false ;}
}
控件定義了BeginMark和EndMark方法來開始和結束新增簽名 操作。其代碼為
/// <summary>
/// 開始進行新增簽名
/// </summary>
/// <param name="UserName">簽名者 </param>
/// <param name="LineWidth">簽名線條寬度 </param>
public void BeginMark( string UserName , int LineWidth )
{
if( myCurrentInfo != null )
{
System.Drawing.Rectangle rect = myCurrentInfo.Bounds ;
rect.Offset( this.AutoScrollPosition.X , this.AutoScrollPosition.Y );
this.Invalidate( rect );
}
myCurrentInfo = new PenMarkInfo ();
myCurrentInfo.Creator = UserName ;
myCurrentInfo.CreationTime = DateTime.Now ;
myCurrentInfo.LineWidth = LineWidth ;
}
/// <summary>
/// 結束新增簽名操作
/// </summary>
public void EndMark()
{
if( this.Marking )
{
if( myCurrentInfo.Lines.Count > 0 )
{
myDocument.Add( myCurrentInfo );
}
else
{
myCurrentInfo = null;
}
}
}