【VS2010与Windows 7共舞系列】
【IT168专稿】在本系列的前面两篇文章中,我们分别介绍了Windows 7任务栏的Jumplist和实时应用程序缩略图。通过这两项新特性,任务栏为我们的终端用户提供了丰富的快捷功能和信息,让用户感觉到随时随地,应用程序就在手边(at fingertip)。但是微软似乎并不满足,雷德蒙的程序员们想要榨干任务栏的最后一滴油水:任务栏状态提示。
第一篇:与7共舞:Jumplist
第二篇:与7共舞 :任务栏缩略图
通过对应用程序在任务栏中的按钮样式进行变化,我们可以以多种形式反映应用程序的状态,向用户提示当前应用程序的各种有用信息。比如,我们通过任务栏可以了解应用程序激活与否,是否正在运行,当前某个动作的执行进度等等。总之,通过任务栏状态提示,用户可以对应用程序的状态一目了然。
下面,我们就来介绍一下如何将应用程序的各种状态反映到任务栏按钮上,为用户提供直观而有效的应用程序状态提示。
我们知道,每个在桌面运行的应用程序或者快捷方式反映在任务栏中就是一个任务栏按钮。通过对这些任务栏按钮显示状态的改变,我们可以直观而有效地反映当前应用程序的状态。例如,我们可以通过按钮的不同显示状态表示程序的运行状态:
图1 任务栏按钮状态
另外,我们也可以通过改变任务栏按钮的图标,在应用程序原有图标的基础上添加一个覆盖图标,表示应用程序的某种当前状态和状态的改变:
图2 任务栏按钮图标表示状态
更进一地,我们还可以在任务栏按钮中添加一个进度条,动态地反映应用程序某项动作的执行进度以及状态。比如我们在复制文件的时候,可以用这个进度条反映文件复制的进度:
图3 任务栏进度条表示进度
看了这些关于任务栏状态提示的介绍,大家是不是都跃跃欲试了呢?都想给自己的应用程序添加上这些任务栏新特性,让它们可以借助这些特性改善应用程序的用户体验。下面我们就以一个假想的即时通讯软件为例子,介绍一下如何利用任务栏按钮反映应用程序的状态。
通过图标反映应用程序状态
我们都知道,即时通讯软件有不同的登录状态:在线,离线,离开等等。我们通过改变应用程序任务栏按钮的图标,通过在不同的登录状态显示不同的图标,就可以很好地向用户反映当前登录状态和状态的改变。
我们新建一个C#的Windows Form应用程序,在主面板上我们添加一个ComboBox,并编辑其中的列表项。从中我们可以选择当前的登录状态:
图4 编辑ComboBox
当我们在ComboBox中的选项发生变化后,我们需要改变任务栏图标的按钮以表示登录状态的变化。这时我们需要对ComboBox控件的SelectedIndexChanged事件进行处理,在其中实现任务栏按钮图标的改变:
private void cmbStatus_SelectedIndexChanged(object sender,
EventArgs e)
{
// 根据用户选择的状态获得突破
Icon icon = GetIconByStatus((string)cmbStatus.SelectedItem);
// 设置应用程序任务栏按钮的图标
Windows7Taskbar.SetTaskbarOverlayIcon(this.Handle,
icon, (string)cmbStatus.SelectedItem);
}
private static Icon GetIconByStatus(string status)
{
// 根据用户选择的状态使用不同的图标文件
switch (status)
{
case "Available":
return new Icon("Available.ico");
case "Appear Offline":
return new Icon("Offline.ico");
case "Away":
return new Icon("Away.ico");
}
return null;
}
现在,当我们编译运行整个解决方案,我们在主界面中选择不同的登录状态,就会看到任务栏按钮的图标会根据我们选择的状态而发生改变,从此登录状态一目了然:
图5 任务栏按钮图标反映状态
通过进度条反映动作进度
通过任务栏按钮图标的改变,我们可以反映应用程序的静态状态,那么有没有办法可以反映应用程序的动态状态?比如一个文件复制过程的进度?答案当然是肯定的。通过任务栏进度条,我们就可以实时动态地反映应用程序某个动作的当前进度或者是其执行状态。
还是回到我们的例子中,在即时通讯软件中,我们常常需要传送文件给其他联系人。文件传输是一个耗时的过程,我们可以利用任务栏进度条实时地反映这一过程,让用户了解当前的传送进度。另外,根据网络情况,文件传送还可能出现各种异常情况,比如连接超时等等。对于这些特殊状态,我们也可以在任务栏按钮中进行反应。
我们在主界面上添加一个计时器控件和一个按钮控件,然后将按钮控件的点击函数实现如下,以模拟用户的文件发送动作:
// 表示文件传送进度
int _percentFileCompleted;
private void sendFile_Click(object sender, EventArgs e)
{
// 设定计时器的时间间隔
sendFileTimer.Interval = 1000;
// 当计时器触发后,需要进行的处理
sendFileTimer.Tick += delegate
{
// 改变文件传送进度
_percentFileCompleted += 10;
// 当文件传送快完成时,我们模拟一个网络异常状态
// 这种事情,经常发生啊~~~~
if (_percentFileCompleted == 80)
{
// 停止计时器
sendFileTimer.Stop();
// 显示错误消息
MessageBox.Show("网络异常,文件传送失败 :-< ",
MessageBoxButtons.RetryCancel,
MessageBoxIcon.Error);
// 设置任务栏进度条的状态为"错误"状态
// 任务栏进度条将显示为红色
Windows7Taskbar.SetProgressState(Handle,
Windows7Taskbar.ThumbnailProgressState.Error);
// 清空进度
_percentFileCompleted = 0;
}
else
{
// 状态正常,根据文件传送进度设置进度条的值
Windows7Taskbar.SetProgressValue(Handle,
(ulong)_percentFileCompleted, (ulong)100);
}
};
// 启动计时器
sendFileTimer.Start();
}
现在,我们启动应用程序,点击"发送文件"按钮模拟文件的发送,我们可以看到,任务栏按钮上有进度条反映当前的文件发送状态,当进度到达80%的时候,会弹出消息框提示文件发送失败,进度条的颜色也会相应的变成红色,表示文件发送过程出错。
图6 任务栏进度条
"Jumplist,缩略图,状态提示",拥有了这诸般武艺,任务栏成了众人瞩目的焦点。