आप विंडोज फॉर्म पर एनिमेटेड GIF कैसे दिखाते हैं (c #)


142

मेरे पास एक प्रपत्र है जो प्रगति संदेश दिखा रहा है क्योंकि यह काफी लंबी प्रक्रिया है। यह एक वेब सेवा के लिए एक कॉल है, इसलिए मैं वास्तव में एक प्रगति बार पर प्रतिशत पूर्ण आंकड़ा सार्थक रूप से नहीं दिखा सकता हूं। (मैं विशेष रूप से प्रगति बार के मार्की संपत्ति को पसंद नहीं करता हूं)

मैं इस प्रक्रिया को कुछ गतिविधि का अहसास देने के लिए एक एनिमेटेड GIF दिखाना चाहूंगा (जैसे एक कंप्यूटर से दूसरे कंप्यूटर पर उड़ने वाली फाइलें जैसे विंडोज कॉपी प्रोसेस)।

आप यह कैसे करते हैं?


एक छवि को एनिमेटेड करने के लिए आप इस नियंत्रक का उपयोग कर सकते हैं। codeproject.com/Tips/1004624/Gif-viewer-Sipper-control
xwpedram

जवाबों:


249

यह बहुत कठिन नहीं है।

  1. अपने फॉर्म पर एक पिक्चरबॉक्स छोड़ें।
  2. चित्र बॉक्स में छवि के रूप में .gif फ़ाइल जोड़ें
  3. जब आप लोड कर रहे हों तो पिक्चरबॉक्स दिखाएं।

ध्यान रखने योग्य बातें:

  • पिक्चरबॉक्स को अक्षम करने से जिफ़ को एनिमेटेड होने से रोका जा सकेगा।

एनिमेटेड जिफ़:

यदि आप एनिमेटेड जिफ़ की तलाश कर रहे हैं तो आप उन्हें उत्पन्न कर सकते हैं:

AjaxLoad - Ajax gif जनरेटर लोड हो रहा है

इसे करने का दूसरा तरीका:

एक और तरीका है कि मैंने पाया है कि काफी अच्छी तरह से काम करता है async संवाद नियंत्रण है कि मैं कोड परियोजना पर पाया है


5
शर्मनाक तरीके से आसान! मेरी प्रारंभिक "Googling" ने यह नहीं दिखाया - शायद यह बहुत स्पष्ट है। धन्यवाद।
स्टुअर्ट हेलविग

1
हालांकि, क्रियान्वयन की प्रक्रिया के रूप में पिक्चरबॉक्स रिफ्रेश (रीड्रा) नहीं होगा।
लैरीबड

दुर, मैंने इसे गलती से बैकग्राउंड इमेज के रूप में सेट कर दिया था। पृष्ठभूमि छवि, यथोचित, एनीमेशन का समर्थन नहीं करती है; अग्रभूमि छवि करता है।
नीमनीम

@neminem: यहाँ भी! इसलिए मैं यहां हूँ। थोड़ी देर के लिए मुझे लगा कि पिक्चरबॉक्स लोमड़ी की जिफ़ का समर्थन नहीं करता (पहली बार जब भी मैं इसका इस्तेमाल कर रहा हूँ)
जैक

@LarryBud प्रक्रिया को निष्पादित करने के लिए इसे रिफ्रेश (redraw) करने के लिए, आप कॉल कर सकते हैं Application.DoEvents();। संभव दृष्टिकोण: आपका व्यावसायिक तर्क एक घटना को आग लगाता है जब कुछ आंशिक रूप से किया जाता है, तो जो भी गुण (उदाहरण के लिए प्रगति बार या प्रतिशत) अपडेट किए जा सकते हैं और एनीमेशन को Application.DoEvents () के साथ अपडेट किया जा सकता है
Do-do-new-

12

मुझे भी यही समस्या थी। पृष्ठभूमि में लंबे समय तक काम करने के कारण संपूर्ण रूप (जिफ़ सहित) स्वयं को फिर से खोलना बंद कर देता है। यहाँ है कि मैं यह कैसे हल किया।

  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(); 
  }

मैंने बस इस ऑपरेशन के लिए जिम्मेदार होने के लिए एक और धागा बनाया। इस प्रारंभिक रूप के लिए धन्यवाद समस्याओं के बिना (मेरे जीआईएफ काम सहित) फिर से जारी है। ShowProgressGifDelegate और HideProgressGifDelegate प्रतिनिधि हैं जो चित्र के दृश्यमान गुण को gif के साथ सही / गलत पर सेट करते हैं।


6

ध्यान दें कि Windows में, आप पारंपरिक रूप से एनिमेटेड Gifs का उपयोग नहीं करते हैं, लेकिन थोड़ा AVI एनिमेशन: बस उन्हें प्रदर्शित करने के लिए एक विंडोज़ देशी नियंत्रण है। यहां तक ​​कि एनिमेटेड जिफ़ों को AVI (और इसके विपरीत) में बदलने के लिए उपकरण भी हैं।


हाँ - शायद यही मैंने पूछा है। धन्यवाद।
स्टुअर्ट हेलविग

6
टूल से लिंक करें, s'il vous pla toolt? या प्रलेखन के अन्य संदर्भ, कारण, आदि, बहुत अच्छा होगा। धन्यवाद!
जेफ बी

1
मुझे पारंपरिक विंडोज सॉफ्टवेयर लिखने की परवाह नहीं है। यदि यह System.Windows.Forms.PictureBoxनियंत्रण द्वारा समर्थित है , तो मैं बस एनिमेटेड GIF का उपयोग करूँगा।
माइक डी किलक

3

यदि आप इसे पिक्चरबॉक्स कंट्रोल में रखते हैं, तो यह काम करना चाहिए


2
जब तक आप फ़ॉर्म को अक्षम नहीं करते हैं;)
जेफ बी

1

यह तब नहीं होता जब आप एक लंबा ऑपरेशन शुरू करते हैं, क्योंकि सब कुछ उसी धागे में स्थित है।


और एमटीए थ्रेड मोड सबसे खराब समाधान लगता है जहां तक ​​मैं स्टैकऑवरफ्लो पर पढ़ रहा हूं।
योगर्टुरु

1
Public Class Form1

    Private animatedimage As New Bitmap("C:\MyData\Search.gif")
    Private currentlyanimating As Boolean = False

    Private Sub OnFrameChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)

        Me.Invalidate()

    End Sub

    Private Sub AnimateImage()

        If currentlyanimating = True Then
            ImageAnimator.Animate(animatedimage, AddressOf Me.OnFrameChanged)
            currentlyanimating = False
        End If

    End Sub

    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)

        AnimateImage()
        ImageAnimator.UpdateFrames(animatedimage)
        e.Graphics.DrawImage(animatedimage, New Point((Me.Width / 4) + 40, (Me.Height / 4) + 40))

    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        BtnStop.Enabled = False

    End Sub

    Private Sub BtnStop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnStop.Click

        currentlyanimating = False
        ImageAnimator.StopAnimate(animatedimage, AddressOf Me.OnFrameChanged)
        BtnStart.Enabled = True
        BtnStop.Enabled = False

    End Sub

    Private Sub BtnStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnStart.Click

        currentlyanimating = True
        AnimateImage()
        BtnStart.Enabled = False
        BtnStop.Enabled = True

    End Sub

End Class

0

मेरे पास एक ही मुद्दा था और विभिन्न समाधानों को लागू करने से आया था, जिनका मैं कई अलग-अलग मुद्दों का सामना करता था। अंत में, नीचे मैंने विभिन्न पदों से कुछ टुकड़े एक साथ रखे हैं जो मेरे लिए उम्मीद के मुताबिक काम करते हैं।

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

यहाँ निष्पादन विधि है जो पिक्चरबॉक्स नियंत्रण को लागू करती है:

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

    // Your main code comes here . . .

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

ध्यान रखें, गुण विंडो से पिक्चरबॉक्स अदृश्य है या नीचे करें:

private void ComparerForm_Load(object sender, EventArgs e)
{
    pictureBox1.Visible = false;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.