首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 圖形高級篇:OnPaint 繪製管線與 ControlPaint 焦點矩形(第七講·中下)

     編輯:關於C語言

OnPaint:文檔繪製 + 焦點矩形

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);
    }
}

ControlPaint:標準控件外觀模擬器

  • 封裝 Win32 DrawEdge、DrawFrameControl 等 API。
  • 提供 DrawFocusRectangle、DrawButton、DrawCheckBox、DrawRadioButton、DrawMenuGlyph 等。
  • 支援 **像素反轉** → 實現「橡皮筋」選取框效果(標準 Graphics 無此功能)。

使用 ControlPaint.DrawFocusRectangle 繪製焦點虛線框,**自動適應系統高對比度主題**,比手繪 Pen.DashStyle = DashStyle.Dot 更專業。

PenMarkControl 滑鼠事件總覽

事件職責
OnMouseDown模式分流:簽名模式啟動軌跡 / 選取模式命中檢測
OnMouseMove簽名模式:CreateGraphics 即時繪製線段;選取模式:拖曳移動簽名(未展示)
OnMouseUp簽名模式:誤觸過濾並確認軌跡加入文檔

設計精華

  1. 統一座標系:文檔模型儲存視圖座標,繪製時 TranslateTransform,事件時 Offset,單一真實來源。
  2. 即時 vs 延遲:高頻軌跡用 CreateGraphics 即時回饋;結構變更(增刪簽名)用 Invalidate 延遲重繪。
  3. 焦點視覺外包:ControlPaint 處理系統一致性焦點框。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved