Winforms: Windows 7中Taskbar的新效果(3)——进度条

来源:互联网 发布:思迅商云网络断开 编辑:程序博客网 时间:2024/06/01 16:25

Win7中,当我们从网上下载一个比较大的文件的时候,我们发现下载对应的窗口在Taskbar上对应的按钮有进度条来显示下载的进展情况。Win7为了方便开发这种新的UI效果,Windows提供了两个API

·         void SetProgressValue(IntPtr hwnd, UInt64 ullCompleted, UInt64 ullTotal);

·         void SetProgressState(IntPtr hwnd, TBPFLAG tbpFlags);

 

                SetProgressValue有三个参数:第一个参数hwnd是进程主窗口的句柄,第二个参数ullCompleted是当前已经完成的进度,第三个参数ullTotal就是进度总值。根据后两个参数,Win7就可以确定进度条显示的比例。

SetProgressState有两个参数:第一个参数hwnd同样也是进程主窗口的句柄,第二个参数表示进度状态。Win7提供了如下几种状态:没有进展(NoProgress)、不确定进度(Indeterminate)、正常(Normal)、出错(Error)和暂停(Paused)。我们可以定义如下枚举类型表示这几种状态:

    public enum TaskbarProgressBarState

    {

        NoProgress = 0,

        Indeterminate = 0x1,

        Normal = 0x2,

        Error = 0x4,

        Paused = 0x8

    }

 

接下来我们用一个例子来详细说明如果调用上面两个API来实现Win7Taskbar的进度条效果:

1.       form上添加一个Text属性为StateLabel,在它的右边添加ComboBox并命名为comboBoxProgressBarStates

2.       form上添加一个Text属性为ValueLabel,在它的右边添加TackBar并命名为tackBarProgressBarValue

 

此时程序的界面效果如下图所示:

设置Taskbar进度条的实例程序

 

3.       在类TaskManager中添加一个方法SetProgressBarState如下:

        public void SetProgressState(IntPtr windowHandle, TaskbarProgressBarState state)

        {

            ThrowIfNotSupport();

 

            TaskbarList.SetProgressState(windowHandle, (TBPFLAG)state);

        }

 

4.       在类TaskManager中添加一个方法SetProgressBarValue如下:

        public void SetProgressValue(IntPtr windowHandle, int currentValue, int maximumValue)

        {

            ThrowIfNotSupport();

 

            TaskbarList.SetProgressValue(windowHandle, Convert.ToUInt32(currentValue), Convert.ToUInt32(maximumValue));

        }

 

5.       form中获取TaskManager的一个实例:

        // Keep a reference to the Taskbar instance

        private TaskbarManager windowsTaskbar = TaskbarManager.Instance;

 

6.       form添加Show事件响应器,初始化ComboBoxTaskbar进度条状态如下:

        private void FormProgressBar_Shown(object sender, EventArgs e)

        {

            // Add each item into comboBoxProgressBarStates

            foreach (string state in Enum.GetNames(typeof(TaskbarProgressBarState)))

                comboBoxProgressBarStates.Items.Add(state);

 

            comboBoxProgressBarStates.SelectedItem = "NoProgress";

 

            // Set our default

            TaskbarManager.Instance.SetProgressState(this.Handle, TaskbarProgressBarState.NoProgress);

        }

 

7.       ComboBox添加IndexChanged事件响应器如下:

        private void comboBoxProgressBarStates_SelectedIndexChanged(object sender, EventArgs e)

        {

            // Update the status of the taskbar progress bar

            TaskbarProgressBarState state = (TaskbarProgressBarState)(Enum.Parse(typeof(TaskbarProgressBarState), (string)comboBoxProgressBarStates.SelectedItem));

 

            windowsTaskbar.SetProgressState(this.Handle, state);

 

            // Update the application progress bar,

            // as well disable the trackbar in some cases

            switch (state)

            {

                case TaskbarProgressBarState.Normal:

                    windowsTaskbar.SetProgressValue(this.Handle, trackBarProgressBarValue.Value, 100);

                    trackBarProgressBarValue.Enabled = true;

                    break;

                case TaskbarProgressBarState.Paused:

                    windowsTaskbar.SetProgressValue(this.Handle, trackBarProgressBarValue.Value, 100);

                    trackBarProgressBarValue.Enabled = true;

                    break;

                case TaskbarProgressBarState.Error:

                    windowsTaskbar.SetProgressValue(this.Handle, trackBarProgressBarValue.Value, 100);

                    trackBarProgressBarValue.Enabled = true;

                    break;

                case TaskbarProgressBarState.Indeterminate:

                    trackBarProgressBarValue.Enabled = false;

                    break;

                case TaskbarProgressBarState.NoProgress:

                    trackBarProgressBarValue.Value = 0;

                    trackBarProgressBarValue.Enabled = false;

                    break;

            }

        }

 

8.       TackBar添加Scroll事件响应器如下:

        private void trackBarProgressBarValue_Scroll(object sender, EventArgs e)

        {

            TaskbarManager.Instance.SetProgressValue(this.Handle, trackBarProgressBarValue.Value, 100);

        }

 

9.       编译运行。

当进度条的状态为NoProgress时,该程序在Taskbar上显示为:

状态为NoProgress的进度条

当进度条的状态为Indeterminate时,该程序在Taskbar不能确定其进度,所以进度条循环显示。下面是其截屏:

状态为Indeterminate的进度条

当进度条的状态为Normal时,该程序在Taskbar的进度条已经完成的部分显示为绿色,显示为:

状态为Normal的进度条

当进度条的状态为Error时,该程序在Taskbar的进度条已经完成的部分显示为红色,显示为:

状态为Error的进度条

当进度条的状态为Paused时,该程序在Taskbar的进度条已经完成的部分显示为黄色,显示为:

状态为Paused的进度条