protected override void OnPaint(PaintEventArgs e) {
base.OnPaint(e);
// 1. 剪切矩形與畫布同步平移(折射修正)
Rectangle clip = e.ClipRectangle;
clip.Offset(-AutoScrollPosition.X, -AutoScrollPosition.Y);
e.Graphics.TranslateTransform(AutoScrollPosition.X, AutoScrollPosition.Y);
// 2. 合併文檔現有簽名與正在編輯的簽名
var list = new List(document);
if (currentInfo != null) list.Add(currentInfo);
// 3. 繪製所有簽名
foreach (var info in list) info.Draw(e.Graphics, clip);
// 4. 繪製當前焦點矩形(虛線框)
if (currentInfo != null) {
Rectangle focusRect = currentInfo.Bounds;
focusRect.Inflate(2, 2); // 稍微外擴
focusRect.Offset(AutoScrollPosition.X, AutoScrollPosition.Y); // 轉回客戶區
ControlPaint.DrawFocusRectangle(e.Graphics, focusRect);
}
}
DrawEdge、DrawFrameControl 等 API。DrawFocusRectangle、DrawButton、DrawCheckBox、DrawRadioButton、DrawMenuGlyph 等。Graphics 無此功能)。使用 ControlPaint.DrawFocusRectangle 繪製焦點虛線框,**自動適應系統高對比度主題**,比手繪 Pen.DashStyle = DashStyle.Dot 更專業。
| 事件 | 職責 |
|---|---|
| OnMouseDown | 模式分流:簽名模式啟動軌跡 / 選取模式命中檢測 |
| OnMouseMove | 簽名模式:CreateGraphics 即時繪製線段;選取模式:拖曳移動簽名(未展示) |
| OnMouseUp | 簽名模式:誤觸過濾並確認軌跡加入文檔 |
TranslateTransform,事件時 Offset,單一真實來源。CreateGraphics 即時回饋;結構變更(增刪簽名)用 Invalidate 延遲重繪。ControlPaint 處理系統一致性焦點框。