폼을 디자인 하던 중 현재 폼에서 다음 폼으로 넘어가는 동작을 구현해 보고 싶어져서 시도해 봤었다.


단순히 새로운 폼을 띄우는 방법은 간단하다. 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를 보여주게 된다.

반응형

+ Recent posts