使用System.Drawing.Graphics在Windows窗体控件上绘画

时间:2013-09-05 01:36:33

标签: c# winforms graphics controls paint

我对此非常陌生,我正在使用C#进行Windows窗体应用,并希望创建一个“LevelMeter”,在我的想法中是一个ProgressBar,其左上部分由一个三角形覆盖,颜色为表格背景。所以基本上我只想覆盖左上角模仿一个水平仪,比如VLC Players的体积控制,或类似的。

我的问题是,如何在 Control 上绘画?我想创建一个UserControl并在完成后添加到我的项目中。我可以使用SolidBrush和FillPolygon在Form上绘制,但MSDN Library对ProgressBar.Paint事件的注释:“此API支持.NET Framework基础结构,不能直接在您的代码中使用。”那么有没有办法在Control上绘画?


好的:“永不放弃试验”原则始终如一,这是我的解决方案:

我制作了一个自定义LevelMeter:Control并使用FillPolygon方法绘制LevelMeter的三角形,在我的例子中只有8个不同的值,范围从0到7,所以我绘制LevelMeter的7'部分'。

    protected override void OnPaint(PaintEventArgs pe)
    {
        if (this.valueNew > valueOld)
        {
            // increase, paint with green
            this.CreateGraphics().FillPolygon(new SolidBrush(Color.LawnGreen), new Point[] { p2Old, p3Old, p3New, p2New });
        }

        else
        {
            // decrease, paint with BackColor
            this.CreateGraphics().FillPolygon(new SolidBrush(this.BackColor), new Point[] { p2New, p3New, p3Old, p2Old });
        }
    }

为了避免每次值更改时清除和重新绘制LevelMeter所导致的“闪烁”,我只重新绘制需要添加(绿色)或删除的部分(表单的BackColor)。

1 个答案:

答案 0 :(得分:3)

您想在自定义控件中覆盖OnPaint(PaintEventArgs e)。这样,您就可以访问用于在控件上进行自定义绘制的System.Drawing.Graphics(通过e.Graphics)对象。

Graphics可让您访问 ton 可用于绘制所需绘画的方法。

示例:

public class MyControl : Control { 
  // ...
  protected override void OnPaint(PaintEventArgs e) { 
    base.OnPaint(e); // Important - makes sure the Paint event fires
    using (var pen = new Pen(Color.Black, 3)) { 
      e.Graphics.DrawRectangle(pen, 0, 0, this.Width, this.Height); 
    }
  }
}