如何弹出一个模式窗口来显示进度条 .

摘要:
最近,我看到很多人问我这个问题。我写了一篇关于如何控制子线程中的进度条的博客。然而,在大多数环境中,需要一个弹出窗口来显示进度条,因此您只需要在原始基础上进行一些更改。此外,还添加了一个方法来控制进度条的增加,如下所示://////Increaseprocessbar/////////valueincreated//publicpoolIncrease{if{prcBar.Value+=nValue;returntrue;}否则{prcBar.Value=prcBar.Maximum;this.Close();returnfalse;}}returnfalse;}然后是主要形式。如何操作?首先,您需要定义两个私有成员和一个委托。按如下方式启动线程:ThreadhreadSub=newThread;第四小组。开始();这样,就完成了打开进度条窗体的模式。

最近看了好多人问这方面的问题,以前我也写过一篇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();

 

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

免责声明:文章转载自《如何弹出一个模式窗口来显示进度条 .》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇SQL Server服务启动时错误:1069(由于登陆失败而无法启动服务)Zero-shot learning(零样本学习)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

WPF 快捷键(窗体)

前言:在WPF项目开发当中,遇到了需要用到快捷键的需求,于是对热键做了一个快速学习,但是这方面的资源很少。。。 热键大致分为三种场景,下面用QQ的使用场景举例: 全局热键:QQ的Ctrl+Alt+A截图。 焦点热键:QQ消息栏的Shift+Enter文本换行。 窗体热键:Alt+F4关闭QQ的窗口。 在WPF当中,全局热键 和 焦点热键都可以轻松实现,下...

WPF-悬浮窗(类似于360)

boss要求开发一个类似于360的悬浮窗,如下图所示: 目前采用的是wpf做的客户端,之前有个winform的项目,我参考了下,完成了wpf版的悬浮窗。 Height="52" Width="131" WindowStartupLocation="Manual" ShowInTaskbar="False" WindowStyle="None" W...

C# MDI 窗体和菜单

MDI主窗体和子窗体 1,如何把之前的子窗体提到前面? 调用子窗体的Activate()即可,TopMost没什么用,只是表示位于没有设置topmost的其它窗体之上而已 2,MDI子窗体的标题栏很难去掉,通过把窗口风格设置为NONE的方法对于最大化的窗口没用,而非最大化手动设置子窗体位置又很麻烦,总是设置不对,有偏移 但是子窗口标题栏会和菜单整合在一起,...

Qt之手动布局

简述 手动布局,可以实现和水平布局、垂直布局、网格布局等相同的效果,也可实现属于自己的自定义布局,当窗体缩放时,控件可以随之变化。 其对于坐标系的建立有严格要求,纯代码思维,使用复杂,不易维护,所以一般不建议使用。 下面我们以简单的例子来讲解如何使用。 简述 事件 垂直布局 简略图 效果 源码 水平布局 效果 源码 总结 事件 在Qt之布...

C#——获取鼠标当前坐标

Control.PointToScreen:将指定工作区点的位置计算成屏幕坐标 Control.MousePosition:  鼠标相对于屏左上角的坐; this.PointToClient(Control.MousePosition): 将指定屏幕点的位置计算成工作区坐标 (鼠标相对于窗体工作区的坐标); this.Location:窗体左上角相对于屏左...

C#-WebForm-JS知识:基础部分、BOM部分、DOM部分、JS事件

---恢复内容开始--- 一、基础部分: 1、JavaScript 是什么? 是一门脚本语言,是属于弱类型(语言语法很随意),C#是强类型(语言语法非常严格)(李献策lxc) 优点:JS 执行速度快 2、JS 与java有什么关系?  没有任何关系 3、JS 能做什么事情?   能控制浏览器 BOM   控制元素 DOM JS不能做什么?   不能操作文件...