代码之家  ›  专栏  ›  技术社区  ›  Sean Hanley

如何使用米式进度条?

  •  9
  • Sean Hanley  · 技术社区  · 15 年前

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

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

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

    Windows User Experience Guidelines 特别指出了进度条的“米”变量:

    这个模式不是进度条,但是 它是使用进度来实现的 酒吧控制。米有独特的 把它们和真的区分开来 进度条。

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

    我知道你可以 send messages for setting the bar color 但是文档中说,当启用视觉样式时,这些调用将被忽略。WindowsAPI文档中关于原始进度条控件的其他内容似乎都没有建议这样做的方法。我是不是一直在做一个定制的酒吧?我真的很想尽可能地使用操作系统,这样应用程序在不同的操作系统版本中都会保持一致。不过,我意识到Vista之前的版本可能不支持这一点。

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

    1 回复  |  直到 8 年前
        1
  •  10
  •   Hans Passant    15 年前

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