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


142

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

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

어떻게합니까?


이미지 애니메이션을 위해이 컨트롤러를 사용할 수 있습니다. codeproject.com/Tips/1004624/Gif-viewer-Snipper-control
xwpedram 2016 년

답변:


249

너무 어렵지 않습니다.

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

고려해야 할 사항 :

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

애니메이션 GIF :

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

AjaxLoad-Ajax Loading GIF 생성기

그것을하는 또 다른 방법 :

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


5
당연히 쉬운! 나의 초기 "구글링 (Googling)"은 이것을 보여주지 않았다 – 아마도 너무 명백하다. 감사.
Stuart Helwig 5

1
그러나 픽처 박스는 프로세스가 실행될 때 새로 고침 (다시 그리기)하지 않습니다.
LarryBud

Durr, 실수로 배경 이미지로 설정했습니다. 배경 이미지는 합리적으로 애니메이션을 지원하지 않습니다. 전경 이미지는 않습니다.
neminem

@neminem : 여기 동일합니다! 그래서 내가 여기 있습니다. 잠시 동안 pictureBox가 fox gif를 지원하지 않는다고 생각했습니다 (처음으로 사용하고 있음)
Jack

@LarryBud 프로세스가 실행될 때 새로 고침 (다시 그리기)되도록하려면을 호출하면 Application.DoEvents();됩니다. 가능한 방법은 : 비즈니스 로직 뭔가가 부분적으로 다음, 완료를 업데이트 할 수 있습니다 및 애니메이션 Application.DoEvents () 업데이트 할 수 있습니다 어떤 (예를 진행률 표시 줄 또는 백분율) 속성 이벤트를 발생
마 - 할 새로운

12

나는 같은 문제가 있었다. 백그라운드에서 작동하는 긴 작업으로 인해 전체 양식 (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로 설정하는 형식의 대리자입니다.


6

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


예-아마도 내가 물어 봤어야 할 것입니다. 감사.
Stuart Helwig 5

6
도구에 연결, pla 찮아? 또는 문서에 대한 다른 참조, 이유 등이 좋을 것입니다. 감사!
Jeff B

1
기존 Windows 소프트웨어 작성에 신경 쓰지 않습니다. System.Windows.Forms.PictureBox컨트롤에서 지원하는 경우 애니메이션 GIF 만 사용합니다.
Mike de Klerk

3

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


2
;) 양식을 비활성화하지 않으면
Jeff B

1

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


그리고 MTA 스레드 모드는 StackOverflow에서 읽는 한 최악의 솔루션 인 것 같습니다.
Yogurtu

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

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;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.