본문 바로가기
C# Windows Form 개발 따라하기

[007] Form modal 효과. 모서리 라운드, 배경 투명하게. Windows Form

by bryan.oh 2019. 1. 22.
반응형

Modal 창 효과 내기

Windows Form Modal

Visual C#


기본적으로 Form 을 modal 창으로 띄우려면 Form.ShowDialog() 를 하면 됩니다.


여기에 웹에서 보면 모달창이 떠있는 동안 뒷 배경이 회색 반투명하게 보이죠? 대부분.

모서리도 둥글게 라운드되어있고요.


그걸 Windows Form 에서 해보겠습니다.


요약

1. 호출하는 Form ( 아무거나 만들어서 버튼클릭 이벤트를 하나 추가합니다. )

2. 뒷배경을 반투명하게 할 form ( 재사용 )

3. Custom Dialog Form ( Yes , No 버튼등을 만들어서 물어보는 창 )



일단 Form  을 추가합니다.


이름은 FormModalBack 이라고 하겠습니다.


그리고 아래와 같이 속성을 변경해 줍니다.
    • FormBorderStyle : None

    • Opacity : 50%

    • BackColor : Black


그리고 Event 속성에서 Paint 를 추가합니다.

소스는 아래와 같습니다.




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
using System;
using System.Windows.Forms;
 
namespace HelloWorldTest
{
    public partial class FormModalBack : Form
    {
        [System.Runtime.InteropServices.DllImport("Gdi32.dll", EntryPoint = "CreateRoundRectRgn")]
        private static extern System.IntPtr CreateRoundRectRgn(int nLeftRect, int nTopRect
int nRightRect, int nBottomRect, int nWidthEllipse, int nHeightEllipse);
 
        [System.Runtime.InteropServices.DllImport("gdi32.dll", EntryPoint = "DeleteObject")]
        private static extern bool DeleteObject(System.IntPtr hObject);
 
        public FormModalBack()
        {
            InitializeComponent();
        }
 
        private void FormModalBack_Load(object sender, EventArgs e)
        {
 
        }
 
        private void FormModalBack_Paint(object sender, PaintEventArgs e)
        {
            System.IntPtr ptr = CreateRoundRectRgn(00this.Width, this.Height, 1010);
            this.Region = System.Drawing.Region.FromHrgn(ptr);
            DeleteObject(ptr);
        }
    }
}
 

cs

(load 이벤트는 없어도 됩니다)



그리고 또 Form 을 추가해서 FormCustomDialog 로 만듭니다.

상황에 따라 Message 와 버튼 text 를 받아서 보여주고 Click 했을 때 this.DialogResult 에 값을 설정해 주면됩니다.

FormCustomDialog.cs 코드는 아래와 같습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
using System;
using System.Windows.Forms;
 
namespace HelloWorldTest
{
    public partial class FormCustomDialog : Form
    {
        public FormCustomDialog()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            this.DialogResult = DialogResult.OK;
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            this.DialogResult = DialogResult.Cancel;
        }
    }
}
 
cs

this.DialogResult = DialogResult.Ok; 를 하면 Form 이 종료됩니다. 굳이 this.close() 를 안해도됩니다.


이제 테스트를 해보겠습니다. 

아무 Form 에서 버튼을 만들고 클릭 이벤트에 아래와 같이 소스를 입력합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
        private void button1_Click(object sender, EventArgs e)
        {
            FormModalBack fm = new FormModalBack();  // 뒷배경 반투명처리할 폼
            fm.Size = this.Size;
            fm.BringToFront();
            fm.Show();
            fm.Location = this.Location;    // 반드시. .Show() 다음에.
            if (new FormCustomDialog().ShowDialog() == DialogResult.OK)
            {   // 원래 띄울 모달창.
                // do something...
            }
            fm.Close();
        }
cs



프로그램을 실행합니다



버튼을 클릭하면 아래와 같이 뒷배경이 반투명하게 됩니다.





728x90
반응형

댓글