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

解决方案 »

  1.   

    这个绘图操作别放在 OnPaint 中, 可事先绘制好, 放入 Image 中在 OnPaint 中直接 DrawImage 即可另外,你的函数中居然有 Sleep(1000), 这样不死才怪
      

  2.   

    TO:huwei001982
    谢谢你的回复。意思明白,但我学C#没几天整个结构停乱的。
    步骤1(事先绘制好在放入Image中)如果用代码说明会更能明白
    因为你说的步骤1我不知道怎么用没有PaintEventArgs 这个参数
    来Graphic 一个g。还有那个Sleep(1000)是用来延迟1秒的
    这个问题 我想用Timer来处理会比较OK辛苦了!
      

  3.   

    多做成员变量,将成员的创建都放在其他地方,创建一次.
    然后在Allpicture只放绘制的代码,不要Sleep,如果可以使用双缓冲区绘制效果会好一些.
      

  4.   

    修改如下,测试通过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);        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);
            }
        }
    }
      

  5.   

    TO:boblaw
    谢谢 回复!
    很感谢您的修改与指点。
      

  6.   

    To:akirya 
    谢谢回复!
    使用双缓冲区绘制 还不是很明白怎么用
    ご返事ありがとうございます。
      

  7.   

    TO:Microsoft_China_Vip 
    谢谢回复!
    您说的大概明白了!
      

  8.   

    protected override void OnPaint(PaintEventArgs e)
            {
                base.OnPaint(e);
                //在需要重绘窗体的时候,绘制图片,以保持形状,但不移动图片位置
                  AllPicture(false, e.Graphics);
                e.Graphics.Dispose();
            }
    感觉这句话好像没什么用哦
    我不做重绘