2010-04-19 25 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