2010-05-14 9 views
10

Est-il possible de désactiver l'animation de la barre de progression?Désactiver l'animation WinForms ProgressBar

J'en ai besoin pour un processus qui est en pause et qui ne fonctionne pas pour le moment. Un utilisateur moyen pense que le processus est en cours d'exécution si la barre de progression clignote.

Le conseil pour créer son propre contrôle de barre de progression n'est pas ce que je cherche.

+1

Parlez-vous de l'effet graphique de Vista? Un bar de marque? – SLaks

+0

Oui. XP, Vista et W7. –

+0

cela peut être pertinent https://social.msdn.microsoft.com/Forums/vstudio/en-US/d223204c-24ab-4ca5-bb45-1400e3af2922/is-there-a-progress-bar-alternative-available-from -nuget-for-windows-7-que-sets-it-value-without? forum = csharpgeneral et http://stackoverflow.com/questions/37625930/cannot-get-progressbar-animation-with-code-progresschanged-not -appelé – barlop

Répondre

18

Vous pouvez utiliser le mode Pause de la barre de progression Vista, like this:

// Assuming a Form1 with 3 ProgressBar controls 
private void Form1_Load(object sender, EventArgs e) 
{ 
    SendMessage(progressBar2.Handle, 
    0x400 + 16, //WM_USER + PBM_SETSTATE 
    0x0003, //PBST_PAUSED 
    0); 

    SendMessage(progressBar3.Handle, 
    0x400 + 16, //WM_USER + PBM_SETSTATE 
    0x0002, //PBST_ERROR 
    0); 
} 

[DllImport("user32.dll", CharSet = CharSet.Unicode)] 
static extern uint SendMessage(IntPtr hWnd, 
    uint Msg, 
    uint wParam, 
    uint lParam); 
+1

C'est ce que je cherchais. Je vous remercie. Ce projet est génial: http://windowsformsaero.codeplex.com/ –

+0

Je suis juste tombé sur ce même problème moi-même. Une question cependant: cette solution fonctionnerait-elle aussi pour un logiciel qui fonctionnera sous XP, ou est-ce exclusivement Vista/Win7? – Nailuj

+0

@Nailuj: Cela ne fonctionnera pas sur XP – SLaks

2

Le moyen standard pour communiquer à un utilisateur qu'une action est en pause ou ne peut pas être mesurée avec précision consiste à utiliser le style d'affichage de sélection.

progressBar1.Style = ProgressBarStyle.Marquee; 

Ce style ne tient pas compte des propriétés et affiche une barre de progression « segment » Maximum et Value qui se déplace sans cesse dans la barre de progression et une boucle autour (il ne remplit pas la barre de progression, il se déplace ce qui ressemble à une section de la barre tout le chemin à travers le contrôle et autour au début à nouveau.)

+0

Merci. Mais j'ai besoin de MAximum et de Value. L'utilisateur doit voir où le processus a été suspendu. –

+0

@Vasily: C'est la seule procédure indépendante du système d'exploitation; Si vous êtes garanti Vista ou 7, alors la réponse de SLak devrait résoudre votre problème. –

0

Ce que vous voulez faire est de définir le style sur ce contrôle spécifiquement pour remplacer les changements de thème. Ce article vous donne un peu d'information.

+0

http://www.codeproject.com/KB/cpp/ExtendedProgressbar.aspx semble bon. Mais je doute que mon patron approuverait des contrôles non standard. –

-1

Vous pouvez remplacer le OnPaint() de la barre de progression. Vous ne vous avez juste besoin pas vraiment de réécrire la chose, d'hériter la barre de progression et passer outre OnPaint comme ceci:

public class my_progress_bar : ProgressBar { 
     public Brush brush; 
     public my_progress_bar() { 
      this.SetStyle(ControlStyles.UserPaint, true); 
      brush = Brushes.ForestGreen; 
     } 
     protected override void OnPaint(PaintEventArgs e) 
     { 
      //base.OnPaint(e); 
      Rectangle rectangle = e.ClipRectangle; 
      rectangle.Width = (int)(rectangle.Width * ((double)Value/Maximum)) - 4; 
      ProgressBarRenderer.DrawHorizontalBar(e.Graphics, e.ClipRectangle); 
      rectangle.Height = Height - 4; 
      e.Graphics.FillRectangle(brush, 2, 2, rectangle.Width, rectangle.Height); 
     } 
    } 
+0

Vous avez mal compris 'e.ClipRectangle'; cela ne sera pas rendu correctement. En outre, vous avez besoin d'une barre de style Vista. L'appel 'ProgressBarRenderer.DrawHorizontalChunks' va le rendre un peu mieux. – SLaks

+0

'e.ClipRectangle' est la zone qui doit être repeinte. Vous devriez utiliser 'this.ClientRectangle'. – SLaks

+0

Comme je l'ai dit dans ma question "Le conseil pour créer son propre contrôle de barre de progression n'est pas ce que je cherche." –

-1

coller ce à code. Cela va réécrire la barre de progression, elle est également personnalisable pour la couleur.

public class CProgressBar : ProgressBar 
{ 

public Color MyColor { 
    get { return _color; } 
    set { 
     _color = value; 
     MyBrush = new SolidBrush(_color); 
     Invalidate(); 
    } 
} 

private Color _color = Color.Green; 

public CProgressBar() 
{ 
    SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw, true); 
} 

public int Value { 
    get { return _value; } 
    set { 
     _value = value; 
     Invalidate(); 
    } 
} 

private int _value; 

private SolidBrush MyBrush = new SolidBrush(_color); 

protected override void OnPaint(PaintEventArgs e) 
{ 
    e.Graphics.FillRectangle(MyBrush, new Rectangle(0, 0, Width * (_value/Maximum), Height)); 
} 
} 
+0

Btw ça marche. Si quelqu'un compte cela, cela signifie qu'il est trop bon marché pour l'essayer lui-même. – ad48

+0

Je vous sens, il est très impoli de juste downvote et même pas dire pourquoi. Bien qu'il existe de nombreux problèmes avec le code lors de l'utilisation de .Net 4.5: la classe doit être partielle, MyBrush ne peut pas être initialisé avec une valeur non statique, et rien n'est peint à la fin. Qu'est-ce que je me trompe? –

+0

Largeur * (_value/Maximum) est toujours nul en raison de la conversion int. –

0

Mon contournement consistait à utiliser un contrôle Panel à la place de ProgressBar. J'ai changé BackColor, BorderStyle (à Fixed3D) et je manipule sa largeur pour afficher le niveau de progression nécessaire. J'ai supposé que 100% de la progression est égale à la largeur du formulaire.

Panel as a ProgressBar