10

在 Vista/7 中,Windows Explorer shell 窗口使用一种特殊的静态进度条来显示硬盘空间。

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

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

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

此模式不是进度条,而是使用进度条控件实现的。仪表具有独特的外观,可以将它们与真正的进度条区分开来。

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

我已经看到您可以发送设置条形颜色的消息,但文档说启用视觉样式时这些调用将被忽略。原始 ProgressBar 控件的 Windows API 文档中似乎没有任何其他建议可以做到这一点。我只是坚持制作自定义绘制的条吗?我真的很想尽可能地使用操作系统,以便应用程序在不同的操作系统版本中看起来一致。不过,我意识到,Vista 之前的版本可能不支持这一点。

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

4

1 回答 1

11

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

于 2010-04-20T00:50:43.207 回答