2008-10-03 4 views
118

상당히 긴 프로세스가 진행되면서 진행 메시지가 나타나는 양식이 있습니다. 웹 서비스에 대한 호출이므로 진행률 표시 줄에 의미있는 비율로 전체 그림을 표시 할 수 없습니다. (특히 진행률 표시 줄의 움직이는 속성이 마음에 들지 않습니다.)Windows Form (C#)에 애니메이션 GIF를 표시하는 방법

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

어떻게하면 되나요?

+0

을 이 컨트롤러를 사용할 수있는 이미지. http://www.codeproject.com/Tips/1004624/Gif-viewer-Snipper-control – xwpedram

답변

214

너무 어렵지 않습니다.

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

상황이 고려합니다 :

  • 애니메이션되는 GIF를 방지 할 수있는 PictureBox를 비활성화.

애니메이션 GIF :

또 다른 방법 나는 것으로 나타났습니다 : 당신이 애니메이션 GIF를 찾고 있다면

당신이 그 일의 here

또 다른 방법은 그들에게 생성 할 수 있습니다 잘 작동하는 것은 비동기 대화 상자 컨트롤입니다. code project

+5

당황스럽게 쉽게! 나의 처음 "인터넷 검색"은 이것을 보여주지 못했습니다. 아마도 너무 명백 할 수 있습니다. 감사. –

+14

+1 ajaxload.info is excellent –

+4

이 웹 사이트도 멋지다 : http://preloaders.net/ –

3

PictureBox 컨트롤에 넣으면 그냥 작동해야합니다.

+2

양식을 비활성화하지 않는 한) –

7

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

+0

예 - 물었다. 감사. –

+4

공구에 링크 하시겠습니까? 또는 문서에 대한 다른 언급, 이유 등은 훌륭합니다. 감사! –

+0

나보다 나은 답변을 줄 수있는 Google (또는 Bing, Yahoo! 또는 이와 유사한 도구)이라는 도구가 있으며 최신 버전입니다 (5 년 전의 링크를 오늘 깨뜨릴 수 있습니다 ...) . – PhiLho

1

같은 작업을 수행 한 후에 모든 작업이 중지되므로 시간이 오래 걸리는 작업을 시작할 때는 그렇지 않습니다.

+0

그리고 MTA 스레드 모드는 StackOverflow에서 읽는 한 최악의 해결책 인 것 같습니다. – Yogurtu

11

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

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 컨트롤 호출 수행하는 실행 방법 :
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; 
}