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的支援。有關在Managed 程式碼中調用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相關的功能外,程式可以繼續工作,因此你需要在程式中考慮各種不同環境下的應用,這個是需要思考的東西。