如何使用仪表式进度条?

时间:2010-04-19 22:29:42

标签: winforms progress-bar explorer

在Vista / 7中,Windows资源管理器外壳窗口使用一种特殊的静态进度条来显示硬盘空间。

使用默认样式时,此栏为蓝色且未设置动画。当它接近满(低磁盘空间)时,它也会变成红色。

使用消息传递,我可以告诉Windows Forms ProgressBar控件将其状态更新为Paused和Error(分别为黄色和红色),这样可以正常工作,但这些仍然是特定于进度。

Windows User Experience Guidelines中,它特别指出了进度条的这个“米”变体:

  

此模式不是进度条,而是   它是使用进度实现的   酒吧控制。米有一个独特的   期待将它们与真实区分开来   进度条。

他们说它“是使用进度条控件实现的”,所以......怎么样?我可以向控件发送什么消息让它以这种方式运行?

我已经看到你可以send messages for setting the bar color,但是文档说在启用视觉样式时会忽略这些调用。原始ProgressBar控件的Windows API文档中没有任何其他内容似乎提示了一种方法。我只是坚持制作一个自定义绘制栏?我真的很想尽可能利用操作系统,以便应用程序在不同的操作系统版本中显得一致。我意识到Vista之前的版本可能不会支持这一点。

我正在寻找一个Windows窗体解决方案,但我想知道它是否甚至通过Win32 API公开

1 个答案:

答案 0 :(得分:10)

这是可能的,但不是通过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头文件中获取了部分和状态编号。