폼을 디자인 하던 중 현재 폼에서 다음 폼으로 넘어가는 동작을 구현해 보고 싶어져서 시도해 봤었다.
단순히 새로운 폼을 띄우는 방법은 간단하다. Form2라는 폼을 불러오고 싶으면 아래와 같이 해주면 된다.
1 2 3 | Form2 showForm = new Form2(); showForm.Show(); | cs |
하지만 다음 폼을 띄워도 이전 폼이 남아있으면 다음으로 넘어간 느낌이 들지 않을테니 이전 폼을 꺼주는 동작을 추가해줘야 한다. 이를 위해 처음 사용해 본 방법은 Visible 속성을 이용한 방법이었다.
Visible 이용.
Visible 속성은 해당 컨트롤과 그 자식 컨트롤들을 표시해줄지를 설정하는 속성이다. 기본값은 true로 되어 있다.
말하자면 현재 켜져있는 폼의 Visible 속성을 false로 줌으로써 화면상에 표시되지 않도록 하고 다음 폼을 불러오는 것이다.
1 2 3 4 5 | this.Visible = false; Form3 showForm = new Form3(); showForm.Show(); | cs |
이렇게 하면 별 문제 없이 다음 폼으로 넘어가는 동작을 만들 수 있다.
여기서 이전 폼으로 다시 돌아가는 동작을 하려면 두 폼간에 데이터 교환이 가능하거나 둘의 관계가 Owner 관계가 되어있으면 된다.
1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 | Form1.cs Form2 frm = new Form2(); private void Next_button_Click(object sender, EventArgs e) { this.Visible = false; frm.Owner = this; frm.Show(); } Form2.cs private void Back_button_Click(object sender, EventArgs e) { this.Visible = false; Owner.Show(); } | cs |
위와 같이 Form1에서 Form2 인스턴스를 생성시켜줄 때 Form2의 Owner 속성을 현재 폼을 가리키는 this로 주면 Form1에서 Form2를 소유하는 관계로 만들어진다. 그렇게 되면 Form2에서 이전 폼으로 돌아가는 동작을 할 때 자신의 Owner을 Show 시켜주는 것으로 간단히 이전 폼을 나타나게 할 수 있다.
Hide 이용.
같은 효과를 Hide 메소드를 이용해서도 줄 수 있다.
this.Visible = false부분만 아래와 같이 Hide로 바꿔주면 된다.
1 2 | //this.Visible = false; this.Hide(); | cs |
폼 종료 후 다음 폼 열기.
위 방법들을 사용해보다가 이번엔 이전의 폼은 종료시키고 다음 폼으로 넘어가버리는 동작을 구현해 보았다.
1 2 3 | Form2 frm = new Form2(); frm.Show(); this.Close(); | cs |
Close로 Form1을 종료시키고 Form2로 넘어가는 동작이다. 하지만 이렇게만 해주면 Form1이 종료되면서 생성된 Form2도 함께 종료될 것이다. 그 이유는 Program.cs를 보면 조금 이해가 쉽다.
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.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApplication1 { static class Program { /// <summary> /// 해당 응용 프로그램의 주 진입점입니다. /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } } } | cs |
위 코드가 Program.cs의 내용이다. 위의 Main()을 보면 Application.Run(new Form1()); 라는 부분이 있다.
Form1을 메모리에 할당하여 윈도우 메시지 루프를 실행시켜주는 것이라 볼 수 있는데, 이 때 메모리에 할당된 Form1이 부모스레드로서 동작하고 Form2 등을 자식 스레드를 만들어 해결하고 있는 것이기에 Close로 Form1이 종료되면 생성되었던 Form2도 종료되어 버리는 것이다.
Form1이 할당된 메모리가 종료될 때 자동으로 Form2를 메모리에 할당시켜 주도록 하면 처음 폼이 꺼지면서 다음 폼을 켜주는 동작을 구현할 수 있다. 위의 Main()에 아래와같이 추가해주면 된다.
1 2 3 4 5 6 7 | static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); Application.Run(new Form2()); } | cs |
이렇게 하면 별도로 Form1에서 Form2를 만들어 보여주는 동작을 하지 않아도 Form1이 Close되면 순차적으로 다음 코드Application.Run(new Form2()); 가 실행되며 Form2를 보여주게 된다.
'IT > 윈도우 폼' 카테고리의 다른 글
[VS 2013] Timer를 이용한 실시간 시간 출력 (0) | 2018.05.17 |
---|---|
[VS 2013] DateTimePicker로 시간 선택 및 표시 (0) | 2018.05.17 |
[VS 2013] 모달과 모달리스 (0) | 2018.01.30 |
[VS 2013] 그룹박스 내의 컨트롤 접근 (0) | 2017.08.02 |
[VS 2013] 윈폼 애플리케이션 (0) | 2017.07.24 |