当前位置: 首页 > news >正文

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

相关文章:

  • java题有两个矩阵A和B,java_java解一个比较特殊的数组合并题,给定两个排序后的数组A和B,其 - phpStudy...
  • QQ游戏到底是如何实现百万人同时在线并保持游戏高效率的呢?
  • matlab随机生成点图,matlab随机生成散点图
  • 菊子曰
  • php编写异常处理,PHP实现异常处理类的方法
  • Linux + FreeTDS + unixODBC + Haskell 访问 SQL Server 数据库
  • matlab函数accumarray,MATLAB常用函数
  • ora-12514问题解决
  • mysql数据库全文本搜索,MySQL必知必会——第18章 全文本搜索 读书笔记
  • 淘宝定制手机:移动电子商务战略及其背后
  • matlab里a1不能做变量,matlab成员函数不能修改成员变量值,求助
  • Haskell 中使用 BloomFilter(布隆过滤器)处理大规模数据
  • java 一元稀疏多项式简单计算器,一元稀疏多项式计算器
  • 《BREW进阶与精通——3G移动增值业务的运营、定制与开发》连载之47---BREW SDK 九大功能之显示和用户界面...
  • php zlib 压缩图片,[转]PHP通过zlib扩展实现GZIP压缩输出
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • 77. Combinations
  • ECMAScript入门(七)--Module语法
  • Git 使用集
  • Javascript编码规范
  • Java多态
  • Laravel 中的一个后期静态绑定
  • linux学习笔记
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • python3 使用 asyncio 代替线程
  • SegmentFault 2015 Top Rank
  • spring boot 整合mybatis 无法输出sql的问题
  • SpringCloud集成分布式事务LCN (一)
  • Vue UI框架库开发介绍
  • vue脚手架vue-cli
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 回顾2016
  • 区块链将重新定义世界
  • 少走弯路,给Java 1~5 年程序员的建议
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • 【干货分享】dos命令大全
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • 交换综合实验一
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • # 数论-逆元
  • (定时器/计数器)中断系统(详解与使用)
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (转)创业的注意事项
  • ./configure,make,make install的作用(转)
  • .NET Framework 4.6.2改进了WPF和安全性
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • .NET性能优化(文摘)
  • .so文件(linux系统)