728x90

1개의 폼안에 다수의 자식폼을 포함하는 형태의 프로그램들이 실생활에서 사용되고 있다.


1. 부모폼을 만드는 방법

    부모폼으로 만들고자 하는 Form 에서 아래 그림과 같이 설정해준다.



설정을 하고 나면 폼의 형태가 아래처럼 바뀐다.



2. 자식폼을 호출하는 방법

네이버, 구글링을 해보면 대부분 나오는 내용은

Form2 f2 = new Form2();
f2.MdiParent = this;  // 현재 폼의 자식폼임을 알림
f2.Show();

이다.

이 코드는 폼을 호출할 때마다 새로운 폼이 생성되기 때문에 실제 코드에서는 사용하는데 애로사항이 생긴다.


현재 폼이 열려있는지 체크하는 기능을 추가해야 한다.

부모폼의 ActiveMdiChild 속성을 이용하여 닫아주면 된다. ActiveMdiChild.Close();

자식폼 Form1 과 자식폼 Form2 를 생성하여 구별할 수 있게 만들었다.


 

부모폼에서 자식폼을 띄우는 소스코드


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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace MDI
{
    public partial class Main : Form
    {
        private Form1 mChildForm1 = null;
        private Form2 mChildForm2 = null;
 
        public Main()
        {
            InitializeComponent();
        }
 
        private Form ShowOrActiveForm(Form form, Type t)
        {
            if (form == null)
            {
                form = (Form)Activator.CreateInstance(t);
                form.MdiParent = this;
                form.WindowState = FormWindowState.Maximized;
                form.Show();
            }
            else
            {
                if (form.IsDisposed)
                {
                    form = (Form)Activator.CreateInstance(t);
                    form.MdiParent = this;
                    form.WindowState = FormWindowState.Maximized;
                    form.Show();
                }
                else
                {
                    form.Activate();
                }
            }
            return form;
        }
 
        private void miForm1_Click(object sender, EventArgs e)
        {
            if (ActiveMdiChild != null)  // 자식폼이 열려 있으면
            {
                if(this.ActiveMdiChild != mChildForm1)  // 열려있는 자식폼이 Form1 이 아니면
                {
                    ActiveMdiChild.Close(); // 현재 활성화된 창을 닫아라
                }
                mChildForm1 = ShowOrActiveForm(mChildForm1, typeof(Form1)) as Form1;
            } else
            {
                mChildForm1 = ShowOrActiveForm(mChildForm1, typeof(Form1)) as Form1;
            }                 
        }
 
        private void miForm2_Click(object sender, EventArgs e)
        {            
            if (ActiveMdiChild != null)  // 자식폼이 열려 있으면
            {
                if (this.ActiveMdiChild != mChildForm2)  // 열려있는 자식폼이 Form2 가 아니면
                {
                    ActiveMdiChild.Close(); // 현재 활성화된 창을 닫아라
                }
                mChildForm2 = ShowOrActiveForm(mChildForm2, typeof(Form2)) as Form2;
            }
            else
            {
                mChildForm2 = ShowOrActiveForm(mChildForm2, typeof(Form2)) as Form2;
            }
        }
 
        private void miExit_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
 
        }
 
    }
}
 
 
cs


위 코드를 직접 다운로드 받아서 실행해볼 수 있는 파일


MDI.zip

구글링해서 찾은 소스를 약간 수정 보완해서 부모폼에서 자식폼이 1개만 실행되도록 수정했다.

if 문을 없애면 Form1, Form2 각각 둘다 실행된다.

폭풍 검색으로 구글링해서 찾아낸 가장 쓸만한 코드인거 같다. 좀더 실력이 쌓이면 더 좋게 만들날이 오겠지만~


원코드 출처 : http://www.codeproject.com/Tips/257281/Single-Instance-Form-in-a-MDI-application


참고 : http://colorscripter.com/ 는 소스코드를 보기 좋게 정렬해주는 사이트인데 저질 기억이라 이걸 찾는데 애를 먹어 아예 기록을 해둔다.


블로그 이미지

Link2Me

,