如何使用仪表式进度条?

Posted

技术标签:

【中文标题】如何使用仪表式进度条?【英文标题】:How can I use a meter-style progress bar? 【发布时间】:2011-02-09 21:52:54 【问题描述】:

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

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

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

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

此模式不是进度条,而是 它是使用进度实现的 酒吧控制。米有明显的 寻找将它们与真实区分开来 进度条。

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

我看到你可以send messages for setting the bar color,但文档说启用视觉样式时这些调用会被忽略。原始 ProgressBar 控件的 Windows API 文档中似乎没有任何其他建议可以做到这一点。我只是坚持制作自定义绘制的条吗?我真的很想尽可能地使用操作系统,以便应用程序在不同的操作系统版本中看起来一致。不过我知道,Vista 之前的版本可能不支持这个。

我正在寻找 Windows 窗体解决方案,但我想知道它是否通过 Win32 API完全暴露

【问题讨论】:

FWIW 几年后回想起来,我认为微软那个页面上的指南并没有很好地老化,即使在它们出来的时候也被广泛忽视;他们的许多建议都非常针对应用程序和行业,其中一些现在看起来更像是为了宣传新的和闪亮的 Windows Vista UX 功能(微软后来在 Windows 8 推出时谴责这些功能低俗和过时)。如果您决定忽略其中一些准则,请不要担心 UX 警察会给您开罚单。我仍然将大量进度条视为米。 【参考方案1】:

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

【讨论】:

对于任何感兴趣的人,您可以在 %ProgramFiles%\Microsoft SDKs\Windows\vx.xx\Include 中找到 vsstyle.h,其中 vx.xx 是安装的任何版本的 SDK(您可能有多个)。 en.wikipedia.org/wiki/Microsoft_Windows_SDK 还应该向在复制此内容时遇到困难的任何人指出:请注意,这会吸引背景。如果您有面板或任何其他容器,您将希望渲染器在他们的绘制事件上绘制,而不是在表单上绘制。否则,面板会重叠,并且您现在应该知道,面板实际上并不是透明的,因此看起来您的栏没有渲染。 当我尝试运行它时,我在renderer.SetParameters("PROGRESS", 11, 2); 线上得到Given combination of Class, Part, and State is not defined by the current visual style. 我将此标记为答案,尽管第二次调用 SetParameters 和 DrawBackground 只是在 Windows 8 上绘制了一个蓝色矩形。

以上是关于如何使用仪表式进度条?的主要内容,如果未能解决你的问题,请参考以下文章

半圆形仪表盘进度条

如何在这些进度条标题之间添加间距?

简单介绍Vue中使用js制作进度条式数据对比动画

vc6.0里MFC进度条如何使用

Delphi:如何使用进度条显示 CreateProcess 的进度?

长按如何使进度条变化Android