উইন্ডোজ ফর্মটিতে আপনি কীভাবে অ্যানিমেটেড জিআইএফ দেখায় (সি #)


142

মোটামুটি দীর্ঘ প্রক্রিয়া চলার সাথে সাথে আমার কাছে একটি ফর্ম রয়েছে যা প্রগতি বার্তাগুলি দেখাচ্ছে। এটি একটি ওয়েব পরিষেবাতে একটি কল যাতে আমি সত্যিকার অর্থে কোনও অগ্রগতি বারে শতাংশের সম্পূর্ণ চিত্র প্রদর্শন করতে পারি না। (আমি বিশেষত অগ্রগতি বারের মার্কি সম্পত্তি পছন্দ করি না)

প্রক্রিয়াটিকে কিছু ক্রিয়াকলাপের অনুভূতি দেওয়ার জন্য আমি একটি অ্যানিমেটেড জিআইএফ প্রদর্শন করতে চাই (উদাহরণস্বরূপ উইন্ডোজ অনুলিপি প্রক্রিয়াটির মতো ফাইলগুলি একটি কম্পিউটার থেকে অন্য কম্পিউটারে উড়ছে)।

তুমি এটা কিভাবে করো?


অ্যানিমেটেড কোনও চিত্রের জন্য আপনি এই নিয়ামকটি ব্যবহার করতে পারেন। কোডেপ্রজেক্ট
টিপস /

উত্তর:


249

এটা খুব কঠিন না।

  1. আপনার ফর্মের উপর একটি চিত্রবাক্স ফেলে দিন।
  2. চিত্রবক্সে চিত্র হিসাবে .gif ফাইল যুক্ত করুন
  3. আপনি লোড করার সময় চিত্রবাক্সটি দেখান।

বিবেচনার জন্য বিষয়গুলি:

  • চিত্রবাক্সটি অক্ষম করা জিআইএফকে অ্যানিমেটেড হতে বাধা দেবে।

অ্যানিমেটেড gifs:

আপনি যদি অ্যানিমেটেড জিআইএফগুলির সন্ধান করছেন তবে আপনি সেগুলি তৈরি করতে পারেন:

AjaxLoad - Ajax লোডিং জিএফ জেনারেটর

এটি করার আরেকটি উপায়:

আরেকটি উপায় যা আমি খুঁজে পেয়েছি যে বেশ কার্যকরভাবে কাজ করে তা হ'ল কোড প্রকল্পে আমি পাওয়া async ডায়ালগ নিয়ন্ত্রণ


5
বিব্রতকরভাবে সহজ! আমার প্রাথমিক "গুগলিং" এটি দেখায় নি - সম্ভবত এটি খুব স্পষ্ট। ধন্যবাদ।
স্টুয়ার্ট হেলভিগ

1
তবে প্রক্রিয়াটি কার্যকর হওয়ার হিসাবে চিত্রবাক্স রিফ্রেশ হবে না (পুনরায় আঁকা)।
ল্যারিবাড

দুর, আমি এটিকে ভুল করে পটভূমি চিত্র হিসাবে সেট করেছিলাম। পটভূমি চিত্র, যুক্তিসঙ্গতভাবে, অ্যানিমেশন সমর্থন করে না; অগ্রভাগের চিত্রটি করে।
নিমিনেম

@ নিমিনম: এখানেও! সে কারণেই আমি এখানে আছি। কিছুক্ষণের জন্য আমি ভেবেছিলাম ছবিবক্স শিয়াল জিফগুলি সমর্থন করে না (প্রথমবারের মতো আমি এটি ব্যবহার করছি)
জ্যাক

@ ল্যারিবুড প্রক্রিয়াটি কার্যকর হওয়ার সাথে সাথে এটি পুনরায় রিফ্রেশ করার জন্য (পুনরায় চিত্রিত) হওয়ার জন্য, আপনি কল করতে পারেন Application.DoEvents();। সম্ভাব্য পদ্ধতির: আপনার ব্যবসা লজিক কিছু আংশিকভাবে সম্পন্ন হলে, তারপর যাই হোক না কেন বৈশিষ্ট্যাবলী (উদাহরণস্বরূপ প্রগতি দণ্ড বা শতাংশ জন্য) আপডেট করা যায় এবং অ্যানিমেশন Application.DoEvents () সঙ্গে আপডেট করা যাবে এমন একটি ইভেন্টের আগুন
দো-do-নতুন

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

এই অপারেশনের জন্য দায়বদ্ধ হওয়ার জন্য আমি কেবল অন্য থ্রেড তৈরি করেছি। এই প্রাথমিক ফর্মটির জন্য ধন্যবাদ সমস্যা ছাড়াই পুনরায় অঙ্কন অব্যাহত রয়েছে (আমার জিআইএফ কাজ সহ)। শোপ্রোগ্রেসগিফডেলিগেট এবং হিডপোগ্রেসিজিফডিলেগেট এমন ফর্মের প্রতিনিধি যা জিফের সাথে সত্য / মিথ্যাতে চিত্রবক্সের দৃশ্যমান সম্পত্তি সেট করে।


6

নোট করুন যে উইন্ডোজগুলিতে আপনি traditionতিহ্যগতভাবে অ্যানিমেটেড জিএফ ব্যবহার করেন না, তবে সামান্য এভিআই অ্যানিমেশন ব্যবহার করেন: এগুলি প্রদর্শনের জন্য একটি উইন্ডোজ নেটিভ নিয়ন্ত্রণ রয়েছে। অ্যানিমেটেড জিফগুলি এভিআইতে রূপান্তর করার জন্য এমনকি সরঞ্জাম রয়েছে (এবং তদ্বিপরীত)।


হ্যাঁ - সম্ভবত এটিই আমার জিজ্ঞাসা করা উচিত ছিল। ধন্যবাদ।
স্টুয়ার্ট হেলভিগ

6
সরঞ্জামের সাথে লিঙ্ক, আপনি কি? বা ডকুমেন্টেশনের অন্যান্য কোনও রেফারেন্স, এর কারণগুলি, ইত্যাদি দুর্দান্ত। ধন্যবাদ!
জেফ বি

1
আমি traditionalতিহ্যবাহী উইন্ডোজ সফ্টওয়্যার লেখার বিষয়ে চিন্তা করি না। যদি এটি System.Windows.Forms.PictureBoxনিয়ন্ত্রণ দ্বারা সমর্থিত হয় তবে আমি কেবল অ্যানিমেটেড জিআইএফ ব্যবহার করব।
মাইক ডি ক্লার্ক

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;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.