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