C# code
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Drawing.Drawing2D;
using System.Diagnostics;
namespace Sample080410
{
public partial class Form1 : Form
{
Bitmap Rectimage = new Bitmap(@"E:\\Rectangle.bmp", true);
Bitmap Triangleimage = new Bitmap(@"E:\\Triangle.bmp", true);
Bitmap Circleimage = new Bitmap(@"E:\\Circle.bmp", true);
public Form1()
{
InitializeComponent();
}
protected override void OnPaint(PaintEventArgs e)
{
Allpicture(e);
}
private void Allpicture(object e)
{ PaintEventArgs ex = (PaintEventArgs)e;
int rotate_Y = 100;
int move_Y = 0;
int z = 15;
int trianglemove_Y = 0;
int circlemove_Y = 0; Graphics g1 = ex.Graphics;
Graphics g2 = ex.Graphics;
Graphics g3 = ex.Graphics;
Pen pen = new Pen(Color.Red);
Point p1 = new Point(0, 100);
Point p2 = new Point(700, 100);
Point p3 = new Point(300, 0);
Point p4 = new Point(300, 700);
Point p5 = new Point(100, 0);
Point p6 = new Point(100, 700);
Point p7 = new Point(500, 0);
Point p8 = new Point(500, 700);
for (int i = 1; i < 60; i++)
{
g1.DrawLine(pen, p1, p2);
g1.DrawLine(pen, p3, p4);
g1.DrawLine(pen, p5, p6);
g1.DrawLine(pen, p7, p8);
Thread.Sleep(1000);
ex.Graphics.Clear(Color.White); PointF point = new PointF(100, rotate_Y + move_Y);
Matrix Matrix = new Matrix();
Matrix.RotateAt(z, point);
g1.Transform = Matrix;
g1.DrawImageUnscaled(Rectimage, 50, 50 + move_Y);
if (i % 2 == 0)
{
trianglemove_Y += 1;
PointF pointrotate = new PointF(300, rotate_Y + trianglemove_Y);
Matrix Matrix2 = new Matrix();
Matrix2.RotateAt(z, pointrotate);
g2.Transform = Matrix2;
g2.DrawImageUnscaled(Triangleimage, 250, 50 + trianglemove_Y);
}
else
{
PointF pointrotate = new PointF(300, rotate_Y + trianglemove_Y);
Matrix Matrix2 = new Matrix();
Matrix2.RotateAt(z, pointrotate);
g2.Transform = Matrix2;
g2.DrawImageUnscaled(Triangleimage, 250, 50 + trianglemove_Y);
}
if (i % 3 == 0)
{
circlemove_Y += 1;
PointF circlepoint = new PointF(500, rotate_Y + circlemove_Y);
Matrix Matrix3 = new Matrix();
Matrix3.RotateAt(0, circlepoint);
g3.Transform = Matrix3;
g3.DrawImageUnscaled(Circleimage, 450, 50 + circlemove_Y);
}
else
{
PointF circlepoint = new PointF(500, rotate_Y + circlemove_Y);
Matrix Matrix3 = new Matrix();
Matrix3.RotateAt(0, circlepoint);
g3.Transform = Matrix3;
g3.DrawImageUnscaled(Circleimage, 450, 50 + circlemove_Y);
}
move_Y += 1;
z += 15;
}
ex.Graphics.Dispose();
}
}}
在描画时无法进行其它操作。
一操作就引起无应答(例:右上角的关闭或整个窗口移动)导致程序死掉!
怎么用 线程解决?
如果不用 OnPaint还有什么方法?我加的线程不行protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
t1 = new Thread(new ParameterizedThreadStart(Allpicture)); t1.Name = "t1";
t1.Start(e);
}
解决方案 »
- 索引超出范围。必须为非负值并小于集合大小。 参数名: index
- 有没有解析表达式值的函数?
- 求救:关于xml,请高手或者作过这方面的人帮忙,在线等候!
- 求C#组件开发资料?
- 请问TreeView控件的问题,当鼠标单击如何判断是单击的是文字还是左侧的“+”“-”号
- 手机可以作为gsm/gprs模块吗?
- C# 怎么把一个图片裁剪成圆形,然后上传服务器??急急急,在线等!
- 如果何把datagrid中的性别(bool型)显示为字符串(“男”“女”)?
- 怎样向运行的程序(如Word/写字板等)中写入文字?
- 关于asp.net中<%=%>和<%#%>的问题
- 文件通用存取
- Remoting 激活對象的代碼的位置
谢谢你的回复。意思明白,但我学C#没几天整个结构停乱的。
步骤1(事先绘制好在放入Image中)如果用代码说明会更能明白
因为你说的步骤1我不知道怎么用没有PaintEventArgs 这个参数
来Graphic 一个g。还有那个Sleep(1000)是用来延迟1秒的
这个问题 我想用Timer来处理会比较OK辛苦了!
然后在Allpicture只放绘制的代码,不要Sleep,如果可以使用双缓冲区绘制效果会好一些.
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Drawing.Drawing2D;
using System.Diagnostics;
namespace Sample080410
{
public partial class Form1 : Form
{
Bitmap Rectimage = new Bitmap(@"E:\\Rectangle.bmp", true);
Bitmap Triangleimage = new Bitmap(@"E:\\Triangle.bmp", true);
Bitmap Circleimage = new Bitmap(@"E:\\Circle.bmp", true); int i = 1;
Pen pen = new Pen(Color.Red);
//以下几个point定义无效,实际运行无效果
//Point p1 = new Point(0, 100);
//Point p2 = new Point(700, 100);
//Point p3 = new Point(300, 0);
//Point p4 = new Point(300, 700);
//Point p5 = new Point(100, 0);
//Point p6 = new Point(100, 700);
//Point p7 = new Point(500, 0);
//Point p8 = new Point(500, 700);
int rotate_Y = 100;
int move_Y = 0;
int z = 15;
int trianglemove_Y = 0;
int circlemove_Y = 0; private System.Windows.Forms.Timer timer1; public Form1()
{
InitializeComponent();
//下面这行代码是把Form的Load事件绑定为Form1_Load,如果不写这行代码,你要手工将设置
this.Load+=new EventHandler(Form1_Load);
}
private void Form1_Load(object sender, EventArgs e)
{
this.timer1 = new System.Windows.Forms.Timer();
timer1.Tick+=new EventHandler(timer1_Tick);
this.timer1.Interval = 1000;
this.timer1.Enabled = true;
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
//在需要重绘窗体的时候,绘制图片,以保持形状,但不移动图片位置
AllPicture(false, e.Graphics);
e.Graphics.Dispose();
} private void AllPicture(bool movePic,Graphics g)
{
if(g==null)
g = this.CreateGraphics();
//以下四行代码无效因为后面是g.Clear()
//g.DrawLine(pen, p1, p2);
//g.DrawLine(pen, p3, p4);
//g.DrawLine(pen, p5, p6);
//g.DrawLine(pen, p7, p8);
g.Clear(Color.White); PointF point = new PointF(100, rotate_Y + move_Y);
Matrix Matrix = new Matrix();
Matrix.RotateAt(z, point);
g.Transform = Matrix;
g.DrawImageUnscaled(Rectimage, 50, 50 + move_Y); if (i % 2 == 0)
{
if (movePic) trianglemove_Y += 1;
PointF pointrotate = new PointF(300, rotate_Y + trianglemove_Y);
Matrix Matrix2 = new Matrix();
Matrix2.RotateAt(z, pointrotate);
g.Transform = Matrix2;
g.DrawImageUnscaled(Triangleimage, 250, 50 + trianglemove_Y);
}
else
{ PointF pointrotate = new PointF(300, rotate_Y + trianglemove_Y);
Matrix Matrix2 = new Matrix();
Matrix2.RotateAt(z, pointrotate);
g.Transform = Matrix2; g.DrawImageUnscaled(Triangleimage, 250, 50 + trianglemove_Y);
}
if (i % 3 == 0)
{
if (movePic) circlemove_Y += 1; PointF circlepoint = new PointF(500, rotate_Y + circlemove_Y);
Matrix Matrix3 = new Matrix();
Matrix3.RotateAt(0, circlepoint);
g.Transform = Matrix3; g.DrawImageUnscaled(Circleimage, 450, 50 + circlemove_Y);
}
else
{
PointF circlepoint = new PointF(500, rotate_Y + circlemove_Y);
Matrix Matrix3 = new Matrix();
Matrix3.RotateAt(0, circlepoint);
g.Transform = Matrix3; g.DrawImageUnscaled(Circleimage, 450, 50 + circlemove_Y);
}
if (movePic)
{
move_Y += 1;
z += 15;
}
g.Dispose();
if (i < 60)
i++;
else if (i==60)
timer1.Enabled = false;//执行60次,不再使用timer
}
private void timer1_Tick(object sender, EventArgs e)
{
AllPicture(true,null);
}
}
}
谢谢 回复!
很感谢您的修改与指点。
谢谢回复!
使用双缓冲区绘制 还不是很明白怎么用
ご返事ありがとうございます。
谢谢回复!
您说的大概明白了!
{
base.OnPaint(e);
//在需要重绘窗体的时候,绘制图片,以保持形状,但不移动图片位置
AllPicture(false, e.Graphics);
e.Graphics.Dispose();
}
感觉这句话好像没什么用哦
我不做重绘