2016-09-12 2 views
1

로드하는 데 시간이 다소 걸리는 .Net Winform 응용 프로그램이 있습니다.스플래시 화면 Winforms

내 응용 프로그램이 초기 화면을 통해 up.Basically 열 때 내가해야 내 응용 프로그램

초기 화면의 초기화 과정을 moniter하려는 내 응용 프로그램을 클릭하면 시작하고 종료하는 시작 화면을 만들

다른 winform과 별도의 스레드에서 실행해야합니다.

사용자가 애플리케이션 시작을 취소하기 위해 클릭 할 수있는 스플래시 화면에서 '대기 중지'버튼을 사용하고 애플리케이션을 종료 할 수 있어야합니다.

또한 스플래시 화면에서 응용 프로그램 초기화 진행 상황을 보여줄 필요가 있습니다.

나는 스플래쉬 스크린에 대한 지식이 매우 부족하다. 내 요구 사항을 진행하기 위해 몇 가지 예를 들어 주시겠습니까?

한 번 더 스플래시 화면 구현 후 질문 : 내 응용 프로그램 초기화가 다른 프로젝트에서 발생하므로 스플래시 화면에 대한 별도의 EXE 파일을 만들고 기본 Screen의 다른 프로젝트에서 사용합니다. 스플래시 화면을 추가하는 것이 좋습니다 (exe)를 메인 화면에서 참조로 사용하고 스플래시 화면에서 메소드를 사용 하시겠습니까?

미리 도움을 주셔서 감사합니다.

+0

[그런 해결책] (http://stackoverflow.com/questions/32418695/show-splash-screen-during-loading-the-main-form)을 사용할 수 있습니다. 그런 다음 스플래시 화면에서 클릭 할 때'Application.Exit(); '을 호출하는 버튼이 있으면 충분합니다. –

+0

응용 프로그램의 기본 서식 중 코드의 어느 부분이 오랜 시간을 끝내고 있는지 알고 있습니까? – Niklas

답변

2

많은 질문이 있습니다. "스플래시 화면을 만드는 방법"에 대해 대답하고 초기화 진행을 취소하고 표시하는 방법을 시도해 볼 수 있습니다.

기본적으로 스플래시 양식으로 작동하는 다른 양식을 만듭니다.

속성을 설정합니다 :

  • startPosition입니다 = FormStartPosition.CenterScreen
  • MaximizeBox = false를
  • FormBorderStyle = FormBorderStyle.None
  • 그리고 당신은 그런

을 원하는 경우 backgroundImage의로드 메인 윈도우를 보여주기 전에 스플래시 스크린을 만들고 보여주고 참조를 전달하십시오. 메인 윈도우 객체

Splash splash = new Splash(); 
splash.Show(); 

MainWindow wnd = new MainWindow(splash); 

에 그리고 당신의 MainWindowLoad_Load 기능 메인 창 내부 :

public MainWindow(Splash splash) 
{ 
    mSplash = splash; 
} 
private void MainWindow_Load(object sender, System.EventArgs e) 
{ 
    // do long initialisation, and when done.... 

    mSplash.Close(); 
    mSplash = null; 

} 
+0

이것은 어떻게 다른 스레드에서 실행되며 긴 초기화가 발생하면 mSplash 양식의 UI 스레드를 어떻게 차단하지 않습니까? – Niklas

+0

@ Servé Laurijssen 내 응용 프로그램 초기화가 다른 프로젝트에서 발생하므로 Splash Screen에 대한 별도의 EXE 파일을 만들고 기본 Screen의 다른 프로젝트에서 사용합니다. 기본 화면에서 참조로 스플래시 화면 (exe)을 추가하고 메서드를 사용하는 것이 좋습니다. 스플래시 화면에서? – reddy

0

시작 화면이 모양에 대해 때문에과 느낌, 난 당신이 UI 스레드가 그것을 처리 할 것을 제안 , 다른 실행 스레드로 코드를 가져 가면 스플래시 화면 표시에서 아무 것도 변경하지 않으면 BeginInvoke이 필요합니다.

private void MainForm_Load(object sender, EventArgs e) 
{ 
    LoadingForm _loading = new LoadingForm(); 
    BackgroundWorker _worker = new BackgroundWorker { WorkerReportsProgress = true }; 
    _worker.ProgressChanged += (o, z) => 
    { 
     _loading.progressBar1.Minimum = 0; 
     _loading.progressBar1.Maximum = 100; 
     _loading.progressBar1.Value = (z as ProgressChangedEventArgs).ProgressPercentage; 
    }; 
    _worker.RunWorkerCompleted += (fWorker, fargs) => 
    { 
     _loading.Dispose();// this is executed when all the code in dowork event is completed,disposing the loading form and continuing your code 
    }; 
    _worker.DoWork += (workerO, workerArgs) => 
    { 
     // execute your code here , update progressbar as you go: 
     int yourProgress = 0;//need to generate this in your code as percentage 0-100 
     _worker.ReportProgress(yourProgress); 


     //////////////////////////just to show progress change////////////////////////////// 
     for (int i = 0; i < 5; i++) 
     { 
      Thread.Sleep(1500); 
      yourProgress += 20; 
      _worker.ReportProgress(yourProgress); 
     } 
     Thread.Sleep(3000); 
     //////////////////////////////////////////////////////////////////////////////// 

    }; 
    _worker.RunWorkerAsync(); 



    _loading.ShowDialog(this); 


} 

노트 당신이 당신의 BackgroundWorker에이 비율을 변경할 수 있도록하기 위해, 당신의 ProgressBar 컨트롤의 수식을 공개해야합니다 때문에
이 그 일을 내 방법입니다.

+0

내 응용 프로그램 초기화가 다른 프로젝트에서 발생하므로 스플래시 화면에 대한 별도의 EXE 파일을 만들고 기본 Screen의 다른 프로젝트에서 사용합니다. 스플래시 화면 (exe)을 기본 화면의 참조로 추가하고 스플래시 화면에서 메서드를 사용하는 것이 좋습니다 ? – reddy