2010-04-19 10 views
8

En Vista/7, la ventana del shell del Explorador de Windows hace uso de un tipo especial de barra de progreso estática para mostrar el espacio del disco duro.¿Cómo puedo usar una barra de progreso del estilo de un medidor?

Con estilos predeterminados, esta barra es de color azul y no animada. También se vuelve de color rojo cuando está cerca de estar lleno (poco espacio en el disco).

Utilizando la mensajería, puedo decirle al control ProgressBar de Windows Forms que actualice su estado a En pausa y Error (amarillo y rojo, respectivamente), que funciona bien, pero estos siguen siendo específicos para el progreso.

En el Windows User Experience Guidelines, se señala específicamente esta variante "metro" de la barra de progreso:

Este patrón no es una barra de progreso, pero se implementa mediante el control de barra de progreso . Los medidores tienen un aspecto distinto de para diferenciarlos de las verdaderas barras de progreso .

Dicen que "se implementa utilizando el control de barra de progreso", entonces ... ¿cómo? ¿Qué mensaje podría enviar al control para que se comporte de esta manera?

He visto que puede send messages for setting the bar color, pero la documentación dice que estas llamadas se ignoran cuando se habilitan los estilos visuales. Nada más en la documentación de la API de Windows para los controles de ProgressBar en bruto parecía sugerir una manera de hacerlo. ¿Estoy atascado haciendo una barra dibujada personalizada? Realmente me gustaría utilizar el sistema operativo siempre que sea posible para que la aplicación aparezca coherente a lo largo de diferentes versiones del sistema operativo. Sin embargo, me doy cuenta de que las versiones anteriores a Vista no lo soportarán.

Estoy buscando una solución de Windows Forms, pero me pregunto si está incluso expuesta en total a través de Win32 API.

Respuesta

9

Es posible, pero no a través de ProgressBar. Tampoco usa Win7 un PB para dibujar esos metros, no hay un identificador de ventana asociado con la barra. Debe estar usando dibujo personalizado. Eso también es posible en WinForms con la clase VisualStyleRenderer. Sin embargo, una cosa que no ayuda es que las partes y estados de estilo visual requeridos no se declaran, ni siquiera en .NET 4.0.

Este formulario de ejemplo reproduce la barra de metro:

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

Tengo los números de pieza y estatales desde el archivo de cabecera vsstyle.h SDK.

+0

Para cualquier persona interesada, puede encontrar vsstyle.h en% ProgramFiles% \ Microsoft SDKs \ Windows \ vx.xx \ Include donde vx.xx es cualquier versión de SDK instalada (puede tener varias). http://en.wikipedia.org/wiki/Microsoft_Windows_SDK –

+1

También debe señalar a cualquiera que tenga problemas para reproducir esto: observe que esto se basa en un fondo. Si tiene paneles o cualquier otro contenedor, querrá que el procesador dibuje sus eventos de pintura, no los del formulario. De lo contrario, el panel se superpone y, como ya sabrá, los paneles no son realmente transparentes, por lo que parecerá que su barra no se procesó. –

+0

Cuando intento ejecutar esto, obtengo 'Dado combinación de Clase, Parte y Estado no definido por el estilo visual actual. En la línea' renderer.SetParameters ("PROGRESS", 11, 2); '. –

Cuestiones relacionadas