본문 바로가기
C++ 200제/코딩 IT 정보

C# 스플래시 윈폼 구현 (대기 시간 지루하지 않은 다이얼로그)

by vicddory 2017. 5. 2.

C# 스플래시 윈폼 구현 (대기 시간 지루하지 않은 다이얼로그)



C Sharp Form - Splash Form[C# 스플래시 윈폼 구현 (대기 시간 지루하지 않은 다이얼로그)]


WinForm 스플래시 스크린은 실버라이트를 이용한 웹 페이지와는 조금 다릅니다. 시각적으로도 다르고, 구현 방식도 당연히 다르죠. 스플래시 스크린은 주로 응용 프로그램이 로드되는 동안에 사용자에게 지루함(?)을 줄이기 위한 용도 등으로 쓰입니다.


예를 들어, 어떤 프로그램을 실행할 때, 프로그램 로딩이 끝나기 전 GIF 이미지가 실행되는 건 아시죠? 그와 유사한 프로그램이라고 할 수 있습니다.


이런 C# 윈폼 스크린을 구현하기 위해선 그림자, 투명도, 배경 이미지, 투명함의 정도 등에 대한 API 사용이 요구됩니다.

가장 중요한 API는 UpdateLayeredWindow 입니다.


매우 유용한 API로서, 그림자를 포함한 배경 이미지 등을 표시할 수 있게 돕습니다. 다른 API들도 호출되는데 소개하자면 아래와 같이 정리할 수 있습니다.


1
2
3
4
5
6
GetDC
GetCompatibleDC
ReleaseDC
DeleteDC
SelectObject
DeleteObjectUpdateLayeredWindow
cs


이 API들은 클래스 내부에 소스 코드로 정의되어 삽입되어 있습니다.


UpdateFormDisplay 함수에 프로그램 로딩 시간 동안 띄워질 이미지를 인자로 넘기면 됩니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
public void UpdateFormDisplay(Image backgroundImage)
{
    IntPtr screenDc = API.GetDC(IntPtr.Zero);
    IntPtr memDc = API.CreateCompatibleDC(screenDc);
    IntPtr hBitmap = IntPtr.Zero;
    IntPtr oldBitmap = IntPtr.Zero;
 
    try
    {
        //Display-image
        Bitmap bmp = new Bitmap(backgroundImage);
 
        //Set the fact that background is transparent
        hBitmap = bmp.GetHbitmap(Color.FromArgb(0));
        oldBitmap = API.SelectObject(memDc, hBitmap);
 
        //Display-rectangle WinForm
        Size size = bmp.Size;
        Point pointSource = new Point(00);
        Point topPos = new Point(this.Left, this.Top);
 
        //Set up blending options Diaglo
        API.BLENDFUNCTION blend = new API.BLENDFUNCTION();
        blend.BlendOp = API.AC_SRC_OVER;
        blend.BlendFlags = 0;
        blend.SourceConstantAlpha = 255;
        blend.AlphaFormat = API.AC_SRC_ALPHA;
 
        API.UpdateLayeredWindow(this.Handle, screenDc, 
                                ref topPos, ref size, memDc, ref pointSource,
                                0ref blend, API.ULW_ALPHA);
 
        //Clean-up C# Splash WinForm Dialog
        bmp.Dispose();
        API.ReleaseDC(IntPtr.Zero, screenDc);
 
        if (hBitmap != IntPtr.Zero)
        {
            API.SelectObject(memDc, oldBitmap);
            API.DeleteObject(hBitmap);
        }
 
        API.DeleteDC(memDc);
    }
    catch (Exception) { }
}
cs


제 경우엔 고객사에서 구동되는 PC 화면에 띄웠었습니다. 우리 회사를 대표하는 이미지와 간단한 링크도 포함했었죠. 결론을 말씀드리자면 고객사에서도 좋게 봤지 나쁘게 보진 않았습니다.


왜냐면 저 기능 때문엔 컴플레인이 안 들어왔거든요.


C# 스플래시 윈폼 구현 (대기 시간 지루하지 않은 다이얼로그)

댓글