在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来实现Win7中Taskbar的进度条效果:
1. 在form上添加一个Text属性为State的Label,在它的右边添加ComboBox并命名为comboBoxProgressBarStates ;
2. 在form上添加一个Text属性为Value的Label,在它的右边添加TackBar并命名为tackBarProgressBarValue;
此时程序的界面效果如下图所示:
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事件响应器,初始化ComboBox和Taskbar进度条状态如下:
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上显示为:
当进度条的状态为Indeterminate时,该程序在Taskbar不能确定其进度,所以进度条循环显示。下面是其截屏:
当进度条的状态为Normal时,该程序在Taskbar的进度条已经完成的部分显示为绿色,显示为:
当进度条的状态为Error时,该程序在Taskbar的进度条已经完成的部分显示为红色,显示为:
当进度条的状态为Paused时,该程序在Taskbar的进度条已经完成的部分显示为黄色,显示为: