2010-04-19 5 views
8

In Vista/7 verwendet das Windows Explorer-Shell-Fenster eine spezielle Art von statischem Fortschrittsbalken, um Festplattenspeicher anzuzeigen.Wie kann ich eine Fortschrittsleiste im Meter-Stil verwenden?

Bei Standardstilen ist diese Leiste blau und nicht animiert. Es wird auch rot, wenn es fast voll ist (geringer Speicherplatz).

Mithilfe von Messaging kann ich dem Windows Forms ProgressBar-Steuerelement mitteilen, dass es den Status "Pausiert" und "Fehler" (gelb bzw. rot) aktualisiert. Dies funktioniert jedoch weiterhin.

Im Windows User Experience Guidelines, es weist ausdrücklich darauf hin diese "meter" Variante der Progress Bar:

Dieses Muster ist nicht ein Fortschrittsbalken, aber wird die Fortschritt bar Steuerung realisiert. Meter haben eine deutliche Aussehen, um sie von wahren Fortschrittsbalken zu unterscheiden.

Sie sagen, dass es "mit der Fortschrittsbalkensteuerung implementiert wird", also ... wie? Welche Nachricht könnte ich an die Steuerung senden, damit sie sich so verhält?

Ich habe gesehen, dass Sie send messages for setting the bar color, aber die Dokumentation sagt, diese Aufrufe werden ignoriert, wenn visuelle Stile aktiviert sind. Nichts anderes in der Windows-API-Dokumentation für rohe ProgressBar-Steuerelemente scheint eine Möglichkeit zu bieten, dies zu tun. Bin ich gerade dabei, eine benutzerdefinierte gezogene Bar zu machen? Ich würde das OS gerne so oft wie möglich nutzen, damit die Anwendung in den verschiedenen Betriebssystemversionen konsistent erscheint. Mir ist klar, dass Pre-Vista-Versionen dies wahrscheinlich nicht unterstützen werden.

Ich bin auf der Suche nach einer Windows Forms-Lösung, aber ich frage mich, ob es überhaupt über die Win32-API ausgesetzt ist.

Antwort

9

Es ist möglich, aber nicht durch ProgressBar. Win7 verwendet auch keinen PB, um diese Meter zu zeichnen, es ist kein Fensterhandle mit der Leiste verbunden. Es muss benutzerdefinierte Zeichnung verwenden. Das ist in WinForms auch mit der VisualStyleRenderer-Klasse möglich. Eine Sache, die jedoch nicht hilft, ist, dass die erforderlichen visuellen Stilteile und -zustände nicht deklariert werden, nicht einmal in .NET 4.0.

Dieses Beispielformular gibt das Messgerät bar:

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)); 
    } 
    } 
} 

ich das Teil und Zustandsnummern aus der vsstyle.h SDK Header-Datei einsehen.

+0

Für alle, die interessiert sind, können Sie vsstyle.h in% ProgramFiles% \ Microsoft SDKs \ Windows \ vx.xx \ Include finden, wobei vx.xx die Version ist, die SDK installiert hat (möglicherweise mehrere). http://en.wikipedia.org/wiki/Microsoft_Windows_SDK –

+1

Auch sollte auf jeden hinweisen, der Schwierigkeiten hat, dies zu reproduzieren: beachten Sie, dass dies zu einem Hintergrund zieht. Wenn Sie über Bedienfelder oder andere Container verfügen, möchten Sie, dass der Renderer IHRE Paint-Ereignisse und nicht die Formulare des Formulars zeichnet. Ansonsten überlappt sich das Panel und, wie Sie jetzt wissen sollten, sind die Panels nicht wirklich transparent, so dass es so aussieht, als würde Ihr Balken nicht gerendert werden. –

+0

Wenn ich versuche, dies auszuführen, bekomme ich 'Gegebene Kombination von Klasse, Teil und Zustand wird nicht durch den aktuellen visuellen Stil definiert 'in der Zeile' renderer.SetParameters ("PROGRESS", 11, 2); '. –