因为上一个专题"程序服务器和客服端对象更新"的需要,
要在C# WINFORM 中有物体的移动,需要不闪烁的动画
这里单独把这个无闪烁动画的功能说明一下:
程序在WINFORM的控件上画出每一帧的图像来实现动画,
程序先自己创建一张BMP图片对象,有什么动画就在这张BMP对象上画出来。
最后再把这张BMP显示在控件上,这样可以避免直接在控件上作画的图像闪烁。
代码中没有用什么特别的功能,不知是否属于先缓冲解决闪烁之流。
例程运行的结果:
用到的4张图片,分别是人物行走的4步:
WINFORM程序全部代码:
1、创建一个全局bmp对象和它的做图功能对象。
2、在bmp对象上写字和画图。
3、把这个bmp对象在控件中显示出来。
4、循环上面的步骤实现无闪烁动画。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
public Bitmap bmp = null;
public Graphics g_bmp = null;
int speed = 100;
public Form1()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;
Thread t3 = new Thread(new ThreadStart(golist_UI));
t3.Start();
}
private void golist_UI()
{
Image png06 = Image.FromFile(@"06.png");
Image png07 = Image.FromFile(@"07.png");
Image png08 = Image.FromFile(@"08.png");
Image png09 = Image.FromFile(@"09.png");
//先新建一个bmp对象
bmp = new Bitmap(pictureBox1.ClientSize.Width, pictureBox1.ClientSize.Height);
//从bmp对象得到图形对象功能
g_bmp = Graphics.FromImage(bmp);
while (true)
{
//清掉这张BMP,在BMP上作图
g_bmp.Clear(BackColor);
g_bmp.DrawImage(png06, 100, 100);
g_bmp.DrawString(speed.ToString(), this.Font, Brushes.Black, 0, 0);
Thread.Sleep(speed);
//显示这张BMP
pictureBox1.CreateGraphics().DrawImage(bmp, 0, 0);
panel1.CreateGraphics().DrawImage(bmp, 0, 0);
//清掉这张BMP,在BMP上作图
g_bmp.Clear(BackColor);
g_bmp.DrawImage(png07, 100, 100);
g_bmp.DrawString(speed.ToString(), this.Font, Brushes.Black, 0, 0);
Thread.Sleep(speed);
//显示这张BMP
pictureBox1.CreateGraphics().DrawImage(bmp, 0, 0);
panel1.CreateGraphics().DrawImage(bmp, 0, 0);
//清掉这张BMP,在BMP上作图
g_bmp.Clear(BackColor);
g_bmp.DrawImage(png08, 100, 100);
g_bmp.DrawString(speed.ToString(), this.Font, Brushes.Black, 0, 0);
Thread.Sleep(speed);
//显示这张BMP
pictureBox1.CreateGraphics().DrawImage(bmp, 0, 0);
panel1.CreateGraphics().DrawImage(bmp, 0, 0);
//清掉这张BMP,在BMP上作图
g_bmp.Clear(BackColor);
g_bmp.DrawImage(png09, 100, 100);
g_bmp.DrawString(speed.ToString(), this.Font, Brushes.Black, 0, 0);
Thread.Sleep(speed);
//显示这张BMP
pictureBox1.CreateGraphics().DrawImage(bmp, 0, 0);
panel1.CreateGraphics().DrawImage(bmp, 0, 0);
}
}
}
}
下载全部工程代码资源:
http://download.csdn.net/download/ot512csdn/12182068