2015年广工C#与.NET课程设计_第1页
2015年广工C#与.NET课程设计_第2页
2015年广工C#与.NET课程设计_第3页
2015年广工C#与.NET课程设计_第4页
2015年广工C#与.NET课程设计_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1.NET结构与C#程序设计课程设计 题 目 年度月历备忘录 学 院 计算机学院 专 业 计算机科学与技术 年级班别 12级4班 学 号 3112005901 学生姓名 柏石先 指导教师 杨劲涛 目录一、软件说明:3功能说明3解决什么样的实际问题3性能说明3程序类型说明3二、软件设计4软件整体结构图及模块划分4在VS的“解决方案资源管理器”中的文件说明;4各模块对应的主要对象或方法;5数据库设计或数据文件说明;9算法分析10三、测试13测试用例列表;13软件运行截图;14测试情况分析17四、小结17五、附录18用到的第三方控件或组件说明18程序的主要代码18 一、软件说明:功能说明(1) 实现

2、万年历的基本功能,可按年份查看每年的月历。并且每月的日期排布作为一个页面显示;(2) 能够正确展示星期、一周一行,红色显示节假日、周末。并且加入了更符合实际需求的农历显示和中国的节假日,二十四节气以及传统节日的显示等等。(3) 在月历显示界面,鼠标点击任何一天的对应的号码,都可以打开一个小文本框,作简单记事,所记内容存入本地的文件,并且按记录的日期进行命名,方便用户进行查找。(4) 如果某天已经有了记事内容,可以提供直接查看以往记录的内容并且提供及时修改,及时保存,便再次查看的功能。解决什么样的实际问题在日历的原有功能的基础上,增加了农历显示,传统节假日和节气的提示。也整合了备忘录的功能。做到

3、了简洁明了的方便用户记录每一天的备忘,并且能够快捷的方便用户修改和查看。性能说明能较快的响应用户的操作,并且实时刷新界面的显示内容。窗体的切换基本流畅,画面过度无明显卡顿。数据保存基本可靠,整体流程可行性高,对系统性能要求不高,无需网络和数据库的的连接。程序类型说明是单机版的windows窗体程序,文件是以.exe结尾的可执行程序。二、软件设计月历备忘录月历显示界面年份选择月份选择按要求显示日期备忘编辑模块首次编辑修改编辑备忘保存模块保存位置测试核验保存记录新增更改和删除软件整体结构图及模块划分在VS的“解决方案资源管理器”中的文件说明;解决方案管理器相关文件说明:Program.cs则是程序

4、的入口DateSources目录下的则是资源数据文件和展示的中间对象CalendarException.cs 是自定义的月历的异常处理机制的异常类ChineseDate.cs是对农历处理的类,主要是转化公历转化为农历ChineseCalender.cs是处理节日的类,主要是根据日期计算节假日和节气Calendar.cs是月历显示已经交互操作的窗体代码show.cs是备忘录编辑和保存的操作的窗体代码各模块对应的主要对象或方法;在panel2容器里面绘制自定义的日历控件,主要功能是绘制出5行7列的日历网格布局,再让布局网格中加载根据选择的当前年份和月份的日期数据。也就是改一个月的日期排序。按照计算

5、每一天的只是星期几进行相应位置的填充。 private void panel2_Paint(object sender, PaintEventArgs e) int num; Graphics graphics = e.Graphics; Pen pen = new Pen(Color.Blue, 2f); Pen pen2 = new Pen(Color.FromArgb(0xff, 0xeb, 0xd3), 1f); TextureBrush brush = new TextureBrush(Resources.hehe, WrapMode.TileFlipXY); graphics.Fi

6、llRectangle(brush, 0, 0, 750, 0x1db); graphics.FillRectangle(new SolidBrush(Color.White), 5, 40, 740, 400); SolidBrush brush2 = new SolidBrush(Color.FromArgb(50, 0xff, 0xf7, 0xf1); graphics.FillRectangle(brush2, 10, 0x2d, 560, 30); graphics.DrawLine(pen2, 10, 0x2d, 570, 0x2d); graphics.DrawLine(pen2

7、, 10, 0x4b, 570, 0x4b); for (num = 1; num 7; num+) graphics.DrawLine(pen2, 10, 0x4b + (60 * num), 570, 0x4b + (60 * num); for (num = 0; num 8; num+) graphics.DrawLine(pen2, 10 + (80 * num), 0x2d, 10 + (80 * num), 0x1b3); SolidBrush brush3 = new SolidBrush(Color.Gray); SolidBrush brush4 = new SolidBr

8、ush(Color.Chocolate); graphics.DrawString(日, new Font(微软雅黑, 12f), brush4, (float)35f, (float)50f); graphics.DrawString(一, new Font(微软雅黑, 12f), brush3, (float)115f, (float)50f); graphics.DrawString(二, new Font(微软雅黑, 12f), brush3, (float)195f, (float)50f); graphics.DrawString(三, new Font(微软雅黑, 12f), b

9、rush3, (float)275f, (float)50f); graphics.DrawString(四, new Font(微软雅黑, 12f), brush3, (float)355f, (float)50f); graphics.DrawString(五, new Font(微软雅黑, 12f), brush3, (float)435f, (float)50f); graphics.DrawString(六, new Font(微软雅黑, 12f), brush4, (float)515f, (float)50f); if (this.flag) his.GetWeekInfo(re

10、f this.weekOfFirstDay, ref this.daysOfMonth, this.dtNow.Year, this.dtNow.Month, 1); this.DrawDateNum(this.weekOfFirstDay, this.daysOfMonth, this.dtNow.Year, this.dtNow.Month); 设置日历控件的鼠标单次点击事件,并且获取当前点击的日期。并进行备忘录模块的调转。 private void panel2_MouseClick(object sender, MouseEventArgs e) if (e.Button = Mous

11、eButtons.Left) if (e.X 0x23f) | (e.Y 0x1b3) return; int num = (e.X - 10) / 80; int num2 = (e.Y - 0x4b) / 60; if (this.dateArraynum, num2 = null) return; DateTime time = DateTime.Parse(this.dateArraynum, num2); this.dtInfo = time; int year = time.Year; int month = time.Month; int day = time.Day; stri

12、ng sendmsg = year + 年 + month + 月 + day; Form sf = new show(sendmsg); sf.Show(); / this.panel3.Refresh(); / 将星期几转成数字表示 private int ConvertDayOfWeek(DayOfWeek dayOfWeek) switch (dayOfWeek) case DayOfWeek.Sunday: return 1; case DayOfWeek.Monday: return 2; case DayOfWeek.Tuesday: return 3; case DayOfWe

13、ek.Wednesday: return 4; case DayOfWeek.Thursday: return 5; case DayOfWeek.Friday: return 6; case DayOfWeek.Saturday: return 7; default: return 0; 获取农历日期的方法,运用现在的公历日期时间,计算得到相应的农历日期时间。 public static string GetChinaDate(DateTime dt) if (dt china.MaxSupportedDateTime | dt = leapMonth) iMonth-; string sz

14、Text = 正二三四五六七八九十; string strMonth = isLeapMonth ? 闰 : ; if (iMonth = 10) strMonth += szText.Substring(iMonth - 1, 1); else if (iMonth = 11) strMonth += 十一; else strMonth += 腊; return strMonth + 月; 数据库设计或数据文件说明;采用了本地文件保存的形式来记录月历的备忘内容。也就是当用户点击月历的某一天,并且决定保存自己的备忘内容时,程序会先自动检测用户当前电脑环境,之后在预先考虑的位子生成一个存放所有备

15、忘内容的文件夹。并且会依据日期来自动设定备忘的名字,也就是按日期记录备忘内容。也就能在按照日期去查找已有记录进行修改保存。/判断文件路径是否存在,不存在则创建文件夹 if(System.IO.Directory.Exists(D:) if (!System.IO.Directory.Exists(D:CalendarNotes) System.IO.Directory.CreateDirectory(D:CalendarNotes);/不存在就创建目录 path = D:CalendarNotes + time + 日的备忘.txt; else if (!System.IO.Directory

16、.Exists(E:CalendarNotes) System.IO.Directory.CreateDirectory(E:CalendarNotes);/不存在就创建目录 path = E:CalendarNotes + time + 日的备忘.txt; 文件的保存采用了TXT文本格式,便于用户可以修改,查看记录。而且txt文本文档支持多种字符编码,减少出现格式错误,字符转换的异常。 StreamWriter writer = null; try File.Delete(path); label1.Text=以下是+time+日的备忘内容; writer = new StreamWrite

17、r(path,true,System.Text.Encoding.Default); for(int i = 0; irichTextBox1.Lines.Length;i+) writer.WriteLine(richTextBox1.Linesi); catch(Exception ex) MessageBox.Show(ex.Message); finally if (writer != null) writer.Close(); /if(fs!=null) fs.Close(); MessageBox.Show(保存备忘成功,提示); this.Close();算法分析得到每周信息的算

18、法,也就是得到月历每一行日期排布的算法。主要思想就是通过解析日期得到位于一年的哪一周的周几。private void GetWeekInfo(ref int weekOfFirstDay, ref int daysOfMonth, int year = 0x76c, int month = 2, int day = 1) DateTime time = DateTime.Parse(year.ToString(CultureInfo.InvariantCulture) +- + month.ToString(CultureInfo.InvariantCulture) + - + day.ToS

19、tring(CultureInfo.InvariantCulture); weekOfFirstDay = (int)time.DayOfWeek; daysOfMonth = DateTime.DaysInMonth(year, month); 这个是自定义月历的控件的绘制日期信息的方法。主要是要计算出当前月的日期排布以及要绘制出相应位置的日期的具体显示。包括日期的数字,以及农历日和节假日以及节气的显示。是程序最重要的算法。private void DrawDateNum(int firstDayofWeek, int endMonthDay, int year, int month) Da

20、teTime time = DateTime.Parse(DateTime.Now.ToShortDateString(); Font font = new Font(, 14f); SolidBrush brush = new SolidBrush(Color.Gray); SolidBrush brush2 = new SolidBrush(Color.Chocolate); SolidBrush brush3 = new SolidBrush(Color.BurlyWood); Graphics graphics = panel2.CreateGraphics(); int num =

21、1; for (int i = 0; i 6; i+) for (int j = 0; j = firstDayofWeek) DateTime time2; TimeSpan span; if (num endMonthDay) break; string str = null; string day = null; string holiday = null; string s = null; if (j 0) & (j 3) ? holiday.Substring(0, 3) : holiday, new Font(, 9f), brush3, (float)(40 + (80 * j)

22、, (float)(90 + (60 * i); if (s != ) graphics.DrawString(s, new Font(, 10f), brush, (float)(0x19 + (80 * j), (float)(0x73 + (60 * i); else graphics.DrawString(day = 初一) ? str : day, new Font(, 10f), brush, (float)(0x19 + (80 * j), (float)(0x73 + (60 * i); graphics.DrawString(num.ToString(CultureInfo.

23、InvariantCulture), font, brush, (float)(15 + (80 * j), (float)(80 + (60 * i); else time2 = DateTime.Parse(string.Concat(new object year, -, month, -, num ); span = (TimeSpan)(time2 - time); this.dateArrayj, i = time2.ToShortDateString(); if (span.Days = 0) graphics.DrawEllipse(new Pen(Color.Chocolat

24、e, 3f), 15 + (80 * j), 0x55 + (60 * i), 30, 15); str = ChineseDate.GetMonth(time2); day = ChineseDate.GetDay(time2); holiday = ChineseDate.GetHoliday(time2); s = ChineseDate.GetChinaHoliday(time2); if (holiday != null) graphics.DrawString(holiday.Length 3) ? holiday.Substring(0, 3) : holiday, new Fo

25、nt(, 9f), brush3, (float)(40 + (80 * j), (float)(90 + (60 * i); if (s != ) graphics.DrawString(s, new Font(, 10f), brush2, (float)(0x19 + (80 * j), (float)(0x73 + (60 * i); else graphics.DrawString(day = 初一) ? str : day, new Font(, 10f), brush2, (float)(0x19 + (80 * j), (float)(0x73 + (60 * i); grap

26、hics.DrawString(num.ToString(CultureInfo.InvariantCulture), font, brush2, (float)(15 + (80 * j), (float)(80 + (60 * i); num+; 三、测试测试用例列表;下面主要是对备忘输入文本框的测试(备忘录输入编辑框的测试用例为字符型)1. 保存备忘时的非空校验:未输入程序应提示不需要保存;只输入若干个空格,未输入其它字符程序应提示不需要保存;2. 更改时字段唯一性校验:修改时输入重复的字段值提示友好信息;3. 字段为特殊字符校验:中文、英文、空格,数字,字符,下划线、单引号等所有特殊字

27、符的组合所有特殊字符都进行测试4. 多行文本框输入:1、允许回车换行 ;2、保存后再显示能够保持输入时的格式 ;3、仅输入回车换行,检查能否正确保存;若能,查看保存结果。若不能,查看是否有正确提示 ;4、仅输入空格,检查能否正确保存;若能,查看保存结果。若不能,查看是否有正确提示软件运行截图;主界面的显示:今天的日期会圈出来并且标记好,节日北邮显示,农历会有显示,周六,周日的变成其他的颜色区别标记。提供日期的选择和调转到今天的功能:点击任何一天都能相应用户的操作,首先会判断改日期是否存在已有的备忘内容。如果有直接打开显示。如果没有,提示用户将创建新的备忘文件。备忘录编辑界面,会自动生成当前日期

28、的相关信息。用户可以输入多种字符格式。换行空格格式的编辑会得到保存。点击保存操作会提示用户保存成功,点击取消将不保存相关备忘。再次点击日历的当前日期,因为已经有生成相关备忘记录,因此会直接打开已有备忘记录方便用户查看。而且此时用户可以随意编辑备忘的内容,并能够保存到用户的本地磁盘。测试情况分析经过测试,发现设定的功能基本能够流畅实现。对一些特定的情况,程序可以得到相应的正确提示语。对异常的处理能够合理的告知用户。整体会出现明显的bug和用户体验不好的地方。四、小结程序关键是通过绘制自定义的控件,来实现月历的显示。还有就是各种函数之间的传值需要考虑清楚。 因为要对数据进行计算和处理,需要很多算法

29、,所以也参照了网络上常规的几种日期处理的方式。打开程序将先获取系统的时间来初始化界面,如果用户对年份和月份进行选择后则会把对应的值来计算出该月份的第一天所对应的是星期几以及该月的最大天数,并且会对传来的月份来判断出该月份包含的节日并标红。节日标红这块这是比较难搞的,试了各种方法最后才找出能对单元格进行标红的正确的语句的格式。备忘录功能这块相对而言比较容易。但是也有些细节的逻辑处理需要理顺,才能避免出现一些没必要的错误。比如说要判定目录是否存在来创建目录,判断文件是否存在来创建文件或者读取文件还有写入文件。由于初始化界面是没有点选单元格如果把读取文件写到单元格点选时间中去会出现要点一次初始化时的

30、系统时间才会显示备忘录的内容。因此总的来说收获还是很多,也明白编程这东西,说再多还不如直接实践来得痛快。很多东西没有亲自动手,也就永远不可能体会到。书本是死的,思想才是活的。五、附录 用到的第三方控件或组件说明 本程序使用了一些来自网络上对于万年历计算的数据。并综合了一些其它计算类似节气时间,节假日时间的相关数据。这些内容主要集中在:ChineseCalendar类,里面包含了中国万年历计算的基础性数据。ChineseDate类,主要包含了中国农历的转化的计算底层数据。程序的主要代码 / 中国农历public static class ChineseDate private static Ch

31、ineseLunisolarCalendar china = new ChineseLunisolarCalendar(); private static Hashtable gHoliday = new Hashtable(); private static Hashtable nHoliday = new Hashtable(); private static string JQ = 小寒, 大寒, 立春, 雨水, 惊蛰, 春分, 清明, 谷雨, 立夏, 小满, 芒种, 夏至, 小暑, 大暑, 立秋, 处暑, 白露, 秋分, 寒露, 霜降, 立冬, 小雪, 大雪, 冬至; private

32、static int JQData = 0, 21208, 42467, 63836, 85337, 107014, 128867, 150921, 173149, 195551, 218072, 240693, 263343, 285989, 308563, 331033, 353350, 375494, 397447, 419210, 440795, 462224, 483532, 504758;static ChineseDate() /公历节日gHoliday.Add(0101, 元旦);gHoliday.Add(0214, 情人节);gHoliday.Add(0305, 雷锋日);g

33、Holiday.Add(0308, 妇女节); gHoliday.Add(0312, 植树节);gHoliday.Add(0315, 消权日);gHoliday.Add(0401, 愚人节);gHoliday.Add(0501, 劳动节);gHoliday.Add(0504, 青年节);gHoliday.Add(0601, 儿童节);gHoliday.Add(0701, 建党节);gHoliday.Add(0801, 建军节);gHoliday.Add(0910, 教师节);gHoliday.Add(1001, 国庆节); gHoliday.Add(1224, 平安夜);gHoliday.Add(1225, 圣诞节);/农历节日nHoliday.Add(0101, 春节);nHoliday.Add(0115, 元宵节);nHoliday.Add(0505, 端午节);nHoliday.Add(0815, 中秋节);nHoliday.Add(0909, 重阳节);nHoliday.Add(1208, 腊八节); / 获取农历 public static string GetChinaDate(DateTime dt) if (dt china.MaxSupportedDateTime | dt public static string GetYear(Date

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论