StickyNote开发笔记1

@adens 11/28/2016 8:06:21 AM

0. 前言

经常会拖延症发作把一些事丢在最后,到最后又给忘记了。比如这一篇需求文档,所以写一个电脑桌面的便签。每天打开电脑了解一下昨天有什么事记上了没做赶紧做了。顺便检验一下学习的成果。

1.需求描述

开发环境:

使用VS2013创建Windows窗体程序,.net framework 4.5。数据使用Json保存在本地。Json的数据序列化(Serialize)与反序列化(DeSerialize)使用Newtonsoft.Json插件实现。

主界面(开始界面):

长条状主界面,只要软件图标,新建按钮,查看按钮,退出按钮。实现主要功能。

新建按钮:新建一张便签。

查看按钮:查看所有已创建的便签,可以修改与删除。

退出按钮:退出整个程序。

新建界面:

标题输入框, 便签内容输入框, 确认按钮,取消按钮,重置按钮

查看界面:

显示所有标签标题.提供删除按钮和修改按钮

2. 编程实现

2.1 创建窗体

打开VS2013新建一个项目,选择Windows窗体应用程序,默认创建了一个Form1窗体,重命名为Start; (Start.cs)

创建需要的窗体:

新建便签窗体(DataIO.cs)

查看所有便签窗体(Manager.cs)

便签显示模板页(NoteModel.cs)

拖入所需控件,设置好属性.

2.2 主界面按钮功能代码

双击按钮自动创建了CreateBtn_Click()方法,并且在designer中自动注册了Click委托事件

主界面到新建便签界面

 	private void CreateBtn_Click(object sender, EventArgs e)
    {
    	DataIO d = DataIO.GetDataIO();
        d.Show();
    }

主界面到查看便签界面

     private void ManagerBtn_Click(object sender, EventArgs e)
     {
         //Manager m = new Manager();
         Manager m =Manager.GetManager();
         m.Show();
     }

2.3 新建便签内容数据保存

所有数据使用Json保存到本地。

每次启动检查便签数据,实例化NoteModel.cs显示到桌面。

使用Newtonsoft.Json插件进行Json数据的序列化和反序列化。

 public void JsonWrite(List<NotesData> list)
  {
      string path = Application.StartupPath + "\\" + defaultFoldName + "\\" + defaultFileName;
      string JsonData = JsonConvert.SerializeObject(list);
      try
      {
          System.IO.File.WriteAllText(path, JsonData);
      }
      catch(Exception e)
      {
          thorw(e);
      }
   }

2.4 显示便签

新建NotesManager.cs负责管理便签Form的创建。部分代码如下:

public void LoadNotes()
 {
     CheckState();
     if (notes != null)
     {
        foreach (Form f in notes)
        {
             f.Close();
        }
     }
     List<NotesData> list = new List<NotesData>();
     list = new Json().GetAllNotes();
     if (list.Count != 0)
     {
         for (int i = 0; i < list.Count; i++)
         {
             NoteModel n = new NoteModel();
             n.Location = new System.Drawing.Point(list[i].x,list[i].y);
             n.Name = "Note"+list[i].ID;
             n.Text = list[i].Title;
             try
            {
                 TextBox title = n.Controls.Find("Title", true)[0] as TextBox;
                 title.Text = list[i].Title;
                 TextBox t = n.Controls.Find("DataNote", true)[0] as TextBox;
                 t.Text = list[i].Note;
                 Label l = n.Controls.Find("label1", true)[0] as Label;
                 l.Text = list[i].ID.ToString();
             }
             catch(Exception e)
             {
				throw e;
             }
             n.Show();
             } 
         }   
     }

3 开机启动和单一进程

3.1 开机启动

在Start窗体添加一个按钮确定是否开机自启动,点击按钮实现开机自启动的打开和关闭。

private void SettingsBtn_Click(object sender, EventArgs e)
 {
      
     string path = Application.ExecutablePath;
     RegistryKey key = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);//打开注册表子项 
     if (key == null) //如果该项不存在的话,则创建该子项 
     {
         key = Registry.LocalMachine.CreateSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");
     }
     if (!IsAutoRun)
     {
         try
         {
              key.SetValue("StickyNotes", path);//设置为开机启动 
              key.Close();
              DialogResult result = MessageBox.Show("已设为开机自启动", "消息", MessageBoxButtons.OK);
              IsAutoRun = !IsAutoRun;
          }catch
          {
              DialogResult result = MessageBox.Show("开机自启动失败,请重试", "消息", MessageBoxButtons.OK);
          }   
      }
      else if (IsAutoRun)
      {
      	try{
               key.DeleteValue("StickyNotes");//取消开机启动 
               key.Close();
               DialogResult result = MessageBox.Show("已取消开机自启动", "消息", MessageBoxButtons.OK);
               IsAutoRun = !IsAutoRun;
            }catch
            {
               DialogResult result = MessageBox.Show("取消开机自启动失败,请重试", "消息", MessageBoxButtons.OK);
            } 
         }
     }

3.2 单一进程

修改Program.cs中main函数,使用Mutex检查进程中是否已有当前同名的进程,有则显示警告:程序已经在运行了。

static class Program
 {
     /// <summary>
     /// 应用程序的主入口点。
     /// </summary>
     [STAThread]
     static void Main()
     {
         bool createNew;
         using (Mutex mutex = new Mutex(true,Application.ProductName,out createNew))
         {
             if (createNew)
             {
                 Application.EnableVisualStyles();
                 Application.SetCompatibleTextRenderingDefault(false);
                 Application.Run(Start.GetStart());
             }
             // 程序已经运行的情况,则弹出消息提示并终止此次运行
             else
             {
                 MessageBox.Show("应用程序已经在运行中...");
                 System.Threading.Thread.Sleep(1000);
                 //  终止此进程并为基础操作系统提供指定的退出代码。
                 System.Environment.Exit(1);
             }
         }
     }
 }

4 写在最后

断断续续写了半个月,都不知道上回写到哪了,就当这篇是个流水账吧,后面的博客应该会写制作过程中的一些Bug和难点了。

也终于是对.NET 的WinForm有了一些深刻的了解。

Github地址

软件下载地址

Last Modification : 2/28/2023 8:08:35 AM


In This Document