2008-10-03 19 views
118

J'ai un formulaire montrant les messages de progression pendant un assez long processus. C'est un appel à un service web, donc je ne peux pas vraiment montrer un pourcentage complet sur une barre de progression. (Je n'aime pas particulièrement la propriété Marquee de la barre de progression)Comment afficher les GIF animés sur un Windows Form (C#)

Je voudrais montrer un GIF animé pour donner au processus la sensation d'une certaine activité (par exemple, des fichiers volant d'un ordinateur à un autre comme le processus de copie de Windows) .

Comment faites-vous ça?

+0

pour Animated une image que vous pouvez utiliser ce contrôleur. http://www.codeproject.com/Tips/1004624/Gif-viewer-Snipper-control – xwpedram

Répondre

214

Il est pas trop difficile.

  1. Déposez une image sur votre formulaire.
  2. Ajouter le fichier .gif en tant qu'image dans la zone d'image
  3. Afficher la zone d'image au chargement.

choses à prendre en considération:

  • La désactivation du picturebox empêchera le gif d'être animé.

Gifs animés:

Si vous cherchez gifs animés vous pouvez les générer here

Une autre façon de le faire:

Une autre façon que j'ai trouvé que fonctionne très bien est le contrôle de dialogue asynchrone que j'ai trouvé sur le code project

+5

Embarrassingly facile! Mon "googling" initial ne l'a pas montré - peut-être est-ce trop évident. Merci. –

+14

+1 ajaxload.info est excellent –

+4

Ce site Web est également cool: http://preloaders.net/ –

3

Si vous le mettez dans un contrôle PictureBox, il devrait fonctionner

+2

Sauf si vous désactivez le formulaire;) –

7

Notez que dans Windows, vous n'utilisez généralement pas de Gifs animés, mais de petites animations AVI: il y a un contrôle natif Windows juste pour les afficher. Il existe même des outils pour convertir les GIF animés en AVI (et vice-versa).

+0

Oui - c'est peut-être ce que je devrais a demandé. Merci. –

+4

Lien vers l'outil, s'il vous plaît? Ou toute autre référence à la documentation, les raisons, etc., seraient géniales. Merci! –

+0

Il existe un outil appelé Google (ou Bing, Yahoo ou similaire si vous préférez) qui peut donner de meilleures réponses que moi, et à jour (un lien que je donnerais il y a 5 ans peut être rompu aujourd'hui ...) . – PhiLho

1

Ce n'est pas le cas lorsque vous démarrez une opération longue, car tout se STOPS car vous êtes dans le même thread.

+0

Et le mode thread MTA semble être la pire des solutions pour autant que je lis sur StackOverflow. – Yogurtu

11

J'ai eu le même problème. Une forme entière (y compris gif) s'arrêtant pour se redessiner à cause d'une longue opération en arrière-plan. Voici comment j'ai résolu cela.

private void MyThreadRoutine() 
    { 
    this.Invoke(this.ShowProgressGifDelegate); 
    //your long running process 
    System.Threading.Thread.Sleep(5000); 
    this.Invoke(this.HideProgressGifDelegate); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
    ThreadStart myThreadStart = new ThreadStart(MyThreadRoutine); 
    Thread myThread = new Thread(myThreadStart); 
    myThread.Start(); 
    } 

J'ai simplement créé un autre thread pour être responsable de cette opération. Merci à cette forme initiale continue de redessiner sans problèmes (y compris mon gif de travail). ShowProgressGifDelegate et HideProgressGifDelegate sont des délégués dans le formulaire qui définissent la propriété visible de pictureBox avec gif à true/false.

0

J'ai eu le même problème et j'ai rencontré différentes solutions en mettant en œuvre ce que j'avais l'habitude de faire face à plusieurs problèmes différents. Enfin, voici ce que j'ai mis ensemble des morceaux de différents messages qui ont fonctionné pour moi comme prévu.

private void btnCompare_Click(object sender, EventArgs e) 
{ 
    ThreadStart threadStart = new ThreadStart(Execution); 
    Thread thread = new Thread(threadStart); 
    thread.SetApartmentState(ApartmentState.STA); 
    thread.Start(); 
} 

Voici la méthode d'exécution qui porte également invoquer le contrôle PictureBox:

private void Execution() 
{ 
    btnCompare.Invoke((MethodInvoker)delegate { pictureBox1.Visible = true; }); 
    Application.DoEvents(); 

    // Your main code comes here . . . 

    btnCompare.Invoke((MethodInvoker)delegate { pictureBox1.Visible = false; }); 
} 

Gardez à l'esprit, le PictureBox est invisible de la fenêtre Propriétés ou faire ci-dessous:

private void ComparerForm_Load(object sender, EventArgs e) 
{ 
    pictureBox1.Visible = false; 
}