2009-03-11 12 views
10

アクションにかかる時間がわからず、ダイアログボックスに進行状況バーを表示したいと思っています。私はSystem.Windows.Forms.ProgressBarを使ってみましたが、サポートしていないようです。WinFormsで無限のプログレスバーを作成するにはどうすればよいですか?

インターネット上で新しいドライバを探しているときにウィンドウが表示されるプログレスバーです。プログレスバーに3つまたは4つの 'バー'が前後にマーキースタイルで表示されます。

どうすればいいですか?

答えて

24

System.Windows.Forms.ProgressBarはStyleというプロパティがあります。 StyleMarqueeに設定すると、探している効果が得られます。

EDIT:マーキーStyleアウトDivoポイントは

のWindows XP Home Editionを、Windows XPのx64エディションは、Windows Server 2003で

コメントはさらに多くの情報を提供

でのみ使用可能ですこれは、.NET 2.0以上を使用している限り、どこでも動作するように見えることを示しています。

+0

は、Microsoftが完全に「マーキー」を手放すことができないようだ。

私はあなたがそれを使用する方法を知っているように、サンプルプログラムを作成しました。 :-D – Tomalak

+4

"Windows XP以上"にしてください。私はWindows VistaとWindows 7 Beta(どちらも64ビット)でテストしたところ、うまくいきました。 – Joey

+0

注:これは.NET 2.0以上の機能です。 .NET 1.1ではstyleプロパティが公開されていませんでした。 –

6

ちょうどあなたがここにあなた自身を作ることができ、アニメーションGIF :)

を使用します。 http://www.ajaxload.info/

7

System.Windows.Forms.ProgressBarStyleプロパティをMarqueeに設定しようとしましたか?

はしかし、驚くべきことに、このプロパティが(MSDNに応じて)次のプラットフォームでのみ使用可能です:

のWindows XP Home Editionを、Windows XPのx64エディションは、Windows Server 2003

マイトそれはドキュメントがVistaに更新されていないということです。誰でもVistaの制限について知っていますか?

編集:別のコメントに掲載されているように、ドキュメントはサポートされているプラ​​ットフォームに関して間違っているようです。ビスタだけでなく、Windows上で作業をしなければならないこと7.

0

は、より良い方法があるかもしれませんが、一つの方法は、それが最後に到達したときだけ

+5

プログラムを実行するたびに私は物理的な痛みを感じます。ユーザビリティのPOVから、これは怠け者のプログラマができる最悪のものの1つです。これは、「プログレスバー」メタファ全体のユーザーにとっての信頼性を損なうものではありません。プログレスバーが全くない方がいいです。 – Tomalak

+0

合意。たぶん進捗情報が得られない長期的なプロセスのための最良の解決策(おそらく疑問が少しはっきりしていた)は、進歩のバーにはならないだろう...しかし、彼は不確かなものを得る方法を尋ねた: ) – Joey

+0

私は希望の効果を誤解したようです。それが私の頭の上から覚えていた唯一の無限のプログレスバーでした。 – Davy8

1
(あなたのタスクが完了していないと仮定して)戻って値を0に設定することです

私はChris Lawlのソリューションが最高で、きれいで、きれいな解決策を見つけました。ちょうどgif http://www.ajaxload.info/が含まれていました。

+3

プログレスバーを終了しないという混乱はありませんか?終了するとマーキーのアニメーションを0に設定し、プログレスバーのVisibleプロパティをfalseに設定します。その魔法はありません。 – Houman

1

これは私のために働いたものです。私はあなたに不確定なプログレスバーを作成します。あなたは、あなたのソリューションを構築する必要があり、あなたがデザイナーに戻ったときに、新しいコントロールは、ツールボックスにする必要があり

using System; 
using System.Collections.Generic; 
using System.Drawing; 
using System.Windows.Forms; 

namespace AnimatedCustomControls 
{ 
    sealed class IndeterminateProgressbar : Control 
    { 
    private readonly List<int> positions = new List<int>(); 
    private readonly Timer tmrAnimation = new Timer {Interval = 5, Enabled = false}; 
    private readonly Timer tmrAddPosition = new Timer {Interval = 500, Enabled = true}; 


    public Color ProgressColor { get; set; } 
    public Color InactiveColor { get; set; } 

    public IndeterminateProgressbar() 
    { 
     DoubleBuffered = true; 
     SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true); 
     ProgressColor = Color.FromArgb(40, 190, 245); 
     InactiveColor = Color.FromArgb(40, 40, 40); 
     tmrAnimation.Tick += tmrAnimation_Tick; 
     tmrAddPosition.Tick += tmrAddPosition_Tick; 
     if (!DesignMode) tmrAnimation.Start(); 
    } 

    void tmrAddPosition_Tick(object sender, EventArgs e) 
    { 
     positions.Add(1); 
    } 

    void tmrAnimation_Tick(object sender, EventArgs e) 
    { 
     if (DesignMode) tmrAnimation.Stop(); 
     for (int i = 0; i < positions.Count; i++) 
     { 
      positions[i] += 2 + Math.Abs(positions[i])/50; 
      if (positions[i] > Width) positions.RemoveAt(i); 
     } 
     Invalidate(); 
    } 

    protected override void OnEnabledChanged(EventArgs e) 
    { 
     base.OnEnabledChanged(e); 
     if (Enabled) 
     { 
      positions.Clear(); 
      positions.AddRange(new[] { Width/10, Width/3, Width/2, (int)(Width * 0.7) }); 
     } 
    } 

    protected override void OnPaint(PaintEventArgs e) 
    { 
     if (Enabled) 
     { 
      e.Graphics.Clear(BackColor); 
      foreach (int i in positions) 
      { 
       e.Graphics.DrawLine(new Pen(Brushes.Black, 4f), i, 0, i, Height); 
      } 
     } 
     else e.Graphics.Clear(InactiveColor); 

     base.OnPaint(e); 
    } 
} 

}

:プロジェクト/フォームにカスタムコントロールを追加し、このコードを挿入 。フォームにドラッグし、最大値と最小値を設定します。それだけです。

 private void Form1_Load(object sender, EventArgs e) 
    { 
     indeterminateProgressbar1.BackColor = Color.FromArgb(40, 190, 245); //it's an nice color ;) 
     indeterminateProgressbar1.Size = new Size(400, 4); //make it small in the height looks better 
     indeterminateProgressbar1.Visible = true; 
    } 
関連する問題