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

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的进度条

你可能感兴趣的:(windows,UI)