博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何弹出一个模式窗口来显示进度条 .
阅读量:5982 次
发布时间:2019-06-20

本文共 1760 字,大约阅读时间需要 5 分钟。

最近看了好多人问这方面的问题,以前我也写过一篇blog,里面说了如何在子线程中控制进度条。但目前大多数环境,需要弹出模式窗口,来显示进度条,那么只需要在原先的基础上稍作修改即可。

 

首先是进度条窗体,需要在上面添加进度条,然后去掉ControlBox。除此外,还要增加一个方法,用来控制进度条的增加幅度,具体如下:

    /// <summary>

    /// Increase process bar

    /// </summary>

    /// <param name="nValue">the value increased</param>

    /// <returns></returns>

    public bool Increase( int nValue )

    {

        if( nValue > 0 )

        {

            if( prcBar.Value + nValue < prcBar.Maximum )

            {

                prcBar.Value += nValue;

                return true;

            }

            else

            {

                prcBar.Value = prcBar.Maximum;

                this.Close();

                return false;

            }

        }

        return false;

    }

 

接着就是主窗体了,如何进行操作了,首先需要定义两个私有成员,一个委托。其中一个私有成员是保存当前进度条窗体对象,另一个是保存委托方法(即增加进度条尺度),具体如下:

    private frmProcessBar myProcessBar = null;

    private delegate bool IncreaseHandle( int nValue );

    private IncreaseHandle myIncrease = null;

 

接着要在主窗体中提供函数来打开进度条窗体,如下:

    /// <summary>

    /// Open process bar window

    /// </summary>

    private void ShowProcessBar()

    {

        myProcessBar = new frmProcessBar();

 

        // Init increase event

        myIncrease = new IncreaseHandle( myProcessBar.Increase );

        myProcessBar.ShowDialog();

        myProcessBar = null;

    }

 

那么现在就可以开始创建线程来运行,具体如下:

    /// <summary>

    /// Sub thread function

    /// </summary>

    private void ThreadFun()

    {

        MethodInvoker mi = new MethodInvoker( ShowProcessBar );

        this.BeginInvoke( mi );

 

        Thread.Sleep( 1000 );//Sleep a while to show window

 

        bool blnIncreased = false;

        object objReturn = null;

        do

        {

            Thread.Sleep( 50 );

            objReturn = this.Invoke( this.myIncrease,

                new object[]{ 2 } );

            blnIncreased = (bool)objReturn ;

        }

        while( blnIncreased );

    }

      

       注意以上,在打开进度条窗体和增加进度条进度的时候,一个用的是BeginInvoke,一个是Invoke,这里的区别是BeginInvoke不需要等待方法运行完毕,而Invoke是要等待方法运行完毕。还有一点,此处用返回值来判断进度条是否到头了,如果需要有其他的控制,可以类似前面的方法来进行扩展。

 

启动线程,可以如下:

    Thread thdSub = new Thread( new ThreadStart( ThreadFun ) );

    thdSub.Start();

 

这样,一个用模式打开进度条窗体就做完了。

转载于:https://www.cnblogs.com/xchangli/p/3205635.html

你可能感兴趣的文章
JavaScript:Array 对象
查看>>
PDFCreator:一款免费,开源的PDF(Tiff,pcx,png,jpeg,bmp,PS,EPS)打印机(VB,GPL),并提供了COM接口,方便使用各种编程语言调用...
查看>>
Note 1773479 - SYB: Displaying multiple triggers per object
查看>>
联手云计算核心技术开发,BoCloud与中科院软件所战略合作
查看>>
2017年背景下的SSD选购技巧有哪些变化?
查看>>
2016年的数据存储和管理的成本将何去何从?
查看>>
Airpods 并非无用,而是苹果借助语音交互布局物联网的新“棋子”
查看>>
项目总结:数据迁移测试
查看>>
SQL中存储过程的创建和使用
查看>>
荷兰政府:保证不强制在任何产品中留有后门
查看>>
编写单元测试的10条理由
查看>>
LINUX-SAMBA服务配置
查看>>
图像处理------光束效果
查看>>
剑指offer 面试题6:重建二叉树
查看>>
基于ES5`defineProperty` 实现简单的 Mvvm框架
查看>>
关于UI设计的一些工作了解
查看>>
spring cloud构建互联网分布式微服务云平台-Spring Cloud Config环境库
查看>>
java B2B2C Springcloud仿淘宝电子商城系统-Zipkin服务端配置
查看>>
Node.js的npm全局安装包引用
查看>>
js事件杂谈
查看>>