EMDI는 지금도 개발중

C# : MDIControl TabControl안에 자식 프레임 MDIForm 넣기 본문

언어/C#

C# : MDIControl TabControl안에 자식 프레임 MDIForm 넣기

EMDI 2021. 3. 26. 08:56

이번 글에서는 메인프레임 안에 여러 개의 자식프레임을 가질 수 있게 MDI형태를 만들어 보도록 하겠습니다. 단, MDI는 TabControl로 구성할 것이며, 자식프레임은 TabPage별로 개별화면을 생성하도록 하겠습니다.

* MDI(Multiple Document Interface) : MDI는 메인프레임에 여러 개의 자식프레임(도큐먼트)를 가지고 있는 형태를 말합니다. 


1. 새로운 프로젝트 생성 : TestProject라는 이름의 프로젝트를 생성하였습니다.

2. 메인폼 디자인 변경 및 메뉴추가 : 초기 화면크기로는 화면을 비교하기에 너무 작은 것 같아 화면크기를 조금 키웠습니다. 그리고 MDIForm들이 잘 들어갔는지 비교하기 위해 메뉴바(MneuStrip)도 추가로 넣었습니다.

3. MDIControl, MDIForm 생성 : TabControl로 사용할 MDIControl와 TabPage로 사용할 MDIForm을 생성합니다.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace TestProject
{
    public partial class MDIControl : TabControl
    {
        public MDIControl()
        {

        }
    }
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace TestProject
{
    public partial class MDIForm : TabPage
    {
        public MDIForm()
        {

        }

    }
}
더보기

class 파생클래스이름 : 접근제어지시자 기초클래스이름[, 접근제어지시자 기초클래스이름, ...]{}

MDIControl은 앞서 말씀드린 것과 같이 TabControl, MDIForm은 TabPage의 파생클래스가 됩니다.

4. MainForm에 MDIControl 추가 : 메인폼 안에 자식폼들을 띄우려면 MDIControl이 밑바탕에 깔려져있어야 합니다. MainForm 디자인에 들어가서 TestProject 구성요소에 있는 MDIControl을 추가해주세요. 추가하시면 MDIControl는 TabControl을 파생하는 클래스이기에 화면과 같이 TabControl이 생기는 것을 확인할 수 있습니다. TabPage1, TabPage2는 TabControl을 추가하면 default로 나오는 페이지이기에 없애도록 하겠습니다. TabPage 제거는 디자인의 TabPages의 (컬렉션)에서 제거하실 수 있습니다.

5. 자식폼(SiteForm, DownLoadForm) 생성 : 앞서 만들었던 MneuStrip의 메뉴를 클릭하면 해당 메뉴의 화면을 메인폼의 TabPage에 뿌려주도록 하겠습니다. 우선 자식폼으로 사용할 Form들을 생성합니다.

// 자식폼이 TabPage와 어울릴 수 있도록 디자인 수정
1. FormBorderStyle을 None으로 설정
2. MaximizeBox, MinmizeBox False로 설정
3. ShowIcon, ShowInTaskbar False로 설정

 

저는 자식폼으로 DownLoadForm과 SiteForm을 생성해보았습니다. 그리고 각각의 자식폼을 구분하기 위해 Label을 하나씩 붙였습니다.

6. MDIControl(TabControl)의 MDIForm(TabPage)에 자식폼(DownLoadForm, SiteForm) 추가 : MDIControl CS소스에서 MDIForm 생성자를 생성 후 그 안에 자식폼들을 Add시키는 메소드를 만듭니다.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace TestProject
{
    public partial class MDIControl : TabControl
    {
        public MDIControl()
        {

        }

        public int Add(Form sb)
        {
            if (sb == null)
                return -1;

            sb.TopLevel = false;

            MDIForm page = new MDIForm();
            page.Text = sb.Text + "        ";
            page.Controls.Clear();
            page.Controls.Add(sb);
            base.TabPages.Add(page);
            sb.Show();

            base.SelectedTab = page;

            return 0;
        }

    }
}

7. MainForm CS소스에 자식폼들 Add : 이제 메인폼 CS소스에 들어가서 MenuItem Click 이벤트 안에 각각 Add할 자식폼들을 연결시킵니다. 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace TestProject
{
    public partial class MainForm : Form
    {

        SiteForm sf = new SiteForm();
        DownLoadForm df = new DownLoadForm();

        public MainForm()
        {
            InitializeComponent();
        }

        private void MainForm_Load(object sender, EventArgs e)
        {

        }

        private void 사이트ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            // SiteForm을 호출할 예정

            mdiControl1.Add(sf);
        }

        private void 다운로드목록ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            // DownLoadForm을 호출할 예정
            mdiControl1.Add(df);
        }

    }
}

그럼 정상적으로 자식폼들이 TabControl에 추가되는 것을 확인할 수 있습니다!


이번 글을 TabControl, TabPage 파생클래스 MDIControl, MDIForm을 이용해서 Tab별로 자식폼이 생기는 것을 공부해보았습니다. 단, 해당 글은 MDI의 기초적인 부분만 다룬 것이라 자식폼에 대한 싱글톤이나 다른 추가적인 기능에 대해서는 다루지 않았으니 참고하여 주시기바랍니다.

Comments