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
网友评论