winform应用【MDI、SDI】、创建资源管理器案例

一、创建MDI应用
MDI:Multiple Document Interface
就是有一个主窗体和N个子窗体
主窗体:
1.设置IsMdiContainer属性为True
2.使用ActiveMdiChild获取当前活动的子窗体
3.使用MdiChildren获取所有的子窗体
4.使用LayoutMdi改变子窗体布局
子窗体:
1.设置MdiParent属性为主窗体
2.使用MdiParent获取主窗体

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 MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }
        /// <summary>
        /// 创建子窗体
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void newToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ChildForm childForm = new ChildForm();
            childForm.MdiParent = this;
            childForm.Show();
        }
    }
}

二、Mdi应用(窗体布局)

三、双击菜单项(Cascade、The Horizontally、The Vertically),写入单击事件:
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 MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }
        /// <summary>
        /// 创建子窗体
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void newToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ChildForm childForm = new ChildForm();
            childForm.MdiParent = this;
            childForm.Show();
        }
        /// <summary>
        /// 层叠布局
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void cascadeToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.LayoutMdi(MdiLayout.Cascade);
        }
        /// <summary>
        /// 横向布局            
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void theHorizontallyToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.LayoutMdi(MdiLayout.TileHorizontal);
        }
        /// <summary>
        /// 竖向布局
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void theVerticallyToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.LayoutMdi(MdiLayout.TileVertical);
        }
    }
}

三、Mdi应用(编辑菜单)

三、双击菜单项,完成菜单项的单击事件:
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 MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }
        /// <summary>
        /// 创建子窗体
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void newToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ChildForm childForm = new ChildForm();
            childForm.MdiParent = this;
            childForm.Show();
        }
        /// <summary>
        /// 层叠布局
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void cascadeToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.LayoutMdi(MdiLayout.Cascade);
        }
        /// <summary>
        /// 横向布局            
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void theHorizontallyToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.LayoutMdi(MdiLayout.TileHorizontal);
        }
        /// <summary>
        /// 竖向布局
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void theVerticallyToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.LayoutMdi(MdiLayout.TileVertical);
        }
        /// <summary>
        /// 上一步
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void undoToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (this.ActiveMdiChild != null)
            {
                var childForm = (ChildForm)this.ActiveMdiChild;
                childForm.richTextBox1.Undo();
            }
        }
        /// <summary>
        /// 下一步
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void redoToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (this.ActiveMdiChild != null)
            {
                var childForm = (ChildForm)this.ActiveMdiChild;
                childForm.richTextBox1.Redo();
            }
        }
        /// <summary>
        /// 剪切
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void cutToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (this.ActiveMdiChild != null)
            {
                var childForm = (ChildForm)this.ActiveMdiChild;
                childForm.richTextBox1.Cut();
            }
        }
        /// <summary>
        /// 复制
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void copyToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (this.ActiveMdiChild != null)
            {
                var childForm = (ChildForm)this.ActiveMdiChild;
                childForm.richTextBox1.Copy();
            }
        }
        /// <summary>
        /// 粘贴
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void pasteToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (this.ActiveMdiChild != null)
            {
                var childForm = (ChildForm)this.ActiveMdiChild;
                childForm.richTextBox1.Paste();
            }
        }
    }
}
四、Mdi应用(文件管理菜单)

二、双击每一菜单项,写入单击事件代码:
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 MainForm : Form
    {
        int Count = 0;//记录子窗体的数量
        Dictionary<string, string> FilePathDic = new Dictionary<string, string>();//记录窗体的保存路径
        public MainForm()
        {
            InitializeComponent();
        }
        /// <summary>
        /// 创建子窗体
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void newToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ChildForm childForm = new ChildForm();
            childForm.MdiParent = this;
            childForm.Text = "子窗体" + (++Count);
            childForm.Show();
        }
        /// <summary>
        /// 层叠布局
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void cascadeToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.LayoutMdi(MdiLayout.Cascade);
        }
        /// <summary>
        /// 横向布局            
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void theHorizontallyToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.LayoutMdi(MdiLayout.TileHorizontal);
        }
        /// <summary>
        /// 竖向布局
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void theVerticallyToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.LayoutMdi(MdiLayout.TileVertical);
        }
        /// <summary>
        /// 上一步
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void undoToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (this.ActiveMdiChild != null)
            {
                var childForm = (ChildForm)this.ActiveMdiChild;
                childForm.richTextBox1.Undo();
            }
        }
        /// <summary>
        /// 下一步
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void redoToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (this.ActiveMdiChild != null)
            {
                var childForm = (ChildForm)this.ActiveMdiChild;
                childForm.richTextBox1.Redo();
            }
        }
        /// <summary>
        /// 剪切
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void cutToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (this.ActiveMdiChild != null)
            {
                var childForm = (ChildForm)this.ActiveMdiChild;
                childForm.richTextBox1.Cut();
            }
        }
        /// <summary>
        /// 复制
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void copyToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (this.ActiveMdiChild != null)
            {
                var childForm = (ChildForm)this.ActiveMdiChild;
                childForm.richTextBox1.Copy();
            }
        }
        /// <summary>
        /// 粘贴
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void pasteToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (this.ActiveMdiChild != null)
            {
                var childForm = (ChildForm)this.ActiveMdiChild;
                childForm.richTextBox1.Paste();
            }
        }
        /// <summary>
        /// 全选
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void selectAllToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (this.ActiveMdiChild != null)
            {
                var childForm = (ChildForm)this.ActiveMdiChild;
                childForm.richTextBox1.SelectAll();
            }
        }
        /// <summary>
        /// 保存
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void saveToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (this.ActiveMdiChild != null)
            {
                var childForm = (ChildForm)this.ActiveMdiChild;
                string title = childForm.Text;
                string path = string.Empty;
                //判断是否已经保存过
                if (FilePathDic.ContainsKey(title))
                {
                    path = FilePathDic[title];
                }
                if (string.IsNullOrEmpty(path))
                {
                    path = GetSavePath();
                }
                if (!string.IsNullOrEmpty(path))
                {
                    childForm.richTextBox1.SaveFile(path);
                    FilePathDic[title] = path;
                }

            }
        }
        /// <summary>
        /// 另存为
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void saveAsToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (this.ActiveMdiChild != null)
            {
                var childForm = (ChildForm)this.ActiveMdiChild;
                string title = childForm.Text;
                string path = GetSavePath();
                if (!string.IsNullOrEmpty(path))
                {
                    childForm.richTextBox1.SaveFile(path);
                    FilePathDic[title] = path;
                }

            }
        }
        /// <summary>
        /// 获取保存路径
        /// </summary>
        /// <returns></returns>
        private string GetSavePath()
        {
            string path = string.Empty;
            var dialog = new SaveFileDialog();
            dialog.Filter = "|*.rtf";
            dialog.AddExtension = true;
            var result = dialog.ShowDialog();
            if (result == DialogResult.OK)
            {
                path = dialog.FileName;
            }
            return path;
        }
        /// <summary>
        /// 关闭当前页面
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void toolStripMenuItem1_Click(object sender, EventArgs e)
        {
            if (this.ActiveMdiChild != null)
            {
                var childForm = (ChildForm)this.ActiveMdiChild;
                childForm.Close();
            }
        }
        /// <summary>
        /// 关闭主窗体
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void exitToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.Close();
        }
        /// <summary>
        /// 打开
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void openToolStripMenuItem_Click(object sender, EventArgs e)
        {
            var dialog = new OpenFileDialog();
            dialog.Filter = "|*.rtf";
            if (dialog.ShowDialog() == DialogResult.OK)
            {
                var title = "子窗体" + (++Count);
                ChildForm childForm = new ChildForm();
                childForm.Text = title;
                childForm.MdiParent = this;
                childForm.richTextBox1.LoadFile(dialog.FileName);
                FilePathDic.Add(title, dialog.FileName);
                childForm.Show();
            }
        }


    }
}
五、Mdi应用(工具条)

一、SDI应用
一、新建一个解决方案,将menustrip和toolstrip拖入主窗体:

二、在SdiForm.cs里面写入如下代码:
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 Sdi
{
    public partial class SdiForm : Form
    {
        public SdiForm()
        {
            InitializeComponent();
        }
        public static int Count = 0;//记录窗体数量
        /// <summary>
        /// 创建窗体
        /// </summary>
        public static SdiForm CreateForm()
        {
            SdiForm form = new SdiForm();
            form.Text = "窗体" + (++Count);
            //当前窗体设置为主窗体,及活动窗体
            SdiApplication.Instance.ApplicationContext.MainForm = form;
            form.Show();
            return form;
        }
    }
}

四、添加类SdiApplication.cs,并在里面写入如下代码:
using Microsoft.VisualBasic.ApplicationServices;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Sdi
{
    public class SdiApplication : WindowsFormsApplicationBase
    {
        private static SdiApplication _instance = null;

        public static SdiApplication Instance
        {
            get
            {
                if (_instance == null)
                {
                    _instance = new SdiApplication();
                }
                return _instance;
            }
        }
        public SdiApplication()
        {
            this.IsSingleInstance = true;//单一进程,及无论开多少窗体,都只有一个进程
            this.ShutdownStyle = ShutdownMode.AfterAllFormsClose;//关闭所有窗体后,关闭进程
        }
        protected override void OnStartupNextInstance(StartupNextInstanceEventArgs eventArgs)
        {
            SdiForm.CreateForm();
        }
        protected override void OnCreateMainForm()
        {
            SdiForm.CreateForm();
        }
    }
}
五、更改Program.cs文件:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Sdi
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            SdiApplication.Instance.Run(args);
        }
    }
}

三、创建资源管理器案例

十、主窗体的Load事件加入如下代码:
/// <summary>
        /// 加载数据
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Explorer_Load(object sender, EventArgs e)
        {
            //设置ListView显示模式为默认时的列
            this.listView1.Columns.Add("名称", 300);
            this.listView1.Columns.Add("修改时间",200);
            this.listView1.Columns.Add("大小",100);
            this.toolStripComboBox1.SelectedIndex = 0;//设置工具条上的ComboBox的默认选择
            TreeNode root = new TreeNode("我的文档");
            root.Tag = System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);//我的文档路径
            AddNodes(root);//递归获取节点
            this.treeView1.Nodes.Add(root);//将节点加载到树上
            root.Expand();//展开根节点
        }
        /// <summary>
        /// 获取子节点
        /// </summary>
        /// <param name="node"></param>
        private void AddNodes(TreeNode node)
        {
            var dir = new System.IO.DirectoryInfo(node.Tag.ToString());

            foreach (var childDir in dir.GetDirectories())
            {
                //判断是否有权限访问
                if (childDir.Attributes.HasFlag(FileAttributes.Hidden))
                {
                    continue;
                }
                TreeNode childNode = new TreeNode(childDir.Name);
                childNode.Tag = childDir.FullName;
                AddNodes(childNode);
                node.Nodes.Add(childNode);

            }

        }
十一、Combox的SelectedIndexChanged事件加入如下代码:
/// <summary>
        /// 更改ListView显示方式
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void toolStripComboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            var text = this.toolStripComboBox1.Text;
            switch (text)
            { 
                case "大图标":
                    this.listView1.View = View.LargeIcon;
                    break;
                case "小图标":
                    this.listView1.View = View.SmallIcon;
                    break;
                case "默认":
                    this.listView1.View = View.Details;
                    break;
            }
        }
十二、TreeView的AfterSelect事件加入如下代码:
/// <summary>
        /// 选中后的事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
        {
            var dir = new DirectoryInfo(e.Node.Tag.ToString());
            this.listView1.Items.Clear();//清除listview的数据
            foreach (var file in dir.GetFiles())//遍历目录
            {
                ListViewItem item = new ListViewItem(file.Name);
                var lastWrite = file.LastWriteTime;
                //添加更新时间
                item.SubItems.Add(lastWrite.ToShortDateString() + " " + lastWrite.ToShortTimeString());
                //添加文件大小
                item.SubItems.Add(Math.Ceiling(file.Length / 1024.0) + " KB");
                //查看是否已经保存过该类型图片,如果没有,保存
                if (!(this.bigImgList.Images.ContainsKey(file.Extension)))
                {
                    var thisIcon = Icon.ExtractAssociatedIcon(file.FullName);
                    this.smallImgList.Images.Add(file.Extension, thisIcon);
                    this.bigImgList.Images.Add(file.Extension, thisIcon);
                }

                item.ImageKey = file.Extension;
                this.listView1.Items.Add(item);
            }
        }

来源:https://www.cnblogs.com/animal/p/3505797.html

 

posted @ 2023-11-01 10:50  【君莫笑】  阅读(278)  评论(0编辑  收藏  举报