일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- string
- c#
- google apps script
- Python
- array
- Google Excel
- gas
- PostgreSQL
- dataframe
- Google Spreadsheet
- Java
- PANDAS
- Redshift
- numpy
- Apache
- Tkinter
- Github
- math
- 파이썬
- GIT
- SQL
- Kotlin
- Excel
- list
- Mac
- django
- PySpark
- hive
- matplotlib
- Today
- Total
달나라 노트
C# : ShowDialog, Show (새로운 Window 띄우기) 본문
Form class는 어떠한 Window를 띄우기 위해 사용해왔습니다.
근데 어떤 버튼을 누르면 새로운 Window가 뜨게 하는 기능을 가진 프로그램도 있죠.
이번에는 이렇게 새로운 Window를 표시하는 방법을 보겠습니다.
아래 코드를 봅시다.
using System;
using System.Windows.Forms;
class MyProgram
{
public static void Main()
{
Form fm = new Form();
fm.Width = 500;
fm.Height = 300;
Button btn = new Button();
btn.Parent = fm;
btn.Text = "Button";
Form sub_fm = new Form();
sub_fm.Width = 400;
sub_fm.Height = 200;
Label lbl = new Label();
lbl.Parent = sub_fm;
lbl.Width = 100;
lbl.Height = 20;
lbl.Text = "New Window";
void btn_event_click(object sender, EventArgs e)
{
sub_fm.ShowDialog();
}
btn.Click += new EventHandler(btn_event_click);
Application.Run(fm);
}
}
위 코드를 실행하면 아래와 같은 화면이 뜹니다.
버튼을 누르면 아래와 같은 창이 하나 더 뜹니다.
창을 한번에 캡쳐해보면 아래와 같습니다.
2개의 창이 떠있죠.
위 코드를 부분별로 확인해봅시다.
Form fm = new Form();
fm.Width = 500;
fm.Height = 300;
Button btn = new Button();
btn.Parent = fm;
btn.Text = "Button";
먼저 버튼을 표시할 main form을 생성합니다.
그리고 Button class를 이용해 btn 객체를 생성합니다.
이 Button은 fm 객체에 표시될 것이므로 btn.Parent를 fm으로 정합니다.
Form sub_fm = new Form();
sub_fm.Width = 400;
sub_fm.Height = 200;
Label lbl = new Label();
lbl.Parent = sub_fm;
lbl.Width = 100;
lbl.Height = 20;
lbl.Text = "New Window";
이번에는 Window를 2개 띄울 것이므로 Form class를 한 번 더 이용해서 sub_fm 객체를 생성합니다.
sub_fm 객체는 btn이 클릭되면 나타날 Window 입니다.
그리고 lbl 객체를 생성합니다.
lbl객체는 sub_fm에 텍스트를 표시하기 위한 용도입니다.
따라서 lbl.Parent를 sub_fm으로 지정합니다.
void btn_event_click(object sender, EventArgs e)
{
sub_fm.ShowDialog();
}
btn.Click += new EventHandler(btn_event_click);
우리는 Button이 클릭되면 새로운 Window가 표시되게 할 것이므로 Button의 Click에 Event를 등록해야합니다.
위 내용을 보면 Event 발생 시 실행할 내용을 담은 btn_event_click method를 생성합니다.
btn_event_click method에는 sub_fm.ShowDialog()가 있습니다.
Form class에는 ShowDialog라는 method가 있는데 이 method는 Form을 실행시켜 Window를 띄워주는 역할을 합니다.
따라서 sub_fm.ShowDialog()는 sub_fm 객체를 실행해서 sub_fm의 내용이 담긴 Window를 띄우라는 의미입니다.
이렇게 생성된 btn_event_click method를 btn.Click에 EventHandler로 등록하여 버튼이 클릭될 때 실행되도록 합니다.
자 이렇게 창을 띄운 상태에서 한번 원래 Window를 클릭해봅시다.
그러면 경고음과 함께 원래 Window는 사용할 수 없는 상태란걸 깨달을 수 있습니다.
근데 만약 Sub Window가 떠있는 상태에서도 원래 Window를 사용하고싶으면 어떻게 해야할까요?
매우 간단합니다. Sub Window를 띄울 때 사용했던 ShowDialog method를 Show method로 바꾸면 됩니다.
아래 코드를 보시죠.
using System;
using System.Windows.Forms;
class MyProgram
{
public static void Main()
{
Form fm = new Form();
fm.Width = 500;
fm.Height = 300;
Button btn = new Button();
btn.Parent = fm;
btn.Text = "Button";
Form sub_fm = new Form();
sub_fm.Width = 400;
sub_fm.Height = 200;
Label lbl = new Label();
lbl.Parent = sub_fm;
lbl.Width = 100;
lbl.Height = 20;
lbl.Text = "New Window";
void btn_event_click(object sender, EventArgs e)
{
sub_fm.Show();
}
btn.Click += new EventHandler(btn_event_click);
Application.Run(fm);
}
}
위 코드를 실행해보면 이전에 봤던 예시와 정확히 동일한 Window가 뜹니다.
이렇게 버튼을 눌러 원래 Window와 Sub Window를 모두 띄워둔 상태로 원래 윈도우를 클릭해봅시다.
그러면 아무 경고음도 뜨지 않고 위 이미지처럼 원래 Window가 클릭되는 것을 알 수 있습니다.
여기까지 말한 것을 정리해보면 다음과 같습니다.
ShowDialog() --> 새로운 Window를 띄워주며 원래의 Window는 사용 불가능한 상태가 됨. (이런 상태를 Modal 이라고 합니다.)
Show() --> 새로운 Window를 띄워주며 원래의 Window도 사용 가능한 상태로 유지됨. (이런 상태를 Modaless라고 합니다.)
여기까지가 새로운 윈도우를 띄우는 ShowDialog, Show method의 사용법이었습니다.
위 예시에서 봤던 코드들은 단순히 ShowDialog, Show method의 사용법에 집중하기 위해 최대한 직관적이고 간단하게 코드를 구성했습니다.
하지만 실제 상황에서는 지금까지 봐온 예시처럼 코드를 쓰지 않습니다.
보통 Sub Window의 정보만을 담은 새로운 class를 구성하게됩니다.
아래 코드를 봅시다.
using System;
using System.Windows.Forms;
class MyProgram
{
public class SubForm
{
Form sub_fm = new Form();
public SubForm() //SubForm class의 생성자(Constructor)
{
sub_fm.Width = 400;
sub_fm.Height = 200;
Label lbl = new Label();
lbl.Parent = sub_fm;
lbl.Width = 100;
lbl.Height = 20;
lbl.Text = "New Window";
}
public void show_window()
{
sub_fm.ShowDialog();
}
}
public static void Main()
{
Form fm = new Form();
fm.Width = 500;
fm.Height = 300;
Button btn = new Button();
btn.Parent = fm;
btn.Text = "Button";
void btn_event_click(object sender, EventArgs e)
{
SubForm sf = new SubForm();
sf.show_window();
}
btn.Click += new EventHandler(btn_event_click);
Application.Run(fm);
}
}
위 코드는 이전에 봤던 예시와 완전히 동일한 기능을 가지고 있습니다.
class MyProgram
{
public class SubForm
{
Form sub_fm = new Form();
public SubForm() //SubForm class의 생성자(Constructor)
{
sub_fm.Width = 400;
sub_fm.Height = 200;
Label lbl = new Label();
lbl.Parent = sub_fm;
lbl.Width = 100;
lbl.Height = 20;
lbl.Text = "New Window";
}
public void show_window()
{
sub_fm.ShowDialog();
}
}
public static void Main()
{
...
}
}
한 가지 다른점은 위와 같습니다.
Main method 밖에 SubForm이라는 class를 생성했습니다.
SubForm class는 버튼이 클릭되었을 때 띄워줄 새로운 Window에 대한 정보만을 가지고 있습니다.
- Form sub_fm = new Form();
sub_fm 객체를 생성합니다. 이 객체는 새롭게 띄워질 Window에 대한 설정을 적용시킬 Form 객체입니다.
- public SubForm() //SubForm class의 생성자(Constructor)
class 이름과 동일하게 생성자를 만듭니다.
이 생성자는 sub_fm의 속성을 설정하는 내용을 담고 있습니다.
- public void show_window()
SubForm class 내부에 show_window() method를 생성합니다.
show_window() method의 내부를 보면 sub_fm.ShowDialog(); 라는 내용이 있습니다.
sub_fm 객체의 ShowDialog() method를 실행시켜 sub_fm을 새로운 Window로 띄우라는 기능을 담아둔 것입니다.
그리고 아래 Main method 속 Event 등록 부분을 봅시다.
void btn_event_click(object sender, EventArgs e)
{
SubForm sf = new SubForm();
sf.show_window();
}
btn.Click += new EventHandler(btn_event_click);
- SubForm sf = new SubForm();
이미 생성해둔 SubForm class를 이용해서 sf 객체를 생성합니다.
SubForm class가 호출될 때 SubForm class의 생성자도 실행되면서 SubForm의 기본 설정이 완료됩니다.
그리고 sf.show_window() method를 이용해서 SubForm을 새로운 window로 띄워줍니다.
여기서 중요한 것은 하나의 Window는 하나의 class에서 다룬다는 것입니다.
Main method에서는 가장 먼저 실행될 Main window에 관한 설정을 하고,
SubForm class에서는 새로 띄워질 Window에 대한 설정을 하는 것이죠.
아래처럼 MainForm class와 SubForm class를 아예 따로 생성해두고
Main method에서는 단순히 MainForm class 객체만 생성해서 App만 실행시키는 방식도 있습니다.
어떤 형태이건 기능단위로 class를 나눠서 관리하는 것이 장기적으로 봤을 때 좋다는 것을 알고 코드를 구성하면 좋습니다.
using System;
using System.Windows.Forms;
class MyProgram
{
public static void Main()
{
MainForm mf = new MainForm();
mf.run_app();
}
}
public class MainForm
{
Form main_fm = new Form();
Button btn = new Button();
public MainForm()
{
main_fm.Width = 500;
main_fm.Height = 300;
btn.Parent = main_fm;
btn.Text = "Button";
void btn_event_click(object sender, EventArgs e)
{
SubForm sf = new SubForm();
sf.show_window();
}
btn.Click += new EventHandler(btn_event_click);
}
public void run_app()
{
Application.Run(main_fm);
}
}
public class SubForm
{
Form sub_fm = new Form();
Label lbl = new Label();
public SubForm()
{
sub_fm.Width = 400;
sub_fm.Height = 200;
lbl.Parent = sub_fm;
lbl.Width = 100;
lbl.Height = 20;
lbl.Text = "New Window";
}
public void show_window()
{
sub_fm.ShowDialog();
}
}
'C# > C#' 카테고리의 다른 글
C# : PictureBox (사진 띄우기, 도형 그리기, PictureBox의 Invalidate) (0) | 2022.04.05 |
---|---|
C# : MessageBox (0) | 2022.04.04 |
C# : MenuStrip, ToolStripMenuItem (0) | 2022.04.04 |
C# : TextBox (0) | 2022.04.04 |
C# : ListBox, ComboBox (0) | 2022.04.04 |