winform等待界面制作

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.将动图应用到项目中,成果展示图如下所示:

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值