본 자료는
1. SmartX에서의 MDI 구성 조합
1-1. SmartForm-SmartForm MDI 구성 조합
1-2. SmartForm-SmartInnerForm MDI 구성 조합
1-3. SmartForm-SmartForm과 SmartForm-SmartInnerForm MDI 구성 조합의 차이점
2. SmartX에서의 MDI 구현 방법
2-1. SmartForm-SmartForm MDI 구성 조합으로 MDI 구현하기
2-2. SmartForm-SmartInnerForm MDI 구성 조합으로 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 중에서 조합에 맞도록 한가지만 사용합니다. 두 조합을 혼용하여 사용하는 것은 어렵기 때문에 아래의 내용을 확인하시고 프로젝트에 적절한 조합을 적용하시기 바랍니다.
[선택 기준에 따른 MDI 구성 조합]
- 구성해야 하는 폼의 개수가 많은 경우 - MainForm 의 로딩 속도가 빨라야 하는 경우 |
|
- 화면 전환 속도가 빨라야 하는 경우 |
1-1. SmartForm-SmartForm MDI 구성 조합
SmartForm-SmartForm MDI 구성 조합은 부모폼과 자식폼이 모두 SmartForm으로 구성되며, 모든 폼이 물리적으로 분리되어 있는다는 특징이 있습니다. 즉, 아래 그림과 같이 부모폼과 자식폼이 별도의 Windows Form 파일로 분리되어 있습니다.
1-2. SmartForm-SmartInnerForm MDI 구성 조합
SmartForm-SmartInnerForm MDI 구성 조합은 부모폼은 SmartForm이고 자식폼은 모두 SmartInnerForm으로 구성되며, 모든 폼이 하나의 물리적인 폼에 위치한다는 특징이 있습니다. 즉, 아래 그림과 같이 하나의 Windows Form 파일에 부모폼과 자식폼이 모두 포함되어 있습니다.
|
1. 각 폼이 물리적으로 분리되어 Visual Studio의 디자인 모드에서 폼 갱신(Reload) 시간이 SmartForm-SmartInnerForm 조합보다 짧다. (SmartX와 상관없이 Visual Studio에서 발생) 2. SmartForm의 이벤트를 사용하여 MainForm의 로딩 속도를 SmartForm-SmartInnerForm 조합보다 빠르게 할 수 있으며, SmartSplash를 이용한 로딩 대기 표시를 할 수 있다. (MainForm의 UI 랜더링은 빠르게 되지만 상호작용은 Blocking 되어 있어 실제 로딩까지는 기다려야 함) 3. 각 폼이 물리적으로 분리되어 있기 때문에 Form 디자인 작업이 SmartForm-SmartInnerForm 조합에 비해 편하다 |
1. 물리적인 1개의 폼이기 때문에 컨트롤 객체 접근 및 데이터 공유가 SmartForm-SmartForm 조합에 비해 편하다. 2. 화면이 전환되는 속도가 SmartForm-SmartForm 조합보다 빠르다. |
---|---|---|
|
1. 물리적인 폼의 개수가 여러 개이기 때문에 컨트롤 객체 접근 및 데이터 공유가 SmartForm-SmartInnerForm조합에 비해 불편하다. 2. 화면이 전환되는 속도가 SmartForm-SmartInnerForm 조합에 비해 느리다. |
1. 각 폼이 하나의 물리적인 폼에 구성 되어 있어 Visual Studio 의 디자인 모드에서 폼 갱신(Reload) 시간이 SmartForm-SmartForm 조합보다 길다. (SmartX와 상관없이 Visual Studio에서 발생) 2. MainForm의 로딩 속도가 SmartForm-SmartForm 조합에 비해 느리다. |
조합 |
SmartForm |
SmartInnerForm |
---|---|---|
|
|
|
폼 수 |
||
|
1. 각 폼이 물리적으로 분리되어 Visual Studio의 디자인 모드에서 폼 갱신(Reload) 시간이 SmartForm-SmartInnerForm 조합보다 짧다. (SmartX와 상관없이 Visual Studio에서 발생) 2. SmartForm 의 이벤트를 사용하여 MainForm 의 로딩 속도를 SmartForm-SmartInnerForm 조합보다 빠르게 할 수 있으며, SmartSplash 를 이용한 로딩 대기 표시를 할 수 있다.(MainForm 의 UI 랜더링은 빠르게 되지만 상호작용은 Blocking 되어 있어 실제 로딩까지는 기다려야 함) 3. 각 폼의 물리적으로 분리되어 있기 때문에 Form 디자인 작업이 SmartForm-SmartInnerForm 조합에 비해 편하다. |
1. 물리적인 1 개의 폼이기 때문에 컨트롤 객체 접근 및 데이터 공유가 SmartForm-SmartForm 조합에 비해 편하다. 2. 화면이 전환되는 속도가 SmartForm-SmartForm 조합보다 빠르다. |
1. 물리적인 폼의 개수가 여러 개이기 때문에 컨트롤 객체 접근 및 데이터 공유가 SmartForm-SmartInnerForm 조합에 비해 불편하다. 2. 화면이 전환되는 속도가 SmartForm-SmartInnerForm 조합에 비해 느리다. |
1. 각 폼이 하나의 물리적인 폼에 구성 되어 있어 Visual Studio 의 디자인 모드에서 폼 갱신(Reload) 시간이 SmartForm-SmartForm 조합보다 길다. (SmartX와 상관없이 Visual Studio에서 발생) 2. MainForm 의 로딩 속도가 SmartForm-SmartForm 조합에 비해 느리다. |
2. SmartX 에서의 MDI 구현 방법
이 항목에서는 공통 영역이 있는 MDI 구성 조합을 구현하는 방법을 설명합니다. 프로젝트를 생성하는 방법이나 개발환경 설정에 대한 자세한 내용은 SmartX Framework 홈페이지(smartx.co.kr)의 "Developer Guide → Part 2. 프로젝트 생성" 항목을 참고하시기 바랍니다.
2-1. SmartForm-SmartInnerForm MDI 구성 조합으로 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] 초기 설정 코드 작성하기
MainForm 의 Form_Load 이벤트에서 MDI 관련 설정을 작성합니다.
MainForm.cs
private ChildForm1 childForm1;
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);
// 자식폼의 출현 위치를 설정합니다.
smartForm1.ChildFormLocation(0, 50);
// MailForm을 출력합니다.
// 반드시 Form.Load 이벤트에서 SmartForm.Show 메소드를 호출하여 최초에 표시되는 폼을 설정해야 합니다.
smartForm1.Show(0);
[STEP-6] 화면 전환 코드 작성하기
화면 전환을 수행할 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
{
화면이 전환되면서 발생하는 겹침(Overlap) 현상을 해결하기 위한 처리로 인해 공통영역에서 사용되는 UI Control 이 깜빡이는 현상이 발생합니다. 그렇기 때문에 공통영역에 사용되는 비슷한 형태의 사용자 인터페이스 컨트롤의 OverlapOptimize 속성을 폼 디자이너의 속성창에서 false 로 변경하여 사용하시는 것을 권장합니다.
2-2. SmartForm-SamrtInnerForm MDI 구성 조합으로 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] 초기 설정 코드 작성하기
MainForm의 Form_Load 이벤트에서 MDI 관련 설정을 작성합니다.
MainForm.cs
{
// MainForm 설정을 생략하면 예외가 발생하므로 반드시 부모폼을 설정해야 합니다.
smartForm1.MainForm = this;
// 자식폼을 등록합니다.
// 부모폼의 인덱스는 0번이고 자식폼의 인덱스는 AddChildForm 메소드로 추가한 순서대로 부여됩니다.
smartForm1.AddChildForm(childForm1);
smartForm1.AddChildForm(childForm2);
smartForm1.AddChildForm(childForm3);
// 자식폼의 출현 위치를 설정합니다.
smartForm1.ChildFormLocation(0, 50);
// MailForm을 출력합니다.
// 반드시 Form.Load 이벤트에서 SmartForm.Show 메소드를 호출하여 최초에 표시되는
// 폼을 설정해야 합니다.
smartForm1.Show(0);
[STEP-6] 화면 전환 코드 작성하기
화면전환을 수행할 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);
화면이 전환되면서 발생하는 겹침(Overlap) 현상을 해결하기 위한 처리로 인해 공통영역에서 사용되는 UI Control 이 깜빡이는 현상이 발생합니다. 그렇기 때문에 공통영역에 사용되는 비슷한 형태의 사용자 인터페이 스 컨트롤의 OverlapOptimize 속성을 폼 디자이너의 속성창에서 false 로 변경하여 사용하시는 것을 권장합니다.
3. SmartX 에서의 다이얼로그(Dialog) 사용 방법
이 항목에서는 몇 가지 경우에 대한 다이얼로그의 사용방법을 설명합니다. 다이얼로그에 대한 자세한 내용은 SmartX Framework 홈페이지(smartx.co.kr)의 "Reference Guide → Part 2. 사용자 인터페이스(UI) 컴포넌트 → 1. 사용자 인터페이스 (UI) 공통사항 및 장점 → 1) SmartX 에서의 MDI 구성 및 조합 별 주요 특징 → 1-3) 다이얼로그(Dialog) 창 출력 방법" 항목을 참고하시기 바랍니다.
• 화면 중앙에 출력할 경우
- SmartForm, SmartInnerForm의 CenterLocation 속성을 True로 설정합니다.
(* SmartForm.ShowDialogInnerForm 메소드로 화면 중앙에 출력하고자 한다면 CenterLocation 속성을 true로 설정하고 LCDSize 속성을 CUSTOMIZING으로 설정해야 합니다.)
• 사용자 지정 위치에 출력할 경우
- SmartForm.ShowDialog 및 SmartForm.ShowDialog_NoneBlocking 메소드의 인자로 원하는 위치의 값을 설정합니다.
- SmartForm.ShowDialogInnerForm 메소드를 사용한다면 메소드를 호출한 후에 SmartInnerForm 의 Location 속성을 원하는 위치의 값으로 설정합니다.
(EX : smartInnerForm1.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처럼 작업상태를 나타내는 다이얼로그를 구현할 수 있습니다.