본문 바로가기
개발 이야기/C# 이야기

C# 로딩화면 추가하기(Splash 구현 예제)

by 런던살자 2019. 6. 21.

안녕하세요 마블랑입니다.

 

요새는 데이터 양이 많아져서 PC 프로그램이나 모바일 프로그램을 실행할때 로딩화면이 없는것이 없습니다.

 

로딩이 완료가 되면 그떄부터 프로그램을 이용할수 있는데요

 

구현하려는 프로그램이 데이터가 많아서 로딩시간이 오래걸리는데 마우스에 로딩표시만 표시하고 싶지 않은 분들이 있을거라 생각합니다. 

 

마우스 모래시계 말고 로딩화면을 보여주는것이 더 세련되 보이지 않을까 해서 C# 프로세스에 로딩화면, 즉 Splash화면을 추가를 해보려고 합니다.

 

 

예제를 먼저 소개하면 해당 Count가 100에서 0으로 변했을때 로딩화면이 닫히고 메인폼이 나타납니다.

 

화면은 간단하므로 바로 코드를 보겠습니다.

 

코드 역시 어렵지 않으나 Thread가 포함되어 있습니다. 

 

클래스 생성자에 Thread를 시작하여 Count를 100 에서 0으로 감소시켜줍니다.

 

그리고 나서 Count가 0이 되었을때 로딩화면을 닫습니다.

 

로딩화면이 닫히기만 하면 메인폼은 표시가 되지 않습니다.

 

그래서 아래와 같이 Program.cs 파일에 메인폼위에 Splash 폼을 먼저 실행을 해줘야합니다. 

 

이렇게 완료가 되면 한번 실행해보시기 바랍니다. 기다리는것이 지루하다면 Sleep간격을 줄이거나 Count값을 조정하여 보세요^^

지금은 간단하게 Count를 통해 Splash를 종료하였지만 상황에 따라 데이터로딩이 완료되면 종료하게 할수도 있으니 잘 활용하시기 바랍니다.

 

코드는 Splash 코드만 올렸습니다.

using System.Threading;
using System.Windows.Forms;

namespace SplashForm
{
    public partial class SplashForm : Form
    {
        delegate void TestDelegate_ShowCnt(string msg);
        delegate void TestDelegate_Close();

        public SplashForm()
        {
            InitializeComponent();
            Thread thread = new Thread(Thread1);
            thread.Start();
        }

        private void showText(string msg)
        {
            text_count.Text = msg;
        }

        private void formClose()
        {
            this.Close();
        }

        private void Thread1()
        {
            for (int i = 100; i > 0; i--)
            {
                this.Invoke(new TestDelegate_ShowCnt(showText), i.ToString());
                Thread.Sleep(100);
            }

            this.Invoke(new TestDelegate_Close(formClose));
        }
    }
}

 

약간 다른 주제이기는 하나 Thread 가 있으므로 추가적으로 설명을 드리겠습니다. 

 

Thread 에서 메인폼의 UI를 변경하려는 작업을 할때 그냥 함수를 호출하면 에러가 발생합니다.

 

그래서 Thread에서 메인폼의 함수를 호출하기 위해 delegate를 선언하고 this.Invoke를 통해 메인폼의 UI를 변경하는 것입니다.

 

이부분은 추후에 자세한 설명으로 포스팅 하겠습니다.

 

 

이상 마블랑이었습니다.

 

읽어주셔서 고맙습니다.

댓글