Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.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# 使用form paint绘制多个场景?_C#_Winforms_Timer_Paint - Fatal编程技术网

C# 使用form paint绘制多个场景?

C# 使用form paint绘制多个场景?,c#,winforms,timer,paint,C#,Winforms,Timer,Paint,您好,我想画多个场景的形式上使用油漆像这样,但与定时器滴答声,我想它重画到另一个场景(这里矩形) 是否可能有多个Form\u Paint事件 private void choose() { switch (sceneNumber) { case 1: this.Paint += new PaintEventHandler(ScreenSaverForm_Paint); sceneN

您好,我想画多个场景的形式上使用油漆像这样,但与定时器滴答声,我想它重画到另一个场景(这里矩形)

是否可能有多个
Form\u Paint
事件

private void choose()
{
     switch (sceneNumber)
        {
            case 1:

                this.Paint += new PaintEventHandler(ScreenSaverForm_Paint);
                sceneNumber=++;

                break;
            case 2:


               this.Paint += new PaintEventHandler(ScreenSaverForm_Paint2);

                sceneNumber=++;
                break;
            default:


                this.Paint += new PaintEventHandler(ScreenSaverForm_Paint3);

                sceneNumber=1;
                break;
        }

    }

private void ScreenSaverForm_Paint1(object sender, PaintEventArgs e)
    {

        Pen pero = new Pen(Brushes.White);

        Graphics g = e.Graphics;
        g.DrawRectangle(pero, 0, 0, 200, 200);
    }

    private void ScreenSaverForm_Paint2(object sender, PaintEventArgs e)
    {
        Pen pero = new Pen(Brushes.Blue);

        Graphics g = e.Graphics;
        g.DrawRectangle(Pens.White, new Rectangle(200, 200, 400, 400));

    }
我也用picturebox试过了,但没用。 有人能给我解释一下,如何利用疼痛或图片盒中的多个“场景”使用

在何处选择将根据全局变量sceneNumber?绘制下一个场景?。我对.NET编程不太在行,所以处理程序、委托等都搞砸了。我只需要重新绘制一些封装在不同函数中的代码。多谢各位


用Form_油漆可以做这样的事吗?这是一个

而不是调用多个绘制事件处理程序,只需重写表单的OnPaint方法,然后根据场景编号调用绘制例程:

public partial class Form1 : Form {

  private int sceneNumber;

  public Form1() {
    this.InitializeComponent();
    this.DoubleBuffered = true;
    this.ResizeRedraw = true;
  }

  private void moveTimer_Tick(object sender, EventArgs e) {
    if (sceneNumber > 1) {
      sceneNumber = 1;
    } else {
      sceneNumber++;
    }
    this.Invalidate();
  }

  protected override void OnPaint(PaintEventArgs e) {
    switch (sceneNumber) {
      case 1:
        DrawSceneOne(e.Graphics);
        break;
      case 2:
        DrawSceneTwo(e.Graphics);
        break;
      default:
        break;
    }
    base.OnPaint(e);
  }

  private void DrawSceneOne(Graphics g) {
    g.Clear(Color.Wheat);
    // more stuff...
  }

  private void DrawSceneTwo(Graphics g) {
    g.Clear(Color.Silver);
    // more stuff...
  }
}

谢谢大家!!我在没有使用Form_Paint的情况下实现了这种效果(我知道使用Form_Paint:D是问题的关键):


但是你的方法很好用(而且是用油漆)!再次感谢您。

不要一直这样添加油漆处理程序。只需添加一次。在绘制事件中移动开关块。而不是调用
choose()
,则调用
this.invalidate()避免创建图形。例如,最小化表单将删除所绘制的内容。始终使用绘制事件中的图形对象。
public partial class Form1 : Form {

  private int sceneNumber;

  public Form1() {
    this.InitializeComponent();
    this.DoubleBuffered = true;
    this.ResizeRedraw = true;
  }

  private void moveTimer_Tick(object sender, EventArgs e) {
    if (sceneNumber > 1) {
      sceneNumber = 1;
    } else {
      sceneNumber++;
    }
    this.Invalidate();
  }

  protected override void OnPaint(PaintEventArgs e) {
    switch (sceneNumber) {
      case 1:
        DrawSceneOne(e.Graphics);
        break;
      case 2:
        DrawSceneTwo(e.Graphics);
        break;
      default:
        break;
    }
    base.OnPaint(e);
  }

  private void DrawSceneOne(Graphics g) {
    g.Clear(Color.Wheat);
    // more stuff...
  }

  private void DrawSceneTwo(Graphics g) {
    g.Clear(Color.Silver);
    // more stuff...
  }
}
public int sceneNumber=1;
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Paint(object sender, PaintEventArgs e)
    {
    }

    private void choose()
    {

        switch (sceneNumber)
        {
            case 1:
                resetPict();
                drawOne();
                sceneNumber++;
                break;
            case 2:
                resetPict();
                drawTwo();
                sceneNumber = 1;
                break;

        }

    }

    private void resetPict()
    {
        pictureBox1.BackColor= Color.Black;
    }
    private void drawOne()
    {
        Graphics gr = pictureBox1.CreateGraphics();          
        gr.FillRectangle(Brushes.Red, 30, 30, 150, 100);

    }
    private void drawTwo()
    {
        Graphics gr = pictureBox1.CreateGraphics();            
        gr.FillRectangle(Brushes.Blue, 30, 30, 150, 100);
    } 



    private void timer1_Tick(object sender, EventArgs e)
    {
        choose();
    }
}