委托图标 显示任务进度

技术与开发

魏伟,微软MVP(微软最有价值专家),产品设计&系统架构师,研发的产品主要有电话会议服务、移动代理服务器、无线开发中间件等。

什么是Aero呢?它是微软的一个开发代号,其含义是可靠、活力、反映、开放,大家也可以把它理解为界面特效,常见的界面特效有桌面透视效果、鼠标拖曳效果、鼠标晃动效果、任务栏图标进度显示效果等。

小提示:桌面透视效果是一个X光特效,可以透过所有打开的程序窗口看到桌面,只要鼠标移动到任务栏的右边缘,正打开的软件会像玻璃一样透明,桌面的图标都显示出来了。鼠标拖曳效果是一个排列窗口的新特效,可以快速排列已经打开的程序窗口,只要将窗口拖动到屏幕边缘即可很方便地并排显示两个窗口。鼠标晃动效果是一个更炫的排列窗口特效,曳住某个窗口,左右晃一晃,其他窗口即可最小化,再晃一晃,其他窗口又重新出现,可以让用户从杂乱无序的窗口中摆脱出来。

大多数Aero特效是Win7系统的功能,体现不出我们软件的与众不同,但有部分Aero特效是需要软件进行相应的编程才可以实现的,最简单的就是任务栏图标进度显示效果(见图)。

46-f10-1-2.jpg

目前,只有IE8、QQ等极少数大型软件在使用该特效,只要我们的软件支持微软的Framework,我们就可以在软件中添加通用代码(代码下载地址:http://www.shudoo.com/bzsoft)。

加入通用代码后,用户打开我们的软件,软件执行某些耗时命令时,任务栏中的图标就会显示软件打开的进度,是不是非常酷?

图标中怎么显示进度

在任务栏的图标中加入进度显示,这可能吗?在Win7中一点问题都没有。需要做两件事情,设置合适的进度条样式和更新进度条状态。设计进度条需要用到TaskbarManager类和TaskbarProgressBarState枚举。

在TaskbarManager类中可以设置进度条样式及进度。进度条样式包括无、普通、跑马灯、错误、暂停等五种类型。普通样式可以设置进度的最大值和当前值,Win7会自动根据这两个值运算出进度的百分比并显示出来。跑马灯效果是一个光柱从左至右飘过,任务完成时去掉该效果,该效果立即消失。

例如一个软件自动将多张图片上传到空间像册,当软件初始化时,默认是没有图标进度条的,相当于设置进度条样式为“无”,当上传任务开始,代码设置任务栏进度条样式为普通或跑马灯。如果上传出现了错误,将进度条样式设置为错误,以提醒用户重试或取消任务。任务完成时,将进度条设置为普通,并将当前值和最大值设为相等的两个值。

图标进度条代码

第一步:打开VS2008,新建一个Windows窗体应用程序的项目。引用Microsoft.WindowsAPICodePack和Microsoft.WindowsAPICodePack.Shell(下载地址:http://www.shudoo.com/bzsoft)。加入以下几个变量声明:

private TaskbarManager windowsTaskbar = TaskbarManager.Instance;

private int currentValue = 0;

private int maxValue = 100;

TaskbarProgressBarState state = TaskbarProgressBarState.NoProgress;

TaskbarProgressBarState oldstate = TaskbarProgressBarState.NoProgress;

第二步:制作一个普通样式的进度条,进度的增加是从左到右,进度值是整型变量,当进度值等于进度最大值(整型)时,进度的状态就是100%了,使用一个Timer控件定时增加进度值。在新建项目的默认窗体Form1中,增加一个button和Timer控件。在button的Click事件中添加代码,以下是关键代码(完整代码下载地址:http://www.shudoo.com/bzsoft):

if (!TaskbarManager.IsPlatformSupported)

{

MessageBox.Show("你的操作系统不支持任务栏进度条");

}

currentValue = 5;

state = TaskbarProgressBarState.Normal;

windowsTaskbar.SetProgressState(state, this.Handle);//如果想将任务栏进度条的状态和应用程序中原有的progressBar同步,可以传入progressBar的句柄

timer1.Enabled = true;

在Timer的Tick事件中加入代码,以下是关键代码(完整代码下载地址:http://www.shudoo.com/bzsoft):

if (currentValue >= maxValue)

{

//任务已结束

timer1.Enabled = false;

windowsTaskbar.SetProgressValue(maxValue, maxValue);

}

else

{

windowsTaskbar.SetProgressValue(currentValue, maxValue);//更新进度

currentValue += 20;

第三步:很多时候,软件无法估算命令执行的结束时间,也就不能准确设置进度状态值的最大值,这种情况就需要设置跑马灯效果的进度条,告诉用户软件仍然在运行,而不是没有响应。在Form1中增加一个button和Timer控件,在button的click事件中增加代码,其中关键代码如下(完整代码下载地址:http://www.shudoo.com/bzsoft):

currentValue = 0;

state = TaskbarProgressBarState.Indeterminate;

windowsTaskbar.SetProgressState(state, this.Handle);

timer2.Enabled = true;

在Timer的Tick事件中增加代码,其中关键代码如下:

if (currentValue >= maxValue)

{

timer2.Enabled = false;

windowsTaskbar.SetProgressValue(maxValue, maxValue);

}

else

{

currentValue += 20;

第四步:当进度条所表示的任务发生错误时,通常的做法是弹出窗口提醒用户,在Win7上又增加了一个更好的办法,就是将任务栏的进度条设置为“错误“样式。在Form1中增加一个button,在button的click事件中加入代码,其中关键代码如下(完整代码下载地址:http://www.shudoo.com/bzsoft):

currentValue = 50;

state = TaskbarProgressBarState.Error;

windowsTaskbar.SetProgressState(state, this.Handle);

timer1.Enabled = false;

timer2.Enabled = false;

第五步:任务结束或者被删除,应用程序需要取消进度条,设置进度条样式为空就可以了。在Form1中增加一个button,在button的click事件中加入代码,其中关键代码如下(完整代码下载地址:http://www.shudoo.com/bzsoft):

currentValue = 0;

state = TaskbarProgressBarState.NoProgress;

windowsTaskbar.SetProgressState(state, this.Handle);

timer1.Enabled = false;

timer2.Enabled = false;

我们的电脑因为某些原因不能升级到Win7,可又想尝试Win7的新功能怎么办?不用着急,XP系统也能拥有Win7的新功能,例如快速隐藏桌面等。到底应该怎么做呢?请看下期。

小编救急

在开发程序时遇到困难、设计好的程序运行老出错、看不懂编程语言中的难点……来小编开辟的救急板块吧,无论你开发哪种程序,无论你碰到什么问题,我们都可以给你提供帮助。来信请发到pcw-chendx@vip.sina.com。

关键词:连接Access数据库

开发QQ群:我们要打印大量的资料,由于资料所在的Excel比较多,所以想借助Access数据库来完成,这个应该怎么做呢?

小编:可以实现,在Access中输入以下连接代码:

Dim dataname As String, tablename As String, n As Integer

dataname = "C:\Documents and Settings\new\桌面\ado\数据库.mdb"

tablename = "编码表"

Dim myconnect As ADODB.Connection

Set myconnect = New ADODB.Connection

With myconnect

.Provider = "Microsoft.jet.oledb.4.0"

.Open dataname

End With

Dim myres As ADODB.Recordset

Set myres = New ADODB.Recordset

myres.Open tablename, myconnect, adOpenKeyset, adLockOptimistic

'统计表中的记录总数

n = myres.RecordCount

MsgBox "与数据库"" & dataname & ""连接成功!" & vbCrLf & vbCrLf _

& "在数据库的"" & tablename & ""表中共有 " & n & "条记录。", vbInformation, "连接数据库"

myres.Close

myconnect.Close

Set myres = Nothing

Set myconnect = Nothing

然后在Excel引用ADO(ActiveX数据对象)控件即可。

关键词:自动选中部分字符

开发QQ群:我们单位不大,财务软件是一名离职员工开发的,现在我想改进该软件。每次按Tab键后系统默认自动选中下一个Edit框中所有的字符(8个字符),而财务人员仅仅需要修改Edit框中最后两个数字,这样一来,不得不用鼠标加键盘的方法删除最后两个数字后再录入,这样做既耗时又耗力。能不能按下Tab键后直接选中Edit框最后两个数字,直接用小键盘修改Edit框中的值?

小编:当Edit成为焦点后,要确定两件事:1.从哪一个字符开始被选中;2.选中多少个字符,使用TEdit类的属性SelStart可以定位从哪一个字符开始被选中,SelLength可以指定选中字符的个数。以Delphi开发环境为例,选中一个Edit组件,在事件OnEnter中写入下面代码:

procedure TForm1.Edit1Enter(Sender: TObject);

begin

Edit1.SelStart:=6;//从第六个字符开始

Edit1.SelLength:=2;//选中2个字符

end;

这样假如Edit1中的字符是“12345678”,那么按下Tab键切换到Edit1后,系统就会自动选中最后两个字符“78”。