我的 WinClock 项目系列之一 (概述)
源起:
三年前,当我还是一个学生的时候,同学在用一个类似雪狐迷你钟
的小软件,具体叫什么现在忘记了,当时这个软件是收费的,不
过他用的是破解版,呵呵,主要功能包括:
1. 更换皮肤。
2. 多种钟面属性(例如:总在最前、嵌入桌面、鼠标穿透)
3. 可半透明镶嵌在桌面上,不影响其它操作
4. 抗锯齿,显示更加平滑,美观
我就拷贝下载网上的说明吧:
1. 小巧、精致,半透明的镶嵌在桌面背景中 。
2. 自带四十余种漂亮的皮肤,时钟更加个性!
3. 半透明,且支持镶嵌在桌面上(按“显示桌面”按钮也无法吃掉她),
不影响其它操作!
4. 鼠标穿透功能,程序再也不会影响您的正常工作了 。
5. 语音报时,并可设置整点、半点报时功能
6. 超强抗锯齿,使得显示更加平滑,美观。
为何不自己去实现一个这样的软件呢?当时我就有这样的想法,
当时的想法,这样一个小东西做起来应该很简单的,这些基本功能实现就好了,
当时我们正在选修 C#面向组件的开发这样的课程,于是自然采用了C#作为开发
语言,那时候 Visual Studio 2005 的 Beta 版本刚刚可用,我们就这样开始了。
实现:
后来发现,直接在.Net Framework 里查找这些需要的功能,都很难找到或者效果
很差,除了窗口置顶可以直接使用 Form.TopMost 设置之外。于是上网查资料,
发现调用 Windows API 函数可以实现这些功能。当时查找了C#调用 API 函数的
资料,倒也简单,只是有些类型的 Marshal 可能需要点儿技巧。
细节:
当时很快进入了细节,也没有考虑如何降低软件的耦合度,反正急于实现功能,
整个程序实现在一个项目里面,生成后也就一个 Exe 文件。的确,通过查资料,
像如何实现异形窗体这们的功能都有了可选的方案,当时找到两种方案,但是效果
都不理想,别说放大窗体了,连按原始图片大小显示都会有明显的锯齿,这个问题
真正解决是到了项目后期才找到解决方案的。
不管怎么说,当时经过了将近一个月时间的摸索,一个还可以用的软件是出来了。
重构:
很快离开学校去工作了,虽然工作很忙,还是抽时间研究了设计模式,软件重构
之类的东西,加上工作中也会学到一些东西,回头看看自己的小软件,很不满意,
于是进行了一通重构。直到现在像点儿样子了。
最近没事,有了把这个项目过程讲一讲的冲动,所谓麻雀虽小,五脏俱全。干
脆写一个系列算了。大至计划如下:
1. 概述
介绍项目的背景,展示主要功能,提供可执行文件的下载。就是这次的内容了,
2. 功能细节,在Windows API 里面查找需要的功能。
主要讲一讲这些基本功能要用到哪些API函数,以及如何在 C# 里面调用他们。
例如设计异形窗体的三种方式和各自己的优缺点,以及项目的决策,反锯齿等。
3. Mediator模式的应用。
讲述如何让把功能细节的实现分离到别的 class 中,以及如何让菜单工作等。
4. Memento 模式的应用。
讲述为何以及如何实现 Memento 模式,同时会对软件设置中的 Preview 功能
进行介绍。
5. Balloon提示和Service.
讲述如何通过重绘设计一个通用气球提示,以及如何使用它。
6. 持久化存储。
讲述如何使用.Net 提供的序列化机制保存软件设置,如何通过反序列化重新
加载这些设置。结合开源项目 SharpDevelop 的源码,讲述如何使用 XmlReader
和 XmlWriter 实现对所有类型的持久化存储,以及如何用他来代替C#提供的
序列化机制,同时还会指出SharpDevelop持久化存储现存的一个功能缺失,并
通过简单的修改弥补这种缺失。
下面是软件的一些截图, 让各位看客先有一个总体印象。
我的 WinClock 软件下载
三年前,当我还是一个学生的时候,同学在用一个类似雪狐迷你钟
的小软件,具体叫什么现在忘记了,当时这个软件是收费的,不
过他用的是破解版,呵呵,主要功能包括:
1. 更换皮肤。
2. 多种钟面属性(例如:总在最前、嵌入桌面、鼠标穿透)
3. 可半透明镶嵌在桌面上,不影响其它操作
4. 抗锯齿,显示更加平滑,美观
我就拷贝下载网上的说明吧:
1. 小巧、精致,半透明的镶嵌在桌面背景中 。
2. 自带四十余种漂亮的皮肤,时钟更加个性!
3. 半透明,且支持镶嵌在桌面上(按“显示桌面”按钮也无法吃掉她),
不影响其它操作!
4. 鼠标穿透功能,程序再也不会影响您的正常工作了 。
5. 语音报时,并可设置整点、半点报时功能
6. 超强抗锯齿,使得显示更加平滑,美观。
为何不自己去实现一个这样的软件呢?当时我就有这样的想法,
当时的想法,这样一个小东西做起来应该很简单的,这些基本功能实现就好了,
当时我们正在选修 C#面向组件的开发这样的课程,于是自然采用了C#作为开发
语言,那时候 Visual Studio 2005 的 Beta 版本刚刚可用,我们就这样开始了。
实现:
后来发现,直接在.Net Framework 里查找这些需要的功能,都很难找到或者效果
很差,除了窗口置顶可以直接使用 Form.TopMost 设置之外。于是上网查资料,
发现调用 Windows API 函数可以实现这些功能。当时查找了C#调用 API 函数的
资料,倒也简单,只是有些类型的 Marshal 可能需要点儿技巧。
细节:
当时很快进入了细节,也没有考虑如何降低软件的耦合度,反正急于实现功能,
整个程序实现在一个项目里面,生成后也就一个 Exe 文件。的确,通过查资料,
像如何实现异形窗体这们的功能都有了可选的方案,当时找到两种方案,但是效果
都不理想,别说放大窗体了,连按原始图片大小显示都会有明显的锯齿,这个问题
真正解决是到了项目后期才找到解决方案的。
不管怎么说,当时经过了将近一个月时间的摸索,一个还可以用的软件是出来了。
重构:
很快离开学校去工作了,虽然工作很忙,还是抽时间研究了设计模式,软件重构
之类的东西,加上工作中也会学到一些东西,回头看看自己的小软件,很不满意,
于是进行了一通重构。直到现在像点儿样子了。
最近没事,有了把这个项目过程讲一讲的冲动,所谓麻雀虽小,五脏俱全。干
脆写一个系列算了。大至计划如下:
1. 概述
介绍项目的背景,展示主要功能,提供可执行文件的下载。就是这次的内容了,
2. 功能细节,在Windows API 里面查找需要的功能。
主要讲一讲这些基本功能要用到哪些API函数,以及如何在 C# 里面调用他们。
例如设计异形窗体的三种方式和各自己的优缺点,以及项目的决策,反锯齿等。
3. Mediator模式的应用。
讲述如何让把功能细节的实现分离到别的 class 中,以及如何让菜单工作等。
4. Memento 模式的应用。
讲述为何以及如何实现 Memento 模式,同时会对软件设置中的 Preview 功能
进行介绍。
5. Balloon提示和Service.
讲述如何通过重绘设计一个通用气球提示,以及如何使用它。
6. 持久化存储。
讲述如何使用.Net 提供的序列化机制保存软件设置,如何通过反序列化重新
加载这些设置。结合开源项目 SharpDevelop 的源码,讲述如何使用 XmlReader
和 XmlWriter 实现对所有类型的持久化存储,以及如何用他来代替C#提供的
序列化机制,同时还会指出SharpDevelop持久化存储现存的一个功能缺失,并
通过简单的修改弥补这种缺失。
下面是软件的一些截图, 让各位看客先有一个总体印象。
我的 WinClock 软件下载
这是微软技术的一贯特点,使用简单。但是如果要深入的话,还是要投入不少精力的