Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用System.Drawing.Graphics在Windows窗体控件上绘制_C#_Winforms_Graphics_Controls_Paint - Fatal编程技术网

C# 使用System.Drawing.Graphics在Windows窗体控件上绘制

C# 使用System.Drawing.Graphics在Windows窗体控件上绘制,c#,winforms,graphics,controls,paint,C#,Winforms,Graphics,Controls,Paint,我对这一点完全陌生,我正在用C#开发一个Windows窗体应用程序,并想创建一个“LevelMeter”,在我的想法中,它是一个进度条,左上部分由一个三角形覆盖,该三角形具有窗体背景的颜色。所以基本上我只想覆盖左上部分来模拟水平仪,比如VLC播放器的音量控制,或者类似的 我的问题是,如何在控件本身上绘制?我想创建一个UserControl,并在完成后添加到我的项目中。我可以使用SolidBrush和FillPolygon在表单上绘制,但是ProgressBar.paint事件上的MSDN库说明:

我对这一点完全陌生,我正在用C#开发一个Windows窗体应用程序,并想创建一个“LevelMeter”,在我的想法中,它是一个进度条,左上部分由一个三角形覆盖,该三角形具有窗体背景的颜色。所以基本上我只想覆盖左上部分来模拟水平仪,比如VLC播放器的音量控制,或者类似的

我的问题是,如何在控件本身上绘制?我想创建一个UserControl,并在完成后添加到我的项目中。我可以使用SolidBrush和FillPolygon在表单上绘制,但是ProgressBar.paint事件上的MSDN库说明:“此API支持.NET Framework基础结构,不打算直接从代码中使用。”那么有没有方法在控件上绘制


好:“永不放弃实验”原则始终正确,以下是我的解决方案:

我制作了一个定制的LevelMeter:控制并使用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 });
        }
    }

为了避免每次值更改时清除和重新绘制液位计时出现“闪烁”,我只重新绘制需要添加(绿色)或删除(表单背景色)的部分

您希望覆盖自定义控件中的OnPaint(PaintEventArgs e)。这将允许您访问用于在控件上进行自定义绘制的
System.Drawing.Graphics
(通过
e.Graphics
)对象

让您可以使用大量的方法来完成所需的绘制

例如:

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

感谢您提交建议。不幸的是,覆盖OnPaint不会在进度栏上绘制任何形状:(如果您找到了一个好的解决方案,您应该回答自己的问题。尝试将
双缓冲
设置为true。如果不是,则它是
控件
(因此
进度条
)的一个属性。我已将双缓冲设置为true,它一直闪烁。我需要从头开始创建自定义控件。