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

叩響 C# 之門:捲動視窗繪圖原理與 AutoScrollPosition 座標同步實戰

     編輯:關於C#

問題:捲動時圖形錯位

視窗客戶區 (ClientRectangle) 300×200 px,文件內容 300×250 px (矩形 200×150 + 橢圓 300×100)。設 AutoScrollMinSize = new Size(300, 250) 出現捲動條。

錯誤現象

  1. 最小化再還原 → 圖形正常 (重繪觸發 OnPaint,從文件原點 (0,0) 開始畫)。
  2. 向下捲動 50 px → 橢圓下半部消失,上半部重畫兩次。
工作區與文件大小關係 文件超出工作區
左:視窗結構;右:文件高度 250 > 工作區 200
捲動後橢圓重畫
捲動 50px 後,橢圓上半部 (Y=150~200) 被重畫,下半部 (Y=200~250) 遺失

根因:Graphics 不感知捲動

  • Graphics 永遠以 工作區左上角為原點 (0,0) 繪圖。
  • 捲動時 Windows 採「按需重繪」:整體向上平移 50 px,底部產生 300×50 空白區 → 僅重繪空白區。
  • 空白區對應文件 Y=150~200 (橢圓上半部) → 重畫橢圓上半部,下半部 (Y=200~250) 從未進入重繪區 → 遺失。
按需重繪機制
按需重繪:平移現有像素 + 僅重繪新露出區域

解決:座標系跟隨捲動條平移

令 Graphics 原點始終對齊 文件左上角,而非工作區左上角。捲動條向下 50 px → 座標系向上平移 50 px (負向位移)。

座標平移示意
座標系原點從工作區左上角 A 平移至文件左上角 O

核心程式碼


protected override void OnPaint(PaintEventArgs e) {
    base.OnPaint(e);
    var g = e.Graphics;

    // 關鍵:座標系平移量 = 捲動條位置 (負值)
    g.TranslateTransform(AutoScrollPosition.X, AutoScrollPosition.Y);

    // 繪圖邏輯完全不變,仍以文件座標 (0,0) 為基準
    g.FillRectangle(Brushes.LightPink, 0, 0, 200, 150);
    g.FillEllipse(Brushes.LightGreen, 0, 150, 300, 100);
}

關鍵屬性

  • AutoScrollPosition:Point 結構,X、Y 均為 負值 (捲動條向右/下 → 文件相對視窗向左/上)。
  • AutoScrollMinSize:文件虛擬大小,決定何時出現捲動條。

完整表單程式碼


public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
        BackColor = Color.White;
        AutoScrollMinSize = new Size(300, 250); // 文件 300x250
    }

    protected override void OnPaint(PaintEventArgs e) {
        base.OnPaint(e);
        var g = e.Graphics;
        g.TranslateTransform(AutoScrollPosition.X, AutoScrollPosition.Y);
        g.FillRectangle(Brushes.LightPink, 0, 0, 200, 150);
        g.FillEllipse(Brushes.LightGreen, 0, 150, 300, 100);
    }
}
正確捲動繪圖結果
捲動任意位置,圖形完整正確

捲動繪圖核心心法:文件座標系固定,Graphics 座標系跟隨捲動條移動。一行 TranslateTransform(AutoScrollPosition.X, AutoScrollPosition.Y) 解決所有捲動錯位問題,繪圖邏輯零修改,極致優雅。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved