본 자료는
1. SmartX에서의 MDI 구성 조합
1-1. SmartForm-SmartForm MDI 구성 조합
1-2. SmartForm-SmartInnerForm MDI 구성 조합
1-3. MDI 구성 조합별 장단점및 선택 기준
2. SmartX에서의 MDI 구현 방법
2-1. SmartForm-SmartForm MDI 구현 방법
2-2. SmartForm-SmartInnerForm MDI 구현 방법
3. SmartX 에서의 다이얼로그(Dialog) 사용방법
3-1. 결과를 받기 위한 다이얼로그
3-2. 작업상태를 나타내는 다이얼로그
순서로 진행합니다.
프로그램 개발 시 대부분의 프로그램은 MDI 로 구성하는 것이 일반적인 방법입니다. 본 자료는 SmartForm과 SmartInnerForm 의 MDI 구성 조합을 설명하고 구성 조합에 따른 기초적인 구현 방법을 설명합니다.
1. SmartX에서의 MDI 구성 조합
SmartX에서의 MDI 구성 조합은 자식폼이 SmartForm 또는 SmartInnerForm 여부에 따라 SmartForm-SmartForm 조합과 SmartForm-SmartInnerForm 조합으로 나눌 수 있습니다. 두 조합 모두 부모폼은 반드시 SmartForm이어야 하고 자식폼은 SmartForm이나 SmartInnerForm 중에서 조합에 맞도록 한가지만 사용합니다. 두 조합을 혼용하여 사용하는 것은 어렵기 때문에 아래의 내용을 확인하시고 프로젝트에 적절한 조합을 적용하시기 바랍니다.
1-1. SmartForm-SmartForm MDI 구성 조합
SmartForm-SmartForm MDI 구성 조합은 부모폼과 자식폼이 모두 SmartForm으로 구성되며, 모든 폼이 물리적으로 분리되어 있는다는 특징이 있습니다. 즉, 아래 그림과 같이 부모폼과 자식폼이 별도의 Windows Form 파일로 분리되어 있습니다.

1-2. SmartForm-SmartInnerForm MDI 구성 조합
SmartForm-SmartInnerForm MDI 구성 조합은 부모폼은 SmartForm이고 자식폼은 모두 SmartInnerForm으로 구성되며, 모든 폼이 하나의 물리적인 폼에 위치한다는 특징이 있습니다. 즉, 아래 그림과 같이 하나의 Windows Form 파일에 부모폼과 자식폼이 모두 포함되어 있습니다.

1-3.MDI 구성 조합별 장단점및 선택 기준
조합 |
SmartForm |
SmartInnerForm |
---|---|---|
폼 |
||
폼 |
||
폼 수 |
||
|
1. 각 폼이 물리적으로 분리되어 Visual Studio의 디자인 모드에서 폼 갱신(Reload) 시간이 SmartInnerForm 조합보다 짧음
(SmartX와 상관없이 Visual Studio에서 발생) 2. 상대적으로 (SmartForm + SmartInnerForm)보다 더 많은 폼을 사용할 수 있다. 3. SmartSplash를 이용하여 자식폼의 Loading 대기 표시 구현 처리 |
1. 물리적인 1개의 폼이기 때문에 컨트롤 객체 접근 및 데이터 공유가 SmartForm-SmartForm 조합에 비해 편하다. 2. 화면이 전환되는 속도가 SmartForm-SmartForm 조합보다 빠르다. |
|
1. 물리적인 폼의 개수가 여러 개이기 때문에 컨트롤 객체 접근 및 데이터 공유가 SmartForm-SmartInnerForm조합에 비해 불편하다. 2. 화면이 전환되는 속도가 SmartForm-SmartInnerForm 조합에 비해 느리다. |
1. 각 폼이 하나의 물리적인 폼에 구성되어 있어 Visual Studio의 디자인 모드에서 폼 갱신(Reload) 시간이 SmartForm 조합보다 길다 (SmartX와 상관없이 Visual Studio에서 발생) |
기준 |
1. 각 폼에 컴포넌트가 많이 배치되는 경우 2. 구성해야 하는 폼의 개수가 많은 경우 |
1. 각 폼간 데이터의 공유가 잦은 경우 2. 폼의 개수가 적은 경우 3. 화면 전환 속도가 빨라야 하는 경우 |
2. SmartX 에서의 MDI 구현 방법
이 항목에서는 공통 영역이 있는 MDI 구성 조합을 구현하는 방법을 설명합니다. 프로젝트를 생성하는 방법이나 개발환경 설정에 대한 자세한 내용은 SmartX Framework 홈페이지(smartx.co.kr)의 "Starting Guide → Part 2. 프로젝트 생성" 항목을 참고하시기 바랍니다.
2-1. SmartForm-SmartForm MDI 구현하기
[STEP-1] 파일 생성하기
아래 그림과 같이 4개의 Window Form 파일을 생성합니다.

[STEP-2] SmartForm 생성하기
SmartX 에서 MDI 를 구성할 때 Window Form 에는 반드시 SmartForm 이 존재해야 합니다. 아래 그림과 같이 도구상자에서 SmartForm을 Window Form 에 생성하고 다른 파일의 Window Form 에도 동일한 작업을 수행해야 합니다.

[STEP-3] SmartForm 크기 조절하기
SmartForm 의 LCDSize 속성을 조절하여 크기를 설정합니다. 예시에서는 MainForm 을 800x480, ChildForm 을 800x340, DialogForm 을 480x272 사이즈로 설정합니다.


[STEP-4] 컨트롤 컴포넌트 배치 및 이미지 설정
폼 디자이너를 이용해 그림과 같이 컨트롤을 배치하고, 각 컴포넌트의 이미지 속성을 통해 이미지를 적용합니다.

[STEP-5] 공통영역 속성 설정하기
공통 영역에 사용되는 UI Control이 깜빡이는 현상을 없애기 위해 공통 영역에 사용되는 사용자 인터페이스 컨트롤의 OverlapOptimize 속성을 폼디자이너의 속성 창에서 false로 변경합니다.

MDI 창 형태 구성 시 모든 폼을 전체화면으로 구성하는 방법과 LCDSize 속성을 활용하여 공통영역이 있는 형태로 구성할 수 있습니다.
이 항목에서는 공통영역이 있는 형태로 구성하는 방법을 설명하고 있으며, MainForm과 ChildForm의 크기를 다르게 설정하되 ChildForm의 크기는 동일하게 설정하여 공통 영역을 사용하는 형태입니다.
SmartX New Framework를 활용하여 MDI 창 형태 구성 시 화면이 전환되면서 발생하는 겹침(Overlap) 현상을 해결하기 위한 처리로 인해 공통 영역에 사용되는 UI Control이 깜빡이는 현상이 발생합니다. 그렇기 때문에 공통 영역에 사용되는 비슷한 형태의 사용자 인터페이스 컨트롤의 OverlapOptimize 속성을 폼디자이너의 속성 창에서 false로 변경하여 사용하시는 것을 권장합니다.

자세한 내용은 자료실 > SmartX Framework 관련 > Reference Guide > Part 2. 사용자 인터페이스(UI) 컴포넌트 > 1-4-3) 공통 영역에서 OverlapOptimize 속성을 사용하여 깜빡임 제어하기 를 참고하시기 바랍니다.[바로가기]
[STEP-6] 초기 설정 코드 작성하기
MainForm 의 Form_Load 이벤트에서 MDI 관련 설정을 작성합니다.
MainForm.cs
private ChildForm2 childForm2;
private void MainForm_Load(object sender, EventArgs e)
{
// MainForm 설정을 생략하면 예외가 발생하므로 반드시 부모폼을 설정해야 합니다.
smartForm1.MainForm = this;
// 자식폼을 인스턴싱 합니다.
childForm1 = new ChildForm1();
childForm2 = new ChildForm2();
// 자식폼을 등록합니다.
// 부모폼의 인덱스는 0번이고 자식폼의 인덱스는 AddChildForm 메소드로 추가한 순서대로 부여됩니다.
smartForm1.AddChildForm(childForm1);
smartForm1.AddChildForm(childForm2);
// 자식폼의 출현 위치를 설정합니다.
//본 예제에서는 상단의 타이틀 영역도 공통 영역이므로 좌표를 (0, 50)으로 설정합니다.
smartForm1.ChildFormLocation(0, 50);
// MailForm을 출력합니다.
// 반드시 Form.Load 이벤트에서 SmartForm.Show 메소드를 호출하여 최초에 표시되는 폼을 설정해야 합니다.
smartForm1.Show(0);
[STEP-7] 화면 전환 코드 작성하기
화면 전환을 수행할 SmartButton 의 Click 이벤트를 구현하여 화면을 전환하도록 코드를 작성합니다.
MainForm.cs
{
smartForm1.Show(1);
private void btnChild2_Click(object sender, EventArgs e)
{
smartForm1.Show(2);
private void btnDialog_Click(object sender, EventArgs e)
{
smartForm1.ShowDialog(typeof(DialogForm));
private void btnMain_Click(object sender, EventArgs e)
{
smartForm1.Show(0);
DialogForm.cs
{
2-2. SmartForm-SamrtInnerForm MDI 구현하기
[STEP-1] 파일 생성하기
아래 그림과 같이 1 개의 Window Form 파일을 생성합니다.

[STEP-2] SmartForm & SmartInnerForm 생성하기
SmartX 에서 MDI 를 구성할 때 Window Form 에는 반드시 SmartForm 이 존재해야 합니다. 아래 그림과 같이 도구상자에서 SmartForm 을 Window Form 에 생성하여 부모폼을 만듭니다.

그리고 SmartInnerForm 을 Window Form 의 남는 여백에 생성하여 자식폼을 만듭니다.

SmartForm 을 가장 먼저 Window Form 에 배치할 경우 Window Form 의 크기가 SmartForm 의 LCDSize 속성에 맞춰 자동으로 조절됩니다. 그러므로 SmartForm 을 배치한 후 Window Form 의 Size 속성을 조절하여 적절한 여백을 만드시기 바랍니다. 또한 SmartInnerForm 을 가장 먼저 배치하면 Window Form 의 크기가 자동으로 변경되지 않기 때문에 SmartInnerForm 을 배치한 후 SmartForm 을 배치하셔도 됩니다.
폼 디자인창에서 SmartForm 과 SmartInnerForm 을 배치할 때 SmartForm 이 SmartInnerForm 을 포함하게 배치할 경우(겹치게 두는 경우) 예외가 발생하기 때문에 반드시 SmartForm 과 SmartInnerForm 은 Window Form 에 추가하시기 바랍니다.
[STEP-3] SmartForm & SmartInnerForm 사이즈 조절하기
SmartForm 과 SmartInnerForm 의 LCDSize 속성을 조절하여 크기를 설정합니다. 예시에서는 MainForm 을 800x480, ChildForm 을 800x340, DialogForm 을 480x272 사이즈로 설정합니다.

[STEP-4] 컨트롤 컴포넌트 배치 및 이미지 설정
폼 디자이너를 이용해 그림과 같이 컨트롤을 배치하고, 각 컴포넌트의 이미지 속성을 통해 이미지를 적용합니다.

[STEP-5] 공통영역 속성 설정하기
공통 영역에 사용되는 UI Control이 깜빡이는 현상을 없애기 위해 공통 영역에 사용되는 사용자 인터페이스 컨트롤의 OverlapOptimize 속성을 폼디자이너의 속성 창에서 false로 변경합니다.

MDI 창 형태 구성 시 모든 폼을 전체화면으로 구성하는 방법과 LCDSize 속성을 활용하여 공통영역이 있는 형태로 구성할 수 있습니다.
이 항목에서는 공통영역이 있는 형태로 구성하는 방법을 설명하고 있으며, MainForm과 ChildForm의 크기를 다르게 설정하되 ChildForm의 크기는 동일하게 설정하여 공통 영역을 사용하는 형태입니다.
SmartX New Framework를 활용하여 MDI 창 형태 구성 시 화면이 전환되면서 발생하는 겹침(Overlap) 현상을 해결하기 위한 처리로 인해 공통 영역에 사용되는 UI Control이 깜빡이는 현상이 발생합니다. 그렇기 때문에 공통 영역에 사용되는 비슷한 형태의 사용자 인터페이스 컨트롤의 OverlapOptimize 속성을 폼디자이너의 속성 창에서 false로 변경하여 사용하시는 것을 권장합니다.

자세한 내용은 자료실 > SmartX Framework 관련 > Reference Guide > Part 2. 사용자 인터페이스(UI) 컴포넌트 > 1-4-3) 공통 영역에서 OverlapOptimize 속성을 사용하여 깜빡임 제어하기 를 참고하시기 바랍니다.[바로가기]
[STEP-6] 초기 설정 코드 작성하기
MainForm의 Form_Load 이벤트에서 MDI 관련 설정을 작성합니다.
MainForm.cs
{
// MainForm 설정을 생략하면 예외가 발생하므로 반드시 부모폼을 설정해야 합니다.
smartForm1.MainForm = this;
// 자식폼을 등록합니다.
// 부모폼의 인덱스는 0번이고 자식폼의 인덱스는 AddChildForm 메소드로 추가한 순서대로 부여됩니다.
smartForm1.AddChildForm(childForm1);
smartForm1.AddChildForm(childForm2);
smartForm1.AddChildForm(childForm3);
// 자식폼의 출현 위치를 설정합니다.
//본 예제에서는 상단의 타이틀 영역도 공통 영역이므로 좌표를 (0, 50)으로 설정합니다.
smartForm1.ChildFormLocation(0, 50);
// MailForm을 출력합니다.
// 반드시 Form.Load 이벤트에서 SmartForm.Show 메소드를 호출하여 최초에 표시되는
// 폼을 설정해야 합니다.
smartForm1.Show(0);
[STEP-7] 화면 전환 코드 작성하기
화면전환을 수행할 SmartButton 의 Click 이벤트를 구현하여 화면을 전환하도록 코드를 작성합니다
MainForm.cs
{
smartForm1.Show(1);
private void btnChild2_Click(object sender, EventArgs e)
{
smartForm1.Show(2);
private void btnDialog_Click(object sender, EventArgs e)
{
smartForm1.ShowDialogInnerForm(3);
private void btnMain_Click(object sender, EventArgs e)
{
smartForm1.Show(0);
// DialogForm의 Close 버튼 클릭 이벤트
private void btnClose_Click(object sender, EventArgs e)
{
smartForm1.Show(0);
3. SmartX 에서의 다이얼로그(Dialog) 사용 방법
이 항목에서는 몇 가지 경우에 대한 다이얼로그의 사용방법을 설명합니다. 다이얼로그에 대한 자세한 내용은 SmartX Framework 홈페이지(smartx.co.kr)의 "Reference Guide → Part 2. 사용자 인터페이스(UI) 컴포넌트 → 1. 사용자 인터페이스 (UI) 공통사항 및 장점 → 1) SmartX 에서의 MDI 구성 및 조합 별 주요 특징 → 1-3) 다이얼로그(Dialog) 창 출력 방법" 항목을 참고하시기 바랍니다.
• 화면 중앙에 출력할 경우
[CASE-1] SmartForm.ShowDialog 또는 SmartForm.ShowDialog_NoneBlockin 메소드를 사용한 경우
- 기본값으로 화면 중앙에 출력됩니다.
[CASE-2] SmartForm.ShowDialogInnerForm 메소드를 사용한 경우
-SmartFormInnerForm의 CenterLocation속성을 true로 설정하고 LCDSize 속성을 CUSTOMIZING으로 설정합니다.
[CASE-3] Form.ShowDialog 메소드를 사용한 경우
- SmartForm의 CenterLocation 속성을 True로 설정합니다.
• 사용자 지정 위치에 출력할 경우
[CASE-1] SmartForm.ShowDialog 또는 SmartForm.ShowDialog_NoneBlockin 메소드를 사용한 경우
- 메소드의 인자로 원하는 위치의 값을 설정합니다.
[CASE-2] SmartForm.ShowDialogInnerForm 메소드를 사용한 경우
-메소드를 호출한 후에 SmartInnerForm의 Location 속성을 원하는 위치의 값으로 설정합니다.(EX : smartInnerForm1.Location = new Point(5, 5);)
[CASE-3] Form.ShowDialog 메소드를 사용한 경우
- DialogForm을 인스턴싱 한 후에 DialogForm의 Location 속성을 원하는 위치의 값으로 설정합니다.(EX : frmDlg.Location = new Point(5, 5);)
3-1. 결과를 받기 위한 다이얼로그
코드의 진행을 멈추고(Blocking) 다이얼로그 창에서 결과(DialogResult)를 받아야 하는 경우, SmartForm.ShowDialog 또는 Form.ShowDialog 메소드를 사용하여 Modal 방식으로 다이얼로그 창을 출력합니다. 메소드의 사용방법은 아래의 그림을 참고하세요.


두가지 메소드 모두 SmartForm-SmartForm 및 SmartForm-SmartInnerForm MDI 구성 조합에서 사용이 가능합니다. 메소드가 호출되면 Blocking되어 코드의 진행이 멈추며 다이얼로그 창이 닫힐 때까지 대기합니다.
SmartForm.ShowDialog 메소드는 폼의 인스턴싱 없이 사용할 수 있지만 DialogResult 결과만을 받습니다. Form.ShowDialog 메소드는 인스턴싱한 폼의 객체를 통해 Getter/Setter 방식으로 다이얼로그 창과 데이터를 교환할 수 있고 DialogResult 결과도 받을 수 있습니다. 그렇기 때문에 단순히 결과만을 반환한다면 SmartForm.ShowDialog 메소드를 사용하고 데이터 교환이 필요하다면 Form.ShowDialog 메소드를 사용하시면 됩니다.
이러한 특징을 응용하여 Confirm 및 InputBox 처럼 입력을 받거나 결과를 반환하는 다이얼로그를 구현할 수 있습니다.
3-2. 작업상태를 나타내는 다이얼로그
코드의 진행을 멈추지 않고(None-Blocking) 결과(DialogResult)가 필요 없는 경우, SmartForm.ShowDialog_NoneBlocking 메소드를 사용하여 Modeless 방식으로 다이얼로그 창을 출력합니다. 메소드의 사용방법은 아래의 그림을 참고하세요.


위 그림에서는 로딩창이 출력되는 동안 SmartThread 컴포넌트를 사용하여 백그라운드 작업을 처리한 후에 작업이 끝나면 다이얼로그 창을 닫습니다.
SmartForm.ShowDialog_NoneBlocking 메소드로 출력된 다이얼로그 창은 다른 폼에서 SmartForm.CloseDialog_NoneBlocking 메소드를 호출하여 다이얼로그 창을 닫거나 다이얼로그 내부에서 Form.Close 메소드를 사용해 다이얼로그 창을 닫을 수 있습니다.
이 메소드는 SmartForm-SmartForm 및 SmartForm-SmartInnerForm MDI 구성 조합에서 사용이 가능합니다. 메소드가 호출되면 None-Blocking 되어 코드의 진행이 멈추지 않고 다이얼로그 창을 출력한 후 계속 코드가 진행됩니다.
SmartForm.ShowDialog_NoneBlocking 메소드가 반환하는 객체를 통해 Getter/Setter 방식으로 다이얼로그 창과 데이터를 교환할 수 있습니다.
이러한 특징을 응용하여 Loading 및 Mask처럼 작업상태를 나타내는 다이얼로그를 구현할 수 있습니다.