您好我想在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一样吗?这是
答案 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)!再次感谢你。