.NET WinForm程序在Windows7下实现玻璃效果和任务栏进度条效果-阿里云开发者社区

开发者社区> 浣熊干面包> 正文

.NET WinForm程序在Windows7下实现玻璃效果和任务栏进度条效果

简介:
+关注继续查看

Windows7提供了许多不错的用户体验,诸如窗体背景透明、玻璃磨砂效果、任务栏的JumpList定义以及任务栏进度条显示等等。伴随着这些特效的出现,Windows在底层也提供了相应的API支持,使得开发人员可以根据需要非常容易地在自己的应用程序中实现这些效果。如果你是原生的C++追随者,那恭喜你了!你完全可以毫无障碍地去使用这些API,前提是你需要阅读庞大的开发文档。如果你是新生的.NET开发人员(姑且还是将.NET developer称之为新生者吧,毕竟咱比C++出来得晚),也没有关系,微软在msdn网站中也发布了专门的Windows7 API托管类库,专门用于在.NET应用程序中调用。先来看看IE浏览器在Windows 7下下载文件时任务栏的进度条显示吧,相信很多人都不会陌生,如果你还闻所未闻,要么是你已经out了要么就是你从来就没有关注过Windows 7的这些细节。

  要在你自己的.NET应用程序中实现这个效果仅仅靠现有的.NET类库是不够的,必须要借助于Windows 7 API的支持。有关在托管代码中调用Windows 7 API可以看微软msdn上的一篇文章,http://archive.msdn.microsoft.com/WindowsAPICodePack。首先需要下载并安装Windows_API_Code_Pack_Self_Extractor,其实就是一个压缩包,里面包含了所有的源代码以及大量的示例,并附有文档可以查阅,非常详细。不过使用这些类库有几个前提条件:

  1. .NET Framework的版本必须是3.5SP1及以上。

  2. 运行的环境必须是在Windows 7 RTM及其相关版本,在Vista下部分功能可用。

  3. 需要DirectX的支持。

  下面是我用这些类库实现的一个效果,包含了窗体透明玻璃磨砂效果以及任务栏进度条显示。

  实现的代码很简单,但前提是你引用了WindowsAPICodePack的相关类库。

复制代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using Microsoft.WindowsAPICodePack.Taskbar;
using Microsoft.WindowsAPICodePack.Shell;

namespace VerticalProgressBar
{
    
public partial class Form1 : GlassForm
    {
        
protected BackgroundWorker worker = null;

        
public Form1()
        {
            InitializeComponent();
            worker 
= new BackgroundWorker();
            worker.WorkerReportsProgress 
= true;
            worker.DoWork 
+= new DoWorkEventHandler(worker_DoWork);
            worker.ProgressChanged 
+= new ProgressChangedEventHandler(worker_ProgressChanged);
            worker.RunWorkerCompleted 
+= new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);

            worker.RunWorkerAsync();
        }

        
void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            MessageBox.Show(
"Complete!");
        }

        
void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            
this.progressBar2.Value = e.ProgressPercentage;

            TaskbarManager.Instance.SetProgressValue(
this.progressBar2.Value, this.progressBar2.Maximum);
        }

        
void worker_DoWork(object sender, DoWorkEventArgs e)
        {
            
int count = 100;
            
for (int i = 0; i <= count; i++)
            {
                Thread.Sleep(
100);
                worker.ReportProgress(i);
            }
        }
    }
}
复制代码

  工程中引入了Microsoft.WindowsAPICodePack.dll和Microsoft.WindowsAPICodePack.Shell.dll。如果想让窗体呈现透明背景的玻璃磨砂效果,需要将窗体的类继承自Microsoft.WindowsAPICodePack.Shell.GlassForm。另外,在worker_ProgressChanged事件处理方法中,除了更新窗体上的ProgressBar外,我们还通过TaskbarManager.Instance.SetProgressValue方法来更新Windows任务栏的进度条显示。

  有了这个功能强大的托管类库的支持,可以非常方便地调用Windows7的API来实现那些非常酷的效果。不过这里有一个小问题需要解决,当你在你的应用程序中使用了这个类库并且在Windows7下实现了想要的效果,如果用户运行的Windows环境是XP或2003,那么你的程序会抛出异常,类似于下面的截图。

   其实除了Windows API相关的功能外,程序可以继续工作,因此你需要在程序中考虑各种不同环境下的应用,这个是需要思考的东西。


本文转自Jaxu博客园博客,原文链接:http://www.cnblogs.com/jaxu/archive/2011/08/03/2125768.html,如需转载请自行联系原作者


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
vue仿windows实现单选、多选、连选、框选效果
vue实现单机单选,按Ctrl+多选,按shift+连选,鼠标框选效果。
1141 0
Linux网络进程监控工具nethogs
  Linux网络监控工具nethogs 标签: 监控工具linux 2015-12-17 22:06 448人阅读 评论(0) 收藏 举报  分类: linux(40)  版权声明:本文为博主原创文章,未经博主允许不得转载。
963 0
基于Kubernetes的瓜子云的任务调度系统
很大的挑战。 接下来我讲详细介绍一下瓜子云的任务调度系统搭建所遇到的问题和解决方案。 需求 瓜子最早的时候,任务调度用的是Crontab,后来由于数据仓库的复杂调度需求,我们引入了Airflow。Airflow支持DAG依赖,失败重试,历史状态记录,log收集等多种非常使用的功能。
2435 0
Shell多进程执行任务
管道就像水管,有流入才会有流出,水管数水流的通道,管道是数据的通道。管道分为无名管道和有名管道。 无名管道:常用的|就是管道,只不过是无名的,可以直接作为两个进程的数据通道,比如:cat file.txt | grep test 有名管道:mkfilo 可以创建一个管道文件,比如:mkfiflo testfifo 管道有一个特点,如果管道中没有数据,那么取管道数据的操作就会阻塞,直到管道内进入数据,然后读出后才会终止这一操作,同理,写入管道的操作如果没有读取操作,这一个动作也会阻塞。
836 0
谷歌更强 NLP 模型 XLNet 开源:20 项任务全面碾压 BERT!
并在 18 项任务上取得了当前最佳效果!
1449 0
屏蔽Windows98/2000/XP任务栏、win键、Ctrl+Esc、Alt+Tab、Ctrl+Alt+Del
关于这方面的文章挺多,对任务栏、win键、Ctrl+Esc、Alt+Tab的屏蔽,一般方法较为简单,最多用底层键盘钩子+DLL就能完美解决。
740 0
写一个图片轮播效果的Demo(自动播放)附代码
js图片轮播切换 .imgCon { width: 450px; height: 300px;...
842 0
windows 任务管理器,查看进程id,进程标识符pid
任务管理器默认只显示了几列常用的属性,如果要看进程id等属性,需要我们设置让它显示出来。
9 0
941
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载