过年回家也上不了网,前两天闲得无聊就自己研究了一个小程序。先看一下程序的界面:
界面一:
界面二:
这个小程序大概用了一天多的时间编写出来,功能比较简单,该程序具有的功能:
1.可以显示日期,当前时间,星期,农历。
2.程序可以吸附在桌面上,实现嵌入桌面的效果。
3.可以设置程序为开机自启动。
下面贴出部分主要代码:
//设置吸附桌面功能
private void 吸附桌面ToolStripMenuItem_CheckStateChanged(object sender, EventArgs e)
...{
//默认为勾选状态(吸附桌面),点击后即触发该事件,“吸附桌面”项勾掉了,则变量ischecked为!ischecked(false),
//则可以移动窗体。再次点击该菜单项,ischecked为!ischecked(true),则不能移动窗体。
//checkstate发生变化
ischecked = !ischecked;
if (ischecked == true)
...{
勾选但不移动的处理#region 勾选但不移动的处理(如果用户勾选了该项,但是并没有移动程序的位置,则进行该项判断)
//2012年1月31日0:27:44 解决思路:
//先判断ini文件是否存在,如果是第一次启动程序或ini文件丢失,则无ini文件,
//则没有上次保存的ini配置信息,不进行读取操作,否则
//先从ini文件中读取上次设定的x,y的坐标值,作为old_x,old_y。再将新的坐标值与旧的
//坐标值进行比较,如果窗体移动了,则比较后不同,进行写入ini操作,否则不写入
if (File.Exists(pathbase + "CnClock.ini"))
...{
try
...{
StreamReader sr = new StreamReader(pathbase + "CnClock.ini", Encoding.GetEncoding("gb2312"));
if (sr.Peek() >= 0)
...{
old_x = Convert.ToInt32(sr.ReadLine());
old_y = Convert.ToInt32(sr.ReadLine());
}
sr.Close();
}
catch (Exception ex)
...{
MessageBox.Show(ex.Message.ToString());
}
}
#endregion
//2012年1月30日22:34:43,又想到一个新问题:如果用户勾选了“吸附桌面”项后,没有移动该窗体的位置,
//这种情况下是否要判断一下新位置与原位置是否相同??? 经考虑,需设定!
//2012年1月31日0:21:04 设置完成,代码见 #勾选但不移动的处理 部分
//什么时候才会执行下面这句代码“yidong = false;” 呢?
//分析:在form_load时不会执行,只有当用户移动窗体后,再选中"吸附桌面"项后才会执行
//这句代码,所以这里才是控制什么时候将新的位置坐标写入ini文件的地方,在这句下面写相应代码
yidong = false;
//如果用户勾掉了“吸附桌面”选项,则窗体可以移动,待用户确定新位置后,
//如果用户不勾上“吸附桌面”菜单项,则不记录新位置坐标,否则将新位置的坐标写入ini配置文件中。
try
...{
//获取窗体移动后的坐标(_x,_y)
_x = this.Location.X;
_y = this.Location.Y;
//勾选但不移动的处理(部分代码)
xin_x = this.Location.X;
xin_y = this.Location.Y;
//相或,一真为真。即如果x不同或y不同或两个都不同,则说明窗体位置发生变化了
//须执行写入操作
//勾选但不移动的处理(部分代码)
if (!(xin_x == old_x) || !(xin_y == old_y))
...{
StreamWriter sw = new StreamWriter(pathbase + "CnClock.ini", false, Encoding.GetEncoding("gb2312"));
sw.Flush();
sw.WriteLine(_x);
sw.WriteLine(_y);
sw.Close();
//新位置确认后给予提示
this.notifyIcon1.ShowBalloonTip(5, "CnClock提示", "新位置已设定!", ToolTipIcon.Info);
}
}
catch (Exception ex)
...{
MessageBox.Show(ex.Message.ToString());
}
}
else
...{
yidong = true;
}
}
private void 吸附桌面ToolStripMenuItem_CheckStateChanged(object sender, EventArgs e)
...{
//默认为勾选状态(吸附桌面),点击后即触发该事件,“吸附桌面”项勾掉了,则变量ischecked为!ischecked(false),
//则可以移动窗体。再次点击该菜单项,ischecked为!ischecked(true),则不能移动窗体。
//checkstate发生变化
ischecked = !ischecked;
if (ischecked == true)
...{
勾选但不移动的处理#region 勾选但不移动的处理(如果用户勾选了该项,但是并没有移动程序的位置,则进行该项判断)
//2012年1月31日0:27:44 解决思路:
//先判断ini文件是否存在,如果是第一次启动程序或ini文件丢失,则无ini文件,
//则没有上次保存的ini配置信息,不进行读取操作,否则
//先从ini文件中读取上次设定的x,y的坐标值,作为old_x,old_y。再将新的坐标值与旧的
//坐标值进行比较,如果窗体移动了,则比较后不同,进行写入ini操作,否则不写入
if (File.Exists(pathbase + "CnClock.ini"))
...{
try
...{
StreamReader sr = new StreamReader(pathbase + "CnClock.ini", Encoding.GetEncoding("gb2312"));
if (sr.Peek() >= 0)
...{
old_x = Convert.ToInt32(sr.ReadLine());
old_y = Convert.ToInt32(sr.ReadLine());
}
sr.Close();
}
catch (Exception ex)
...{
MessageBox.Show(ex.Message.ToString());
}
}
#endregion
//2012年1月30日22:34:43,又想到一个新问题:如果用户勾选了“吸附桌面”项后,没有移动该窗体的位置,
//这种情况下是否要判断一下新位置与原位置是否相同??? 经考虑,需设定!
//2012年1月31日0:21:04 设置完成,代码见 #勾选但不移动的处理 部分
//什么时候才会执行下面这句代码“yidong = false;” 呢?
//分析:在form_load时不会执行,只有当用户移动窗体后,再选中"吸附桌面"项后才会执行
//这句代码,所以这里才是控制什么时候将新的位置坐标写入ini文件的地方,在这句下面写相应代码
yidong = false;
//如果用户勾掉了“吸附桌面”选项,则窗体可以移动,待用户确定新位置后,
//如果用户不勾上“吸附桌面”菜单项,则不记录新位置坐标,否则将新位置的坐标写入ini配置文件中。
try
...{
//获取窗体移动后的坐标(_x,_y)
_x = this.Location.X;
_y = this.Location.Y;
//勾选但不移动的处理(部分代码)
xin_x = this.Location.X;
xin_y = this.Location.Y;
//相或,一真为真。即如果x不同或y不同或两个都不同,则说明窗体位置发生变化了
//须执行写入操作
//勾选但不移动的处理(部分代码)
if (!(xin_x == old_x) || !(xin_y == old_y))
...{
StreamWriter sw = new StreamWriter(pathbase + "CnClock.ini", false, Encoding.GetEncoding("gb2312"));
sw.Flush();
sw.WriteLine(_x);
sw.WriteLine(_y);
sw.Close();
//新位置确认后给予提示
this.notifyIcon1.ShowBalloonTip(5, "CnClock提示", "新位置已设定!", ToolTipIcon.Info);
}
}
catch (Exception ex)
...{
MessageBox.Show(ex.Message.ToString());
}
}
else
...{
yidong = true;
}
}
设置开机自启动功能:
//设置开机启动功能
private void 开机启动ToolStripMenuItem_CheckStateChanged(object sender, EventArgs e)
...{
/*设计思路: 2012年1月31日16:00:47完成
* 默认开机启动,则在form_load中先执行一下设置autorun方法。
* 用户勾掉“开机启动”项后,则取消autorun,用户勾选“开机启动”项后,则设置autorun。
*/
//初始为开机启动,则isautorun初始为true,当用户点击该项后,isautorun为false,不开机启动。
isautorun = !isautorun;
if (isautorun == true)
...{
//isautorun为true,开机启动
auToRun.SetAutoRun(Application.ExecutablePath, true);
//设置为开机启动后给予提示
this.notifyIcon1.ShowBalloonTip(5, "CnClock提示", "开机启动已设定!", ToolTipIcon.Info);
}
else
...{
//isautorun为false,开机不启动
auToRun.SetAutoRun(Application.ExecutablePath, false);
//设置为开机不启动后给予提示
this.notifyIcon1.ShowBalloonTip(5, "CnClock提示", "已关闭开机启动!", ToolTipIcon.Info);
}
}
private void 开机启动ToolStripMenuItem_CheckStateChanged(object sender, EventArgs e)
...{
/*设计思路: 2012年1月31日16:00:47完成
* 默认开机启动,则在form_load中先执行一下设置autorun方法。
* 用户勾掉“开机启动”项后,则取消autorun,用户勾选“开机启动”项后,则设置autorun。
*/
//初始为开机启动,则isautorun初始为true,当用户点击该项后,isautorun为false,不开机启动。
isautorun = !isautorun;
if (isautorun == true)
...{
//isautorun为true,开机启动
auToRun.SetAutoRun(Application.ExecutablePath, true);
//设置为开机启动后给予提示
this.notifyIcon1.ShowBalloonTip(5, "CnClock提示", "开机启动已设定!", ToolTipIcon.Info);
}
else
...{
//isautorun为false,开机不启动
auToRun.SetAutoRun(Application.ExecutablePath, false);
//设置为开机不启动后给予提示
this.notifyIcon1.ShowBalloonTip(5, "CnClock提示", "已关闭开机启动!", ToolTipIcon.Info);
}
}
程序下载地址:CnClock1.0版:http://dl.dbank.com/c0qbry08qv
CnClock2.0版:http://dl.dbank.com/c0m78h7dty
如果以上页面无法下载可到下面页面下载:http://www.kuaipan.cn/index.php?ac=file&oid=5028779638390791
说明:两个版本的区别是1.0版是方形显示的,2.0版是条形显示的(见文首图片)。
该程序需要.net Framework2.0或以上版本支持。
目前发现的一个小问题:
在程序选择是否支持开机启动时,要操作注册表。如果用户电脑上装有360安全卫士或QQ电脑管家等管理软件,会弹出提示信息。如果用户选择了不允许操作注册表,则程序弹出异常提示,注册表信息不会写入,但写入正确的气泡提示信息还会弹出来。这个地方还需要修改一下。
本人还是新手,如果代码有编写的不完善的地方还请大家多多指教。
请发表评论