1、选择合适的gif格式动图(去百度等待gif动图进行下载)。例如我选择的动图如下:
2、使用Ps工具对gif动图进行背景透明化处理以便在c#软件中运行时不突兀。
- 把文件在PS软件中打开,打开窗口选项中的时间轴和图层。
- 选定时间轴中的第一帧,锁定图层中的第一层,处理过程中编号进行一 一对应。选中工具栏中的魔术棒工具,把容差调至0,点中背景区使背景透明化。
- 对选中的背景区进行清除(Delete键或者选择编辑中的清除),处理完切记点击菜单中的取消选择(Ctrl键+D),因为动图每一帧的选区不同要区分开来。
- 重复以上处理过程,直至最后一张结束。
- 文件导出选择存储为Web所用格式。点击存储选择gif格式输出。到此Ps软件的处理工作全部完成。
3、制作完成的动图如下所示:
4、在winform工程中新建自定义控件,命名LoadingPage.cs,拉入控件PictureBox,并把loading.gif导入项目,PictureBox的Image属性导入gif动图,SizeMode属性设置为CenterImage或者Zoom。
5、通过使用多线程的形式调用,在双击datagridview的同时加载等待界面的LoadingPage控件。同时在此过程中新建获取图像的新线程,并设置IsBackground属性为true,ThreadStart()方法只能有一个object类型的参数。使用代码如下:
/// <summary>
/// 属性为null的Image
/// </summary>
Image nonImage;
/// <summary>
/// 获取图像进程
/// </summary>
Thread getImageThread;
/// <summary>
/// 等待界面
/// </summary>
LoadingPage loadingPage = new LoadingPage();
/// <summary>
/// 设置InsectPage图片的委托
/// </summary>
/// <param name="image"></param>
delegate void SetInpsectImageCallback(Image image);
void DetailDataGridView_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
{
if (inspectPage.DetailDataGridView.Rows[e.RowIndex].Cells[0].Value.ToString() == string.Empty)
return;
else
{
if (inspectPage.DetailDataGridView.Rows[e.RowIndex].Cells["FINISHED"].Value.ToString() != string.Empty)
{
string imageString = "select PICTURE from " + inspectClassList[allDagridviewRowIndex].tableName + " where OBJECTID = " + inspectPage.DetailDataGridView.Rows[e.RowIndex].Cells["OBJECTID"].Value + "";
inspectPage.DetailDataGridView.Enabled = false;
inspectPage.AllDataGridView.Enabled = false;
inspectPage.PicturePanel.Controls.Add(loadingPage);//等待界面加入InspectPage
loadingPage.BringToFront();//将控件置前
loadingPage.Dock = DockStyle.Fill;
getImageThread = new Thread(ThreadProcSafe);
getImageThread.IsBackground = true;//设置为后台线程
getImageThread.Start(imageString);
}
}
}
/// <summary>
/// 新线程调用方法
/// </summary>
/// <param name="fillstr">传递的SQL语句(只允许一个object类型的属性)</param>
private void ThreadProcSafe(object fillstr)
{
string imageString = fillstr.ToString();
LinkSQLSeverClass sqlSeverClass = new LinkSQLSeverClass(this.Text);
DataTable bytesTable = sqlSeverClass.GetDataTable(imageString);
byte[] imageBytes = (byte[])bytesTable.Rows[0]["PICTURE"];
MemoryStream ms = new MemoryStream(imageBytes);
Image image = Image.FromStream(ms);
SetInpsectImage(image);
}
/// <summary>
/// 线程操作控件设置InspectPage的Background属性
/// </summary>
/// <param name="image"></param>
private void SetInpsectImage(Image image)
{
if (inspectPage.ImageBox.InvokeRequired)
{
SetInpsectImageCallback d = new SetInpsectImageCallback(SetInpsectImage);
this.Invoke(d, new object[] { image });
}
else
{
inspectPage.ImageBox.BackgroundImage = image;
inspectPage.PicturePanel.Controls.Remove(loadingPage);
getImageThread.Abort();//终止线程
inspectPage.DetailDataGridView.Enabled = true;
inspectPage.AllDataGridView.Enabled = true;
}
}
6.将动图应用到项目中,成果展示图如下所示: