小白自学C#之《C#.net_经典编程例子400个》实例001带历史信息的菜单 附自学源码


第一部分,原文章程序

实例001  带历史信息的菜单

实例说明

在开发图纸管理软件时,要求在菜单上记录用户最近打开的档案或图纸,以方便下次使用。如图1.1所示,单击“文件”菜单下的“打开文件”子菜单,打开需要查阅的图纸。下次运行该软件时,上次打开的文件名记录到“文件”菜单的历史菜单中,选择该菜单,即可打开相应的图纸文件。

技术要点

要实现保存最近打开的文件,可以将在菜单中最近打开文件的文件名和路径保存到事先建立的*.ini文件中,系统启动时读取*.ini中的数据建立数组菜单,即可实现显示历史菜单的功能。

 注意:要建立一个带历史信息的菜单,必须首先添加一个MenuStrip菜单控件,并将主窗体的IsMdiContainer属性设为True。

实现过程

(1)创建一个项目,将其命名为Ex01_01,默认窗体为Form1。

(2)从工具箱中向Form1窗体添加MenuStrip控件,同时向窗体添加OpenFileDialog控件。创建一个“文件”主菜单,在其下面创建打开、关闭所有、退出等菜单选项。

(3)主要程序代码。

将打开文件路径写入INI文件的实现代码如下:

       

 private void 打开ToolStripMenuItem_Click(objectsender, EventArgs e)
        {
           openFileDialog1.FileName = "";
           this.openFileDialog1.ShowDialog();
           StreamWriter s = new StreamWriter(address + "\\Menu.ini", true);
           s.WriteLine(openFileDialog1.FileName);//写入INI文件
           s.Flush();
           s.Close();
           ShowWindows(openFileDialog1.FileName);
        }

读取INI文件并将信息加入菜单的实现代码如下:

     

 private voidForm1_Load(object sender, EventArgs e)
        {
           StreamReader sr = new StreamReader(address + "\\Menu.ini");
           int i = this.文件ToolStripMenuItem.DropDownItems.Count-2;
           while (sr.Peek()>=0)//读取INI文件
           {
               ToolStripMenuItem menuitem = new ToolStripMenuItem(sr.ReadLine());
               this.文件ToolStripMenuItem.DropDownItems.Insert(i,menuitem);
               i++;
               menuitem.Click += new EventHandler(menuitem_Click);
           }
           sr.Close();
        }

自定义方法ShowWindows()用来加载背景图片并显示窗体,实现代码如下:

       

 public voidShowWindows(string fileName)
        {
           Image p = Image.FromFile(fileName);
           Form f = new Form();
           f.MdiParent = this;
           f.BackgroundImage = p;
           f.Show();
        }

举一反三

根据本实例,读者可以开发以下程序。

  记录用户操作菜单日志的程序。在用户单击菜单时,把用户、菜单命令和菜单对应功能写入保存菜单日志的INI文件。如果需要查看日志,只需打开INI文件。

  通过数据库保存菜单历史信息的程序。

  菜单使用频率的程序。把用户使用菜单的数据信息保存到数据库中,然后统计用户使用菜单的频率,并根据此频率调整菜单的显示顺序。



第二部分,小白笔记


源码如下

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


namespace Ex01_001
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        
        /// <summary>
        /// 自定义address用于记录当前路径
        /// </summary>
        string address = System.Environment.CurrentDirectory;


        /// <summary>
        /// 自定义方法ShowWindows()用来加载背景图片并显示窗体,实现代码如下:
        /// </summary>
        /// <param name="fileName"></param>
        public void ShowWindows(string fileName)
        {
            Image p = Image.FromFile(fileName);
            Form f = new Form();
            f.MdiParent = this;
            f.BackgroundImage = p;
            f.Show();
        }


        /// <summary>
        /// 将打开文件路径写入INI文件的实现代码如下
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void 打开ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            openFileDialog1.FileName = "";
            this.openFileDialog1.ShowDialog();
            StreamWriter s = new StreamWriter(address + "\\Menu.ini", true);
            s.WriteLine(openFileDialog1.FileName);//写入INI文件
            s.Flush();
            s.Close();
            ShowWindows(openFileDialog1.FileName);
        }


        private void menuitem_Click(object sender, EventArgs e)
        {
            ToolStripMenuItem Mymeun = (ToolStripMenuItem)sender;
            ShowWindows(Mymeun.Text);
        }


        /// <summary>
        /// 读取INI文件并将信息加入菜单的实现代码如下:
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Form1_Load(object sender, EventArgs e)
        {
            StreamReader sr = new StreamReader(address + "\\Menu.ini");
            int i = this.文件ToolStripMenuItem.DropDownItems.Count - 2;
            while (sr.Peek() >= 0)//读取INI文件
            {
                ToolStripMenuItem menuitem = new ToolStripMenuItem(sr.ReadLine());
                this.文件ToolStripMenuItem.DropDownItems.Insert(i, menuitem);
                i++;
                menuitem.Click += new EventHandler(menuitem_Click);
              //  menuitem.Click += new EventHandler(menuitem_Click);
            }
            sr.Close();
        }
    }
}


运行结果为:



网上找了几种获取路径的方法,及说明

//获取包含清单的已加载文件的路径或 UNC 位置。

        public static string sApplicationPath = Assembly.GetExecutingAssembly ( ).Location;

        //result: X:\xxx\xxx\xxx.dll (.dll文件所在的目录+.dll文件名)

 

        //获取当前进程的完整路径,包含文件名(进程名)。

        string str = this.GetType ( ).Assembly.Location;

        //result: X:\xxx\xxx\xxx.exe (.exe文件所在的目录+.exe文件名)

 

        //获取新的 Process 组件并将其与当前活动的进程关联的主模块的完整路径,包含文件名(进程名)。

        string str = System.Diagnostics.Process.GetCurrentProcess ( ).MainModule.FileName;

        //result: X:\xxx\xxx\xxx.exe (.exe文件所在的目录+.exe文件名)

 

        //获取和设置当前目录(即该进程从中启动的目录)的完全限定路径。

        string str = System.Environment.CurrentDirectory;

        //result: X:\xxx\xxx (.exe文件所在的目录)

 

        //获取当前 Thread 的当前应用程序域的基目录,它由程序集冲突解决程序用来探测程序集。

        string str = System.AppDomain.CurrentDomain.BaseDirectory;

        //result: X:\xxx\xxx\ (.exe文件所在的目录+"\")

 

        //获取和设置包含该应用程序的目录的名称。

        string str = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase;

        //result: X:\xxx\xxx\ (.exe文件所在的目录+"\")

 

        //获取启动了应用程序的可执行文件的路径,不包括可执行文件的名称。

        string str = System.Windows.Forms.Application.StartupPath;

        //result: X:\xxx\xxx (.exe文件所在的目录)

 

        //获取启动了应用程序的可执行文件的路径,包括可执行文件的名称。

        string str = System.Windows.Forms.Application.ExecutablePath;

        //result: X:\xxx\xxx\xxx.exe (.exe文件所在的目录+.exe文件名)

 

        //获取应用程序的当前工作目录(不可靠)。

        string str = System.IO.Directory.GetCurrentDirectory ( );

        //result: X:\xxx\xxx (.exe文件所在的目录)

 

在系统服务中最好用这个方式去取路径

                string stmp = Assembly.GetExecutingAssembly ( ).Location;

                stmp = stmp.Substring ( 0 , stmp.LastIndexOf ( '\\' ) );//删除文件名

                if ( pathType == 1 )

                    return stmp + @"\inputLog.xml";

                else if ( pathType == 2 )

                    return stmp + @"\MiddleDB.xml";

                else

                    return stmp + @"\AppNo.xml";

 

using System.IO;

        string path = "d:asdfasdf.bmp";

        string fileName = Path.GetFileName(path); //文件名

        string ext = Path.GetExtension(path); //扩展名



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值