使用表面绘制绘制多个场景?

时间:2014-09-16 16:33:36

标签: c# winforms timer paint

您好我想在Form上使用Paint绘制多个场景,但是使用计时器刻度我希望它重绘到另一个场景(这里是矩形)。

是否可能有多个Form_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尝试了这个,但那不起作用。 有人可以向我解释如何使用

在Pain或picturebox上绘制多个“场景”
private void moveTimer_Tick(object sender, System.EventArgs e)
    {

        choose();       

    }

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

可能像使用Form_Paint一样吗?这是

2 个答案:

答案 0 :(得分:0)

不要调用多个绘制事件处理程序,只需覆盖窗体的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...
  }
}

答案 1 :(得分:0)

谢谢!我在没有Form_Paint的情况下做了这个效果(我知道使用Form_Paint是完整的问题:D):

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

但你的方法工作正常(并使用Paint)!再次感谢你。