2010-04-19 24 views
8

在Vista/7中,Windows資源管理器外殼窗口利用特殊的靜態進度條來顯示硬盤空間。如何使用米式進度條?

使用默認樣式,此欄爲藍色且不帶動畫。當它接近完整時(磁盤空間不足),它也會變成紅色。

使用消息傳遞,我可以告訴Windows窗體ProgressBar控件將其狀態更新爲暫停和錯誤(分別爲黃色和紅色),這可以正常工作,但這些仍然是特定於進度。

Windows User Experience Guidelines,它明確指出了進度條的這個「米」變種:

這種模式是不是一個進度條,但 它使用進度 欄控件來實現。儀表有獨特的 看起來與真正的 差異進步吧。

他們說這是「使用進度條控件實現的」,所以......怎麼樣?我可以向控制檯發送什麼信息使其按照這種方式行事?

我看到你可以send messages for setting the bar color,但文檔說這些調用在啓用視覺樣式時被忽略。原始ProgressBar控件的Windows API文檔中沒有其他內容似乎提供了一種方法來執行此操作。我只是堅持做一個自定義繪製的酒吧?我真的很想盡可能地利用操作系統,以便應用程序在不同的操作系統版本中顯示一致。我意識到,Vista之前的版本可能不會支持這一點,但。

我正在尋找Windows窗體解決方案,但我不知道它是否通過Win32 API甚至暴露了在所有

回答

9

這是可能的,但不能通過ProgressBar。 Win7也不使用PB來繪製這些米,沒有與酒吧相關的窗口句柄。它必須使用自定義繪圖。在WinForms以及VisualStyleRenderer類中也是如此。但有一件事情沒有幫助,因爲所需的視覺樣式部件和狀態沒有被聲明,即使在.NET 4.0中也沒有。

此示例的形式再現了米欄:

using System; 
using System.Drawing; 
using System.Windows.Forms; 
using System.Windows.Forms.VisualStyles; 

namespace WindowsFormsApplication1 { 
    public partial class Form1 : Form { 
    public Form1() { 
     InitializeComponent(); 
    } 
    VisualStyleRenderer renderer = new VisualStyleRenderer(VisualStyleElement.ProgressBar.Bar.Normal); 
    protected override void OnPaint(PaintEventArgs e) { 
     renderer.SetParameters("PROGRESS", 11, 2); 
     renderer.DrawBackground(e.Graphics, new Rectangle(10, 10, 200, 15)); 
     renderer.SetParameters("PROGRESS", 5, 4); 
     renderer.DrawBackground(e.Graphics, new Rectangle(10, 10, 100, 15)); 
    } 
    } 
} 

我從vsstyle.h SDK頭文件中的一部分,並且狀態編號。

+0

對於任何感興趣的人,您可以在%ProgramFiles%\ Microsoft SDKs \ Windows \ vx.xx \ Include中找到vsstyle.h其中vx.xx是安裝的任何版本的SDK(您可能有幾個)。 http://en.wikipedia.org/wiki/Microsoft_Windows_SDK – 2010-04-20 14:43:29

+1

也應該指出任何人有麻煩再現這一點:請注意,這將繪製到背景。如果您有面板或任何其他容器,則您需要渲染器繪製它們的繪畫事件,而不是表單的繪製事件。否則,面板會重疊,而且,正如您現在應該知道的那樣,面板實際上不是透明的,因此它看起來像您的酒吧沒有渲染。 – 2010-04-20 15:54:56

+0

當我嘗試運行這個時,我得到'給定類,部件和狀態的組合不是由當前視覺樣式定義的''renderer.SetParameters(「PROGRESS」,11,2);'。 – 2011-06-06 15:40:16