在BeginMark中,程序重新設置了當前簽名信息對象為新對象,而且新對 象還未加入到文檔中,此時Marking 屬性返回true。
在EndMark中,若正在新增的簽 名信息包含了至少一條簽名筆跡則將對象添加到文檔中,否則刪除當前簽名信息對象,此時 Marking屬性返回false。
這個控件重寫了鼠標按鍵按下事件處理來開始新增簽名軌跡 ,其代碼為
/// <summary>
/// 當前處理的線條點集合
/// </summary>
private PointArrayList myCurrentLine = null;
/// <summary>
/// 最後一次點坐標
/// </summary>
private System.Drawing.Point LastPoint = System.Drawing.Point.Empty ;
/// <summary>
/// 處理鼠標按鍵按下事件
/// </summary>
/// <param name="e"></param>
protected override void OnMouseDown(MouseEventArgs e)
{
base.OnMouseDown (e);
if( this.Marking )
{
// 正在簽名
myCurrentLine = new PointArrayList();
LastPoint = new Point( e.X , e.Y );
}
else
{
// 判斷鼠標光標是否命中某個簽名的線條
int x = e.X - this.AutoScrollPosition.X ;
int y = e.Y - this.AutoScrollPosition.Y ;
foreach( PenMarkInfo info in myDocument )
{
// 判斷鼠標光標是否命中某個簽名的某 個線條
foreach( PointArrayList line in info.Lines )
{
foreach( Point p in line )
{
double r = ( p.X - x ) * ( p.X - x ) + ( p.Y - y ) * ( p.Y - y );
if( r < 13 )
{
System.Drawing.Rectangle rect = info.Bounds ;
if( myCurrentInfo != null )
{
rect = System.Drawing.Rectangle.Union( rect , myCurrentInfo.Bounds );
rect.Offset( this.AutoScrollPosition.X , this.AutoScrollPosition.Y );
}
myCurrentInfo = info ;
this.Invalidate( rect );
goto EndElse ;
}
}
}
}
EndElse: ;
}
}
當用戶按下鼠標按鍵時,若控件 處於新增簽名狀態則開始一條簽名軌跡操作,初始化一些全局變量。若控件不是新增簽名狀 態,則修正鼠標光標坐標,並查找鼠標光標下簽名對象,在這裡判斷鼠標光標和某個簽名軌 跡上的某點的距離的平方是否小於13,若找到這個簽名對象則設置該簽名對象為當前簽名對 象。然後聲明控件的部分界面無效,需要重新繪制。
聲明控件用戶界面無效是調用控 件的Invalidate方法,若帶參數則聲明用戶界面部分無效,參數是一個矩形,在將來要調用 的OnPaint方法的剪切矩形就是這個參數。若無參數的調用Invalidate方法,則是聲明整個控 件的用戶界面無效,全部需要重新繪制。