10

Vista / 7では、Windowsエクスプローラーのシェルウィンドウは、特別な種類の静的プログレスバーを使用してハードドライブのスペースを表示します。

デフォルトのスタイルでは、このバーは青色でアニメーション化されていません。また、いっぱいに近づくと(ディスク容量が少なくなると)赤色に変わります。

メッセージングを使用して、WindowsフォームのProgressBarコントロールに、状態を一時停止とエラー(それぞれ黄色と赤色)に更新するように指示できます。これは正常に機能しますが、これらは進行状況に固有です。

Windowsユーザーエクスペリエンスガイドラインでは、プログレスバーのこの「メーター」バリアントを具体的に指摘しています。

このパターンはプログレスバーではありませんが、プログレスバーコントロールを使用して実装されます。メーターは、真のプログレスバーと区別するために明確な外観を持っています。

彼らはそれが「プログレスバーコントロールを使用して実装されている」と言っているので...どうやって?このように動作させるために、コントロールにどのようなメッセージを送信できますか?

バーの色を設定するためのメッセージを送信できることを確認しましたが、ドキュメントには、視覚的なスタイルが有効になっている場合、これらの呼び出しは無視されると記載されています。生のProgressBarコントロールに関するWindowsAPIドキュメントには、これを行う方法を示唆しているものは他にありません。カスタムドローバーを作成するのに行き詰まっていますか?アプリケーションがさまざまなOSバージョンで一貫して表示されるように、可能な限りOSを利用したいと思います。ただし、Vistaより前のバージョンではおそらくこれがサポートされないことを理解しています。

Windowsフォームソリューションを探していますが、Win32APIを介して公開されているのではないかと思います。

4

1 に答える 1

11

可能ですが、ProgressBar ではできません。また、Win7 はこれらのメーターを描画するために PB を使用しません。バーに関連付けられたウィンドウ ハンドルはありません。カスタム描画を使用している必要があります。これは、WinForms でも VisualStyleRenderer クラスでも可能です。ただし、役に立たないことの 1 つは、必要なビジュアル スタイルのパーツと状態が宣言されていないことです。.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 に答える