项目需要添加加载页面,比如点击一条数据,然后点击预览按钮,这时候会弹出页面,首先显示一个加载信息 一张GIF图片,后面跟文字:“正在生成预览,请稍后..”之类的,实际上是正在与后台交互。再得到返回数据以后,隐藏掉加载信息,显示数据内容。参考了一些例子,做的时候还是遇到问题,解决以后记录一下,给其他有需要的朋友们。
在Form里有DataGridView负责显示数据,下面有Button负责操作,然后再向From中添加一个panel负责加载信息,最后添加的panel在最上层,初始化的时候panel.Dock = Dock.Fill;在panel中画一个gif图片并显示“正在生成预览,请稍后...”字样。
首先,类中添加引用:
using System.Drawing;
using System.Drawing.Imaging;
using System.Threading;
声明类变量,两个Thread和一个结束查询后关闭加载信息的委托:
private System.Threading.Thread queryThread;
private System.Threading.Thread gifThread;
//<summary>查询结束后关掉加载信息的委托</summary>
private delegate void EndQuery();
注意要加上前面的 System.Threading
然后在窗体加载的方法里做一些初始化:
private void Form_Load(object sender,EventArgs e)
{
this.queryThread = new System.Threading.Thread(queryDate);
this.queryThread.IsBackground=true;
this.queryThread.Start();
this.gifThread = new System.Threading.Thread(DisplayGIF);
this.gifThread.IsBackground = true;
this.gifThread.Start();
}
接下来实现方法,queryDate()方法就是与后台服务器进行交互查询数据,查询结束以后要关掉查询线程并显示界面。
private void queryDate()
{
//Connect To Server
//查询结束以后要结束掉预览界面
this.Invoke(new EndQuery(EndQueryMethod));
}
委托的EndQueryMethod()负责关掉线程。
private void EndQueryMethod()
{
this.panel1.Visible = false;
try{
this.queryThread.Abort();
this.gifThread.Abort();
}catch{
//do nothing
}
}
DisplayGIF()方法负责显示GIF
private void DisplayGIF()
{
Bitmap adimatedGif = new Bitmap(@"C:\GIF\2.gif");//这里貌似只能给路径,我写 Properties.Resource._2 会报错。
Graphics g = this.panel1.CreateGraphics();
int PropertyTagFrameDelay = 0x5100;
PropertyItem propItem = adimatedGif.GetPropertyItem(PropertyTagFrameDelay);
byte[] bites = propItem.Value;
FrameDimension frameDimension = new FrameDimension(adimatedGif.FrameDimensionsList[0]);
int frameCount = adimatedGif.GetFrameCount(FrameDimension.Time);
int[] delays = new int[frameCount + 1];
int i = 0;
for (i = 0; i <= frameCount - 1; i++)
{
delays[i] = BitConverter.ToInt32(bites, i * 4);
}
while (true)
{
for (i = 0; i <= adimatedGif.GetFrameCount(frameDimension) - 1; i++)
{
adimatedGif.SelectActiveFrame(frameDimension, i);
g.DrawImage(adimatedGif, new Point(100, 100));
Application.DoEvents();
System.Threading.Thread.Sleep(delays[i] * 10);
}
}
}
以上,欢迎各路大神批评指正,多多留言~