LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

C# 使用 WinForm MDI 模式管理多个子窗体

admin
2026年1月1日 23:11 本文热度 404

前言

WinForm中的MDI(Multiple Document Interface)模式允许设计能容纳多个子窗口的父窗口应用程序。通过设置窗体属性和编写特定代码,在Visual Studio环境里可以创建MDI父窗体和子窗体,并实现它们的打开、关闭和切换等功能。 WinForm MDI 模式就像是有超能力一般,让多个子窗体井然有序地排列在一个主窗体之下,既美观又实用。不过,也要小心管理好子窗体们的生命周期哦,否则一不小心就会出现一些意想不到的小bug。
正文:

1. MDI模式介绍

多文档界面(MDI)是Windows应用程序中的一种用户界面设计模式,允许在一个父窗体内部打开和管理多个子窗体。这种模式特别适合需要同时查看和操作多个文档的软件,比如文本编辑器、绘图程序和报表查看器等。

在C#中,通过继承 Form 类并设置其 IsMdiContainer 属性为 true 来创建MDI父窗体。对于MDI子窗体,需要将它们的 MdiParent 属性设置为父窗体实例。设置好以后,可以在父窗体内以编程方式打开多个子窗体,实现MDI应用程序的基本结构。

2. 创建MDI父窗体

在Visual Studio中,可以通过添加 Form 控件并设置其 MDIChildren 属性为 true 来创建MDI父窗体。
this.IsMdiContainer = true;
也可在窗体属性里面直接设置

3. 创建MDI子窗体

核心属性:

MdiParent :指定MDI子窗体的父窗体,它是实现多文档界面的必要条件。

Text :定义子窗体的标题,通常用于显示文档名称或状态。

IsMdiChild :一个布尔属性,用于标识窗体是否为MDI子窗体。

ActiveMdiChild :返回当前活动的MDI子窗体,这是管理活动窗体的便捷方式。

核心方法:

Show() :显示窗体。
Hide() :隐藏窗体。
Close() :关闭窗体。
Activate() :激活窗体,使其成为活动窗体。

接下来的将进一步探讨如何在MDI父窗体中加载子窗体,管理子窗体实例,以及如何在MDI应用程序中切换和排列子窗体。

创建一个上面的窗体,然后把IsMdiContainer设置为True,作为父窗体;

public frm_Main(){    InitializeComponent();    this.Text = Application.ProductName;    this.Top = 0;    this.Left = 0;    this.Width = Screen.PrimaryScreen.WorkingArea.Width;    this.Height = Screen.PrimaryScreen.WorkingArea.Height;    //this.device_corp.Text = Application.ProductName;    this.device_corp.Text = "XXXX集团液冷板设备";}

下面开始创建子窗体,五个子窗体,

public Form_Inouts mFormInouts;public Form_Running mFormRunning;public Form_Config mFormConfig;public Form_Manual mFormManual;public Form_User mFormUser;


下面看一下用代码怎么调用实现的;

public partial class frm_Main : Form{
    public Form_Inouts mFormInouts;    public Form_Running mFormRunning;    public Form_Config mFormConfig;    public Form_Manual mFormManual;    public Form_User mFormUser;    public frm_Main()    {        InitializeComponent();        this.Text = Application.ProductName;        this.Top = 0;        this.Left = 0;        this.Width = Screen.PrimaryScreen.WorkingArea.Width;        this.Height = Screen.PrimaryScreen.WorkingArea.Height;        //this.device_corp.Text = Application.ProductName;        this.device_corp.Text = "XXXX集团液冷板设备";    }private Form LoadMdiChild(Type formclass){    Form nForm = null;    foreach (Form frm in this.MdiChildren)    {        if (frm.GetType() == formclass)        {            nForm = frm;            break;        }    }    if (nForm == null)    {        nForm = (Form)(Activator.CreateInstance(formclass));        //nForm.Owner = this;        nForm.MdiParent = this;        nForm.Left = 0;        nForm.Top = 0;        nForm.Dock = System.Windows.Forms.DockStyle.Fill;        nForm.FormBorderStyle = FormBorderStyle.None;        nForm.MaximizeBox = false;        nForm.MinimizeBox = false;        nForm.ControlBox = false;    }    return nForm;}
private void ShowMdiChild(Form formobject){    if (this.ActiveMdiChild == formobject) return;    if (DoCheckActiveForm())    {        formobject.Show();        formobject.MdiParent = this;        formobject.BringToFront();        formobject.Activate();    }}public bool DoCheckActiveForm(){    //if (this.ActiveMdiChild is Form_Config)    //{    //    return mFormConfig.DoEventLeave();    //}    return true;}          private void button_Home_Click(object sender, EventArgs e)    {        if (mFormRunning == null) mFormRunning = (Form_Running)LoadMdiChild(typeof(Form_Running));        ShowMdiChild(mFormRunning);        label_Caption.Text = "操作页面";    }
    private void button_manual_Click(object sender, EventArgs e)    {        if (mFormManual == null) mFormManual = (Form_Manual)LoadMdiChild(typeof(Form_Manual));        ShowMdiChild(mFormManual);        label_Caption.Text = "手动页面";    }
    private void button_config_Click(object sender, EventArgs e)    {        if (mFormConfig == null) mFormConfig = (Form_Config)LoadMdiChild(typeof(Form_Config));        ShowMdiChild(mFormConfig);        label_Caption.Text = "参数设置";    }
    private void button_inout_Click(object sender, EventArgs e)    {        if (mFormInouts == null) mFormInouts = (Form_Inouts)LoadMdiChild(typeof(Form_Inouts));        ShowMdiChild(mFormInouts);        label_Caption.Text = "输入输出页面";    }
    private void button_close_Click(object sender, EventArgs e)    {        //Form_Main_FormClosing(null, null);        this.Close();    }
    private void button_about_Click(object sender, EventArgs e)    {        Form FAbout = new AboutBox1();        FAbout.ShowDialog();    }
    private void frm_Main_Load(object sender, EventArgs e)    {        if (mFormRunning == null) mFormRunning = (Form_Running)LoadMdiChild(typeof(Form_Running));        ShowMdiChild(mFormRunning);        label_Caption.Text = "操作页面";    }}  }      
运行效果:

总结:

WinForm MDI 模式就像是窗体管理大师,让多个子窗体井然有序地排列在一个主窗体之下,既美观又实用,减少了视野中的混乱,在这个统一的界面里,用户就能轻松上手,享受程序带来的便利,各个小窗体还有机会共享主窗体的资源,真是功能强大。


阅读原文:原文链接


该文章在 2026/1/4 10:29:20 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2026 ClickSun All Rights Reserved