CSharp菜单

0x01:历史信息的菜单栏
技术要点: 将菜单中最近打开文件的文件名和路径保存到事先建立的*.ini文件中,软件启动时读取*.ini文件中的数据建立数组菜单,即可实现显示历史菜单的功能。
   注意:首先添加一个MenuStrip菜单控件,将主窗体的IsMdiContainer属性设置为True

demo:
 private void 打开ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            openFileDialog1.FileName = "";//设定打开文件对话框的初始内容为空
            this.openFileDialog1.ShowDialog();//显示打开文件对话框
            StreamWriter streamWriter = new StreamWriter("Menu.ini", true);//写文件助手,参数1:path,参数2:bool append[true 追加,false 覆盖]
            streamWriter.WriteLine(openFileDialog1.FileName);//写入打开文件的名字及其路径
            streamWriter.Flush();//刷新文件写助手
            streamWriter.Close();//关闭文件写助手
            ShowWindows(openFileDialog1.FileName);//调用ShowWindows函数,显示图片
        }
        public void ShowWindows(string filename)
        {
            Image p = Image.FromFile(filename);//获得一个Image对象
            Form form = new Form();//新建一个form窗口
            form.MdiParent = this;//其对象是当前的父本
            form.BackgroundImage = p;//为新建的form窗口设置背景为image对象,此处之前可以先对图片进行压缩
            form.Show();//一切工作就绪,准备显示form窗口
        }

        private void Form1_Load(object sender, EventArgs e)
        {
          /*   在启动窗口时读取ini文件,并把读取到的路径加载到
               菜单栏选项里。并为其添加点击事件
         */
            StreamReader reader = new StreamReader("Menu.ini");//文件读助手 参数:path
            int i = this.文件ToolStripMenuItem.DropDownItems.Count - 2;//放菜单选项的位置,这里是在关闭所有与退出前面
            while (reader.Peek()>=0)//这里的peek函数是判断文件是否读取到段尾,没有读取到段尾则返回字符,否则返回-1,可能会触发I/O异常
            {
                ToolStripMenuItem menuItem = new ToolStripMenuItem(reader.ReadLine());//定义一个新ToolStripMenuItem对象,参数为菜单名。
                this.文件ToolStripMenuItem.DropDownItems.Insert(i,menuItem);//插入新建的对象
                i++;//位置自增
                menuItem.Click += new EventHandler(menuItem_Click);//为新建的菜单选项添加点击事件
            }
            reader.Close();//关闭文件读取助手
        }

        private void menuItem_Click(object sender, EventArgs e)
        {
            ShowWindows(sender.ToString());//打开文件
        }
源代码地址:https://github.com/ololee/CSharpDemo/tree/master/MenuHistory

0x02:菜单动态合并
技术要点:弹出菜单控件,也就是常说的右键菜单ContextMenuStrip
利用该控件中的Items对象可以操作菜单中的菜单项。该对象为ToolStripMenuItme类型,使用Items.AddRange方法可以向弹出菜单添加菜单项。
语法格式:
public void AddRange(ToolStripItem [] toolStripItems);//其中toolStripItem为ToolStripItem控件数组。

过程:新建C#Windows窗体应用,项目名与解决方案均为UniteMenu,默认窗体为Form1,从工具箱中为其添加MenuStrip控件用来设计菜单,同是,添加ContextMenuStrip控件用来设计右键菜单,并依次添加"a","b","c","d","e"等子项,选中MenuStrip控件,创建一个"打开子窗体"主菜单和新建一个"文件"菜单项用于打开右键菜单ContextMenuStrip;再为程序新建一个窗体,默认名Form2,同时向窗体添加ContextMenuStrip控件,并为其添加"1","2","3","4","5"等子项。

demo:
       private int flag=0;//避免重复添加
       private void 打开子窗体ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Form2 form2 = new Form2();
            form2.MdiParent = this;//此句话可能会报错,只需要修改Form1的IsMdiContainer属性设置为True
            form2.Show();
            form2.Resize += new EventHandler(f_Resize);//当新建的窗口程序放大或者缩小按钮点击或者改变尺寸就会触发事件,有点bug
        }

        private void f_Resize(object sender, EventArgs e)
        {//避免重复执行,需要定义一个状态量,其实这个bug就是当你还原窗口时,合并的菜单依然合并
           if (flag == 1)
            {  
                return;
            }
            Form2 f = sender as Form2;//类型的装化,as 能够转化时返回转化后的数据结构,不能时返回空
            //   is是能够转化返回true,否则false 
            ToolStripMenuItem item = new ToolStripMenuItem();
            for (int i = 0; i < f.contextMenuStrip1.Items.Count;)//注意,这里的i不需要人为的自增,在Add函数里已经为你自增了
            {
                item.DropDownItems.Add(f.contextMenuStrip1.Items[i]);
            }
            this.contextMenuStrip1.Items.AddRange(new ToolStripItem[] { item});//添加了一列菜单项toolstripitems
            flag=1;
        }

        private void 文件ToolStripMenuItem_Click(object sender, EventArgs e)
        {//显示右键菜单
            contextMenuStrip1.Show(this,new Point(menuStrip1.Location.X+打开子窗体ToolStripMenuItem.Width,menuStrip1.Location.Y+打开子窗体ToolStripMenuItem.Height));//对显示的右键菜单的位置进行规定,第一个参数为Control,第二个为Point或者直接的x,y坐标
        }

源代码地址 https://github.com/ololee/CSharpDemo/tree/master/UniteMenu
0x03:像开始菜单一样漂亮的菜单
技术要点:MenuStrip控件中的子项ToolStripMenuItem已经包含了左侧的彩条,可以用来事项开始菜单一样的菜单,如果要该表左侧的彩条,则在对应的菜单项设置相应的图片。 
  
创建一个项目,将其命名为LikeStartMenu
从工具箱中向Form1窗体添加MenuStrip控件
为MenuStrip添加子项
为子项添加相应的图片

源代码地址 https://github.com/ololee/CSharpDemo/tree/master/LikeStartMenu
0x04:任务栏盘菜单
技术要点: NotifyIcon控件是运行,或者显示在系统任务栏的图标控件,比如腾讯qq等就有运行在NotifyIcon的图标,这个图标如要实现菜单,则需要右键菜单ContextMenuStrip控件。 
实现过程:创建一个项目,将其命名为NotifyIconS1,默认窗台为Form1。 
向Form1添加NotifyIcon控件和ContextMenuStrip控件,并为ContextMenuStrip控件添加子项。 
选择NotifyIcon控件,并将ContextMenuStrip对象添加到NotifyIcon的ContextMenuStrip属性 
上,并为NotifyIcon设置自己喜欢的图标。
程序运行结果

源代码地址 https://github.com/ololee/CSharpDemo/tree/master/NotifyIconS1
0x05:可以拉伸的菜单界面
实例用途:
如果程序功能非常多而用户又不常用,那么,通常就会隐藏这些功能选项,当用户自己去打开的时候才会展现全部的菜单功能
技术要点:
实现可以拉伸的菜单,关键是使用一个开关变量,同时调用ToolStripDropDownItem的ShowDropDown方法
demo:
private void Form1_Load(object sender, EventArgs e)
        {
            this.toolStripMenuItem5.Visible = false;
            this.toolStripMenuItem6.Visible = false;
            this.toolStripMenuItem7.Visible = false;
            this.toolStripMenuItem8.Visible = false;
        }

        private void moreToolStripMenuItem_Click(object sender, EventArgs e)
        {
           
                    this.moreToolStripMenuItem.Visible = false;
                    this.toolStripMenuItem5.Visible = true;
                    this.toolStripMenuItem6.Visible = true;
                    this.toolStripMenuItem7.Visible = true;
                    this.toolStripMenuItem8.Visible = true;
                    this.numToolStripMenuItem.ShowDropDown();
        }

        private void numToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.moreToolStripMenuItem.Visible = true;
            this.toolStripMenuItem5.Visible = false;
            this.toolStripMenuItem6.Visible = false;
            this.toolStripMenuItem7.Visible = false;
            this.toolStripMenuItem8.Visible = false;
        }
点击前
点击后

源代码地址 https://github.com/ololee/CSharpDemo/tree/master/HideMenu
0x06:级联菜单

源代码地址 https://github.com/ololee/CSharpDemo/tree/master/ManyMenu

©Ololee's CSharpDemo

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
非常感谢您的提问。关于Unity中使用CSharp设计菜单系统,我可以告诉您一些关键的数据结构和基本实现原理。 在Unity中,设计菜单系统需要用到以下几个关键数据结构: 1. Menu:菜单,可以包含若干个MenuItem。 2. MenuItem:菜单项,可以包含上下文菜单、按钮等,以及若干个菜单(SubMenu)。 3. SubMenu:菜单,是一个与Menu相似的菜单,也可以包含若干个MenuItem。 4. MenuController:菜单控制器,是负责控制菜单的显示和隐藏,以及菜单项和菜单的事件处理等。 在实现上,可以将所有的MenuItem和SubMenu组合在一起,形成一棵树形菜单结构,通过编写菜单控制器的代码,控制菜单的显示和隐藏、事件的响应等。 首先,需要在代码中定义MenuItem和SubMenu的类,使用类的继承和组合关系来描述它们之间的层次结构。定义好之后,可以使用代码动态构建菜单树,并且为每个菜单项和菜单设置事件回调函数。 接下来,在菜单控制器的代码中实现菜单的显示和隐藏逻辑,可以使用Unity的UI组件或者自定义控件来实现菜单的渲染。一般情况下,菜单可以分为主菜单和上下文菜单两种类型,可以根据需要分别实现对应的功能。 最后,通过编写事件回调函数来实现菜单项和菜单的事件响应逻辑。可以使用CSharp中的委托机制来实现事件的注册和调用,同时也可以使用Unity的消息机制来实现事件的传递和处理。 以上就是基本的菜单系统设计和实现原理,希望能够对您有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值