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地址
软件下载地址