본문으로 바로가기

C# Form 과 Dialog Box

category 개발언어/C# 2017. 8. 20. 12:05

C# 에서 Form과 Dialog는 동일한 Control이다.
MFC 를 주로 사용하는 개발자에게는 습관적으로 Dialog 를 찾으려는 경향이 있다.
C# 에서는 DialogBox를 별도로 제공하지 않는다. VB에서도 Form과 Dialog를 별도로 구분하지 않았다.
Dialog와 Form을 구분하지 않는 정책이 훨씬 더 편리하고 직관적인 장점이 있다고 생각된다.

C#에서 Form이 Dialog로 처리될 때와 Form으로 처리 될때 어떻게 다르게 동작 하는지 살펴보자.

[그림1]

먼저 MDI Parent로 시작하는 프로젝트에  [그림1]과 같이 Form을 만들고 아래와 같이 코딩한다.
Radio Button에서 MDI 또는 SDI 둘중에 어느것이 선택 되었는지 확인하고 MDI 이면 OK 아니면 No를 반환하도록 코딩한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System;
using System.Windows.Forms;
 
namespace SampleTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
//Radio Button에서 선택상태를 Check한 다음
//Dialog Result로 반환할 값을 선택한다
if (MDIRadio.Checked == true) this.DialogResult = DialogResult.OK;//MDI 가 선택되면 OK
else this.DialogResult = DialogResult.No;//SDI가 선택되면 No
 
this.Close();//Form을 닫는다
}
}
}
[그림2]

MDIParent Form은 [그림2]와 같이 메뉴를 추가 한다.
그리고 메뉴클릭 이벤트 핸들러에 아래와 같은 코드를 추가한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
private void testDialogToolStripMenuItem_Click(object sender, EventArgs e)
{
 DialogResult dr = new DialogResult();//Dialog로 부터 결과를 받기위한 변수 생성
 Form fm = new Form1(); //Form 생성
 dr = fm.ShowDialog(); //Form을 Dialog로 띄우기
 fm.Text = "Dailog";
 if (dr == DialogResult.OK)
 {
 //MDI 의 Child로 폼을 보여주기
 fm.MdiParent = this;
 fm.WindowState = FormWindowState.Maximized; //Child Window 최대화 시켜서 MDI Size에 맞춘다
 fm.Show();
 fm.Text = "Form";
 }
 else if (dr == DialogResult.No)
 {
 //SDI 폼을 보여주기
 fm.AutoSize = true;
 fm.MaximumSize = this.MaximumSize;
 fm.AutoSizeMode = AutoSizeMode.GrowAndShrink;
 fm.Show(this);
 fm.Text = "Form";
 }

그럼 어떻게 동작 하는지 살펴보자

[그림3]

메뉴에서 TestDialog를 누르면
Form fm = new Form1(); //Form 생성
fm.ShowDialog(); //Form을 Dialog로 띄우기
에 의해서 [그림3]과 같이 Form이 Dialog참으로 활성화 된다.

Dialog상태에서 MDI를 선택하고 OK를 누르면
if (MDIRadio.Checked == true) this.DialogResult = DialogResult.OK;//MDI 가 선택되면 OK
else this.DialogResult = DialogResult.No;
에서 라디오 버튼의 선택 상태에 따라 결과를 리턴한다.
그리고 아래 코드에서 Dialog의 결과를 리턴 받아서 Form을 MDI의 Child 로 변환시켜서 창을 다시 띄운다
if (dr == DialogResult.OK)
{
//MDI 의 Child로 폼을 보여주기
fm.MdiParent = this;
fm.WindowState = FormWindowState.Maximized; //Child Window 최대화 시켜서 MDI Size에 맞춘다
fm.Show();
}

[그림4]는 MDI Child로 Form이 활성화 되어 있는 것을 보여준다.

[그림4]

 

 

 

 

 

 

 

 

 

[그림5]

만일 SDI 로 선택하고 OK를 누르면 [그림5]와 같이 Form이 MDI외부에 그냥활 성화 되어 있는 것이 보일 것이다.
여기서 주목할 사실은 SDI의 경우 Form과 Dialog는 별다른 차이를 보이지 않는다는 것이다.
그런데 윈도우 Text의 변화를보면 Dialog일때 Show()를 실행하면 OK 버튼이 눌러질때 까지 다음 동작을 수행하지 않고 있으므로 Text의 내용이 변경되지 않은 것을 볼수 있다.
그런데 Form의 경우는 윈도우 Title의 text가 변화 되어 있는 것을 볼수 있다.
즉 화면을 보여주고  곧바로 다음 루틴이 실행 된다는 것이다.