首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# WinForm 繪製儀表盤:Graphics 畫圓、線、文本構建刻度盤

     編輯:程式設計綜合問答

需求:在 WinForm 中繪製帶刻度數字的圓形儀表盤(如圖)。

核心思路

  1. 中心點 (cx, cy),半徑 R。
  2. 分 N 等分(如 20 份),每份角度 angle = 2π/N。
  3. 第 i 刻度線端點:
    x = cx + R * Math.Sin(i * angle)
    y = cy - R * Math.Cos(i * angle)(Y 軸向下)。
  4. 長刻度(主刻度)每 5 份畫長線+數字,短刻度畫短線。
  5. 文本繪製用 DrawString,需計算字符寬高居中。

關鍵代碼片段

protected override void OnPaint(PaintEventArgs e) {
    var g = e.Graphics;
    g.SmoothingMode = SmoothingMode.AntiAlias;
    int cx = Width/2, cy = Height/2, R = Math.Min(cx, cy) - 20;
    for (int i = 0; i < 20; i++) {
        double rad = i * 2 * Math.PI / 20;
        int x1 = cx + (int)(R * 0.9 * Math.Sin(rad));
        int y1 = cy - (int)(R * 0.9 * Math.Cos(rad));
        int x2 = cx + (int)(R * Math.Sin(rad));
        int y2 = cy - (int)(R * Math.Cos(rad));
        g.DrawLine(Pens.Black, x1, y1, x2, y2);
        if (i % 5 == 0) {
            string txt = (i/5).ToString();
            var sz = g.MeasureString(txt, Font);
            g.DrawString(txt, Font, Brushes.Black,
                x2 - sz.Width/2, y2 - sz.Height/2);
        }
    }
    // 中心文本框/標籤用控件佈局,不在 OnPaint 畫
}

優化建議

  • 雙緩衝:this.DoubleBuffered = true; 防閃爍。
  • 大量刻度時,預計算坐標緩存,避免重複 Sin/Cos。
  • 文本框、標籤用普通控件拖放,僅儀表盤背景用繪製。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved