Winforms 如何使用仪表式进度条?

Winforms 如何使用仪表式进度条?,winforms,progress-bar,explorer,Winforms,Progress Bar,Explorer,在Vista/7中,Windows资源管理器外壳窗口使用一种特殊的静态进度条来显示硬盘空间 对于默认样式,此栏为蓝色且未设置动画。当接近满(磁盘空间不足)时,它也会变成红色 通过使用消息传递,我可以告诉Windows窗体ProgressBar控件将其状态更新为暂停和错误(分别为黄色和红色),这两种状态可以正常工作,但它们仍然是特定于进度的 在中,它特别指出了进度条的“米”变体: 此模式不是进度条,而是 它是使用progress实现的 酒吧控制。米有一个明显的区别 注意把它们与真实的区别开来 进度

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

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

通过使用消息传递,我可以告诉Windows窗体ProgressBar控件将其状态更新为暂停和错误(分别为黄色和红色),这两种状态可以正常工作,但它们仍然是特定于进度的

在中,它特别指出了进度条的“米”变体:

此模式不是进度条,而是 它是使用progress实现的 酒吧控制。米有一个明显的区别 注意把它们与真实的区别开来 进度条

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

我知道您可以,但是文档中说,当启用视觉样式时,这些调用将被忽略。关于原始ProgressBar控件的Windows API文档中似乎没有任何其他内容建议这样做。我只是在做一个定制的酒吧?我真的很想尽可能地利用操作系统,以便应用程序在不同的操作系统版本中保持一致。不过,我意识到Vista之前的版本可能不支持这一点


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

这是可能的,但不是通过ProgressBar。Win7也不使用PB来绘制这些米,因为没有与该条关联的窗口句柄。它必须使用自定义图形。这在WinForms中以及VisualStyleRenderer类中都是可能的。但是,有一点没有帮助,那就是没有声明所需的视觉样式部分和状态,即使在.NET4.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头文件中获得了部件号和状态号。

任何感兴趣的人都可以在%ProgramFiles%\Microsoft SDK\Windows\vx.xx\Include中找到vsstyle.h,其中vx.xx是安装的SDK的任何版本(您可能有多个版本)。还应该指出,任何人有困难复制:注意,这提请一个背景。如果有面板或任何其他容器,则希望渲染器在其绘制事件上绘制,而不是在窗体的绘制事件上绘制。否则,面板会重叠,正如您现在应该知道的那样,面板实际上不是透明的,因此看起来您的工具栏没有渲染。当我尝试运行此操作时,我得到的
给定的类、部分和状态的组合不是由当前视觉样式定义的。
renderer.SetParameters(“PROGRESS”,11,2)行中。我将此标记为答案,尽管第二次调用SetParameters和DrabackGround只在Windows 8上绘制了一个蓝色矩形。回首几年后,FWIW,我认为微软在该页面上的指导原则还没有很好地过时,即使在发布时,它们也被广泛忽略;他们的许多建议都是针对应用程序和行业的,其中一些建议现在似乎更多地是为了宣传新的闪亮的WindowsVista用户体验功能(Windows8面世后,微软谴责这些功能过于俗气和过时)。如果你决定忽略这些准则,不要担心用户体验警察给你开罚单。我仍然可以看到成吨的进度条。