[C#] Windows Form (C #)에서 애니메이션 GIF를 표시하는 방법

상당히 긴 프로세스 실행으로 진행 메시지를 보여주는 양식이 있습니다. 웹 서비스에 대한 호출이므로 진행률 표시 줄에 전체 백분율을 의미있게 표시 할 수는 없습니다. (진행률 막대의 선택 윤곽 속성이 특히 마음에 들지 않습니다)

프로세스에 일부 활동의 느낌을주기 위해 애니메이션 GIF를 표시하고 싶습니다 (예 : Windows 복사 프로세스와 같이 한 컴퓨터에서 다른 컴퓨터로 파일이 이동하는 파일).

어떻게합니까?



답변

너무 어렵지 않습니다.

  1. 양식에 그림 상자를 놓습니다.
  2. 그림 상자에 .gif 파일을 이미지로 추가
  3. 로드 할 때 그림 상자를 표시하십시오.

고려해야 할 사항 :

  • 그림 상자를 비활성화하면 GIF 애니메이션이 표시되지 않습니다.

애니메이션 GIF :

애니메이션 GIF를 찾는 경우 다음을 생성 할 수 있습니다.

AjaxLoad-Ajax Loading GIF 생성기

그것을하는 또 다른 방법 :

내가 잘 작동하는 또 다른 방법은 코드 프로젝트 에서 찾은 비동기 대화 상자 컨트롤입니다.


답변

나는 같은 문제가 있었다. 백그라운드에서 작동하는 긴 작업으로 인해 전체 양식 (gif 포함)이 다시 그려지지 않습니다. 여기에 내가 이것을 해결 한 방법이 있습니다.

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

이 작업을 담당 할 다른 스레드를 만들었습니다. 이 초기 형식 덕분에 문제없이 계속 다시 그릴 수 있습니다 (gif 작업 포함). ShowProgressGifDelegate 및 HideProgressGifDelegate는 gif가있는 pictureBox의 visible 속성을 true / false로 설정하는 형식의 대리자입니다.


답변

Windows에서는 전통적으로 애니메이션 GIF를 사용하지 않지만 AVI 애니메이션은 거의 사용하지 않습니다. Windows 기본 컨트롤은 표시하기 만합니다. 애니메이션 GIF를 AVI로 (또는 그 반대로) 변환하는 도구도 있습니다.


답변

PictureBox 컨트롤에 넣으면 작동합니다.


답변

동일한 스레드에 있기 때문에 모든 것이 중지되기 때문에 긴 작업을 시작하지 않아도됩니다.


답변

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


답변

나는 같은 문제가 있었고 여러 가지 다른 문제에 직면했던 것을 구현함으로써 다른 솔루션을 발견했습니다. 마지막으로, 아래는 다른 게시물의 일부 조각을 모아서 예상대로 작동했습니다.

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

PictureBox 컨트롤을 호출하는 Execution 메서드는 다음과 같습니다.

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

    // Your main code comes here . . .

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

PictureBox는 속성 창에서 보이지 않거나 아래에서 수행하십시오.

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