万年历

合集下载

万年历原理

万年历原理

万年历原理
万年历是一种可以显示任意日期的日历,它的原理是基于天文学和数学的结合。

在古代,人们通过观察太阳、月亮和星星的运行轨迹来制作日历,但这种日历只能粗略地预测日期,无法准确地显示每一天的日期。

直到公元前2世纪,罗马天文学家克劳迪乌斯·托勒密提出了一种新的日历系统,通过观察太阳的运行轨迹,他设计出了一种可以显示每一天日期的日历,这就是我们今天所使用的万年历。

万年历的原理基于太阳和月亮的运行轨迹。

太阳的运行轨迹是365.25天,而月亮的运行轨迹是29.53天。

通过这两者的结合,我们可以设计出一种可以精确显示
日期的日历系统。

在万年历中,将365天分为12个月,每个月的天数不同,通过
这种方式可以准确地显示每一天的日期。

除了太阳和月亮的运行轨迹外,万年历还考虑了闰年和闰月的影响。

由于太阳
的运行轨迹是365.25天,所以每隔4年我们就需要增加一天来弥补这个差距,这
就是闰年的概念。

而月亮的运行轨迹是29.53天,所以每隔一段时间我们也需要增
加一个月来弥补这个差距,这就是闰月的概念。

通过考虑闰年和闰月的影响,万年历可以精确地显示每一天的日期。

总的来说,万年历的原理是基于天文学和数学的结合,通过观察太阳和月亮的
运行轨迹,考虑闰年和闰月的影响,设计出一种可以精确显示日期的日历系统。

万年历不仅可以帮助人们记录时间,还可以帮助人们了解天文学的知识,是人类文明发展的重要成果。

多功能万年历

多功能万年历

多功能万年历
多功能万年历是一种具备多种功能的日历,通常有以下一些功能:
1.日期显示:显示当天的日期,包括年、月、日。

2.星期显示:显示当天是星期几,以方便用户了解当天是工作日还是休息日。

3.节日显示:显示当天是否是法定假日或其他特殊节日,方便用户安排假期和活动。

4.天气预报:提供当天和未来几天的天气预报信息,包括温度、天气状况等。

5.闹钟功能:设定定时提醒,例如设置起床、约会、会议等提醒功能。

6.备忘录功能:用户可记录重要事项、待办事项或个人计划,方便提醒和管理。

7.世界时间:提供不同地区的时间显示,方便用户进行跨时区的日常生活或商务往来。

8.农历显示:提供农历日期和相关的农历节日信息。

9.计算器功能:提供基本的数学计算功能,方便用户进行简单的计算。

10.记事功能:允许用户在具体日期上添加个人的文字和图
片备注,记录和分享生活中的点滴。

这些功能可以单独存在于一个软件或硬件设备中,也可以
集成在智能手机、平板电脑、智能手表等多种智能设备中。

多功能万年历的目的是方便用户管理时间、记录重要的日
程安排和提醒,提供更便捷的生活服务。

中华万年历全部记事

中华万年历全部记事

中华万年历全部记事1.引言1.1 概述中华万年历是中国传统历法的一种,历史悠久,起源可以追溯到古代的夏朝时期。

它记录了中华民族漫长的历史和文化传承,承载着丰富的记事内容。

中华万年历以天干地支纪年和十二地支纪月为主要方式,结合节气、传统节日等重要节点,系统地记录了中国人民的重要事件、农历、天文气象等信息。

中华万年历的特点之一是其独有的天干地支纪年系统。

天干地支是中国古代对时间的纪录方法,将时间按照十天干(甲、乙、丙、丁、戊、己、庚、辛、壬、癸)和十二地支(子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥)排列组合而成。

这种纪年方法的使用可以追溯到两千多年前的春秋战国时期,至今仍然在中国日常生活中广泛使用。

此外,中华万年历还包含了许多重要的记事内容和分类。

其中包括历史事件、政治演变、文化传承、人物事迹等方面的记载。

通过这些记事内容的呈现,我们可以更加全面地了解中国的历史和文化。

同时,中华万年历还将重要的节气和传统节日纳入其中,为我们提供了关于农历、天文气象等方面的信息。

这些内容的记录和分类不仅为后人研究历史提供了重要的参考,也对于了解中国人民的生活方式、宗教信仰和传统习俗具有重要意义。

综上所述,中华万年历作为中国传统历法的重要组成部分,在历史和文化方面具有重要的地位和价值。

它的起源和发展、记事内容和分类等方面的研究,对于我们更好地理解中国的历史和文化具有重要的意义。

同时,我们也应该加强对中华万年历的传承和保护,使其成为中华民族宝贵的文化遗产。

1.2 文章结构文章结构可以帮助读者更好地理解和组织文章的内容。

本文的结构主要分为引言、正文和结论三个部分。

引言部分主要包括概述、文章结构和目的。

概述部分介绍了中华万年历全部记事的主题和背景,引起读者对该话题的兴趣。

文章结构部分则对整篇文章的结构进行了说明,让读者能够清楚地了解接下来的内容安排。

目的部分阐明了撰写这篇文章的目的,即介绍中华万年历的全部记事,强调其历史和文化的重要性。

万年历 原理

万年历 原理

万年历原理
万年历是一种用于显示、计算和查询特定年月日的工具,它能够提供公历和农历的信息。

万年历的原理基于公历的周期性和农历的干支纪年。

公历是以太阳为基础的阳历,按照地球绕太阳的运行情况划分年、月、日。

公历的基本单位是日,一年有365天或366天。

万年历通过公历的周期性来计算和显示特定年份的日历。

农历是以月亮为基础的阴历,按照月亮围绕地球的运行情况划分年、月、日。

农历的基本单位是月,一年有12个月,每个月的天数不固定。

农历还使用干支纪年来表示年份,以十天干和十二地支的组合来表示每一年。

干支纪年的周期是60年,被称为“甲子”。

在万年历中,公历和农历的信息通过计算和推算来显示出来。

公历的日历部分通过考虑闰年和每个月的天数来显示,而农历的计算则涉及到复杂的数学和天文学知识。

通过计算公历和农历的相对关系,万年历能够提供公历和农历的对应日期。

万年历还可以通过查询特定年份的数据来显示出该年的重要日期,例如节假日、节气等。

这些日期可以通过万年历的预置表格或相应的算法来得到。

综上所述,万年历的原理是基于公历和农历的周期性,并通过计算和查询来显示和计算特定年份的日期信息。

2023年万年历-日历表

2023年万年历-日历表

January1月日一二三四五六1234567元旦十一十二十三小寒十五十六891011121314十七三九十九二十廿一廿二廿三15161718192021廿四廿五廿六四九廿八大寒除夕22232425262728春节初二初三初四初五五九初七293031初八初九初十May5月日一二三四五六123456劳动节十三十四青年节十六立夏78910111213十八十九二十廿一廿二廿三廿四14151617181920母亲节廿六廿七廿八廿九四月初二21222324252627小满初四初五初六初七初八初九28293031初十十一十二十三September9月日一二三四五六12十七十八3456789十九二十廿一廿二廿三白露廿五10111213141516教师节廿七廿八廿九三十八月初二17181920212223初三初四初五初六初七初八秋分24252627282930初十十一十二十三十四中秋节十六3月April4月三四五六日一二三四五1234初十十一十二九九891011234567妇女节十八十九二十十二十三十四清明节十六十七1516171891011121314廿四廿五廿六廿七十九二十廿一廿二廿三廿四22232425161718192021二月初二初三初四廿六廿七廿八廿九谷雨初二293031232425262728初八初九初十初四初五初六初七初八初九30十一7月August8月三四五六日一二三四五11234建党节建军节十六十七十八567867891011十八十九二十廿一二十廿一立秋廿三末伏廿五12131415131415161718廿五廿六廿七廿八廿七廿八廿九七月初二初三19202122202122232425初二初三中伏初五初五初六七夕节处暑初九初十262728292728293031初九初十十一十二十二十三十四中元节十六11月December12月三四五六日一二三四五12341十八十九二十廿一十九8910113456784月六1愚人节8十八15廿五22初三29初十8月六5十九12廿六19初四26十一12月六2二十9廿七16初四23十一30十八。

万年历原理

万年历原理

万年历原理
万年历是一种用来记录和显示日期的工具,它可以帮助人们方便地查看某一年、某一月或某一日的具体日期信息。

万年历的原理是基于公历的规律和历法计算。

公历是目前世界上最普遍使用的阳历,它采用太阳年和太阳日来计算时间。

太阳年的长度约为365.2425天,太阳日则是地
球绕太阳一周所需的时间。

然而,公历中规定的一年只有365天,为了弥补年与日之间的差距,每4年中会多出一个闰日,这一年就是闰年。

具体闰年的计算方法为:能被4整除但不能被100整除,或者能被400整除的年份都是闰年。

万年历的原理就是根据公历的规则计算某一天、某一月的具体日期,并配以星期的显示。

其中,星期的计算需要通过已知的起始日期和当天的天数差来确定,通常采用桥年法或詹森公式。

除了公历的基本原理,万年历还需要考虑其他因素,如月份的天数和每个月的起始日等。

一种广泛使用的万年历算法是蔡勒公式,它可以计算任意日期的星期、月份和日期。

根据这个算法,我们可以确定某一天是星期几,从而将日期显示在万年历上。

总之,万年历的原理是基于公历的规律和历法计算,它能够准确地显示任意日期的具体信息,帮助人们更方便地管理时间和安排日程。

记事万年历

记事万年历
说明:只需更改F3格年份,其他日期自动更新。
节日安排
2021年
1月
元旦节 1月1日 节日安排....
日一二三四五六
春节 2月12日 节日安排....
27 28 29 30 31 1 2
情人节 2月14日
3456789
元宵节 2月26日
10 11 12 13 14 15 16
妇女节 3月8日
17 18 19 20 21 22 23
9 10 11 12 13 14 15
国庆节 10月1日 节日安排....
16 17 18 19 20 21 22
23 24 25 26 27 28 29
爸爸生
日 妈妈生 日 老婆生
日 老公生
日 儿子生 日 女儿生 日 ....
重要日子安排 3月6日 生日安排.... 4月8日 生日安排.... 7月16日 生日安排.... 8月12日 生日安排.... 9月15日 生日安排.... 11月8日 生日安排....
30 31 1 2 3 4 5
2021年
9月
日一二三四五六
29 30 31 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 1 2
3456789
2021年
2月
日一二三四五六
31 1 2 3 4 5 6
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
1234567
2021年

万年历是什么

万年历是什么

万年历是什么万年历是中国古代传说中最古老的一部太阳历。

万年历是记录一定时间范围内(比如100年或更多)的具体阳历与阴历的日期的年历,方便有需要的人查询使用。

万年只是一种象征,表示时间跨度大。

[1]所使用的万年历,即包括若干年或适用于若干年的历书[2]。

现代的万年历能同时显示公历、农历和干支历等多套历法,更能包含黄历相关吉凶宜忌、节假日、提醒等多种功能信息,极为方便人们查询使用。

中文名万年历外文名perpetual calendar解释适用于很多年的历书属性是一种历书,不是一种历法功能黄历宜忌,节日,阳历,阴历,日期快速导航择日宜忌阳历与阴历万年历App在线万年历转换方法干支年历歌诀历史传说相传,在很久以前,有个名叫万年的青年,看到当时节令很乱,想把节令定准。

一天,他上山砍柴,坐在树阴下休息,树影的移动启发了他,他设计了一个测日影计天时的晷仪。

可是,天阴雨雾,影响测量。

后来,山崖上的滴泉引起了他的兴趣,他又动手做了一个五层漏壶。

天长日久,他发现每隔三百六十多天,天时的长短就会重复一遍。

当时的国君叫祖乙,天气风云的不测,使他很苦恼。

一个名叫阿衡的大臣,为讨好皇上,奏称要设天台敬祭天神。

祖乙认为有理,便带领百官去祭天,却无济于事。

万年知道后,忍不住就带着日晷和漏壶去见皇上,对祖乙讲清了日月运行的道理。

祖乙听后龙颜大悦,感到有道理。

于是把万年留下,在天坛前修建日月阁,筑起日晷台和漏壶亭。

并派了十二个童子服侍万年。

祖乙对万年说:"希望你能测准日月规律,推算出准确的晨夕时间,创建历法,为天下的黎民百姓造福。

"有一次,祖乙传旨要阿衡去了解万年测试历法的进展情况。

当他登上日月坛时,看见天坛边的石壁上刻着:日出日落三百六周而复始从头来。

草木枯荣分四时,一岁月有十二圆。

阿衡见此,知道万年的历法已研究成功,心中忐忑不安。

他万分惧怕万年因创建历法而得宠,国君会怪罪自己提出祭祀天神的主意。

于是,他阴谋策划,派了一个刺客去除掉万年。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

程序设计综合实践报告(C语言)项目名称:桌面万年历班级:信息与计算2010级1班姓名:郭玉豪学号:201001051506山东科技大学信息科学与工程学院2012年12月目录1. 项目概述 (3)1.1 需求陈述 (3)1.2 开发技术、环境与工具 (3)2. 软件需求 (4)2.1 功能性需求 (4)3. 软件架构设计 (4)4. 软件详细设计与实现 (5)4.1 主要模块的流程图 (5)4.2 核心代码 (5)5 总结与体会 (21)5.1遇到的问题与解决途径 (21)5.2 心得体会 (22)1. 项目概述1.1 需求陈述本项目是桌面时钟与万年历的实现,时钟可以实现年月日、时分秒、天干地支及生肖的输出,并且还能显示阴历的日期。

右击时钟会选中日历会出现日历的输出。

日历上显示今天阳历的年月日、阴历的年月日、干支年,生肖及图片,并且右边还有年和月的加减,点击今日按钮时间就立刻转的电脑本地的日期。

日历本身显现阳历与阴历,和国家法定节假日。

在日历的右上角有个取消按钮。

为了增加日历的外观,增加了换肤按钮,使得本万年历更加人性化。

1.2 开发技术、环境与工具1.2.1(DrawClockText)此函数给出了表盘的的年月日与时分秒、干支年和生效年的输出调用。

1.2.2(DrawCalendar)此函数是日历表的输出函数,它实现了日历表的输出阳历时间和阴历时间,生肖与干支年的输出。

1.2.3(用到的API函数)API函数参考:GetLocalTime: 获得当前时间(公历:年、月、日、周);MoveToEx: 移动划线的起点;LineTo: 绘制到某一点;SetTextColor: 设置要绘制的文字颜色;TextOut: 绘制文字;GetLocalTime:获得当前系统的本地时间;结构体类型参考:SYSTEMTIME: 描述时间类型,包括年月日、时分秒、周;系统调用:根据已给样本的提示,绘制了日历的矩形背景,并且也根据公历日期来计算出农历日期,并且标注了一些重要节日,像“春节、元宵节、国庆节、端午节、中秋节”等一些重要的节日,并且将节假日的字体颜色设置为红色,然后又写了获取当前系统本机时间的函数,成功的获得了当前本机的时间,这在日历中就可以观察到。

1.2.4本程序是在基于c语言下实现的,用到的工具就是microsoft visual studio 2008。

2. 软件需求2.1 功能性需求2.1.1void SunToLunar(const stDateTime* pSunDay,stDateTime* pLunarDay)此调用函数实现了将一个公立日期转为一个阴历日期,目前此函数还有一些错误。

2.1.2int GetDayOfWeek(const stDateTime* pSunDay)此函数将一个阳历日期输进去,判断这一天为星期几,然后返回一个整型数据。

2.1.3void DrawCalendar (HDC hDC)此函数是是日历表的输出,标出了当天时间,并且在每天下都对应着当天的阴历时间。

2.1.4void CalendarButtonEvent(UINT nID)此函数实现了日历的年份和月份按钮的增加或者减少。

2.1.5void DrawClockText(HDC hDC)此函数实现了表盘的输出,年月日时分秒,生效年,干支年,星期几。

3. 软件架构设计设计该万年历建了一个项目CalendarApp,该项目下有个头文件,源文件,资源文件,源文件中包括主程序main.c以及被调用的程序,资源文件中包括设置的万年历的外观,按钮设置……。

该软件调用外部图片,图片在image中。

在日期设置上:(1)根据公历日期获得农历日期,调用判断是不是闰年的函数,把一年中的农历所有月份的天数分为四类(28,29,30,31)。

(2)用FOR循环输出各月份的日历,并把周末的字体设为红色。

其余为黑色。

(3)在钟表上获得当前本地的系统时间。

(5)显示出星期、天干地支及农历日期。

详细设计过程:1、首先绘制日历的矩形背景,用CreateSolidBrush(函数做出矩形的背景颜色,在日历的上端和下端分别输出阳历的年月份,及阴历的天干地支年等。

2、判断农历的每月有多少天,调用判断是否为闰年的函数,若为闰年,则定义二月为29天,通过一switch 函数输出十二个月的天数。

3、调用公历转为农历的函数并用for循环获得每日的农历日期,并调用CreateSolidBrush(函数标出当天的日期,并设置了五个法定节假日提醒。

4、对日历上的几个按钮进行设置,使得当年月份发生改变时,日历表可以正常显示。

5、获得本地系统时间,在表盘上的正确位置输出当天的年月日(调用CreateFont函数按角度输出)及当地时间和星期。

6、用指针数组存放十二个月的英文和星期的英文缩写。

4. 软件详细设计与实现4.1 主要模块的流程图流程图为阳历和阴历的转换过程示意图。

4.2 核心代码#include"public.h"/********************************************************** API函数参考:GetLocalTime: 获得当前时间(公历:年、月、日、周)MoveToEx: 移动划线的起点LineTo: 绘制到某一点SetTextColor: 设置要绘制的文字颜色TextOut: 绘制文字GetLocalTime:获得当前系统的本地时间结构体类型参考:SYSTEMTIME: 描述时间类型,包括年月日、时分秒、周**********************************************************/HINSTANCE g_hInst;//保存操作系统传递进来的"应用程序实例句柄"typedef struct _stDateTime{int nYear;int nMonth;int nDay;}stDateTime;//定义表格,存储年-2099年的农历信息:每年的大小月、闰月信息、春节所在的公历日期unsigned int LunarCalendarTable[199] ={0x04AE53,0x0A5748,0x5526BD,0x0D2650,0x0D9544,0x46AAB9,0x056A4D,0x09AD42,0x24AEB6,0x04AE4A,/*1901-1910* /0x6A4DBE,0x0A4D52,0x0D2546,0x5D52BA,0x0B544E,0x0D6A43,0x296D37,0x095B4B,0x749BC1,0x049754,/*1911-1920* /0x0A4B48,0x5B25BC,0x06A550,0x06D445,0x4ADAB8,0x02B64D,0x095742,0x2497B7,0x04974A,0x664B3E,/*1921-1930* /0x0D4A51,0x0EA546,0x56D4BA,0x05AD4E,0x02B644,0x393738,0x092E4B,0x7C96BF,0x0C9553,0x0D4A48,/*1931-1940* /0x6DA53B,0x0B554F,0x056A45,0x4AADB9,0x025D4D,0x092D42,0x2C95B6,0x0A954A,0x7B4ABD,0x06CA51,/*1941-1950* /0x0B5546,0x555ABB,0x04DA4E,0x0A5B43,0x352BB8,0x052B4C,0x8A953F,0x0E9552,0x06AA48,0x6AD53C,/*1951-1960* /0x0AB54F,0x04B645,0x4A5739,0x0A574D,0x052642,0x3E9335,0x0D9549,0x75AABE,0x056A51,0x096D46,/*1961-1970* /0x54AEBB,0x04AD4F,0x0A4D43,0x4D26B7,0x0D254B,0x8D52BF,0x0B5452,0x0B6A47,0x696D3C,0x095B50,/*1971-1980* /0x049B45,0x4A4BB9,0x0A4B4D,0xAB25C2,0x06A554,0x06D449,0x6ADA3D,0x0AB651,0x093746,0x5497BB,/*1981-1990* /0x04974F,0x064B44,0x36A537,0x0EA54A,0x86B2BF,0x05AC53,0x0AB647,0x5936BC,0x092E50,0x0C9645,/*1991-2000* /0x4D4AB8,0x0D4A4C,0x0DA541,0x25AAB6,0x056A49,0x7AADBD,0x025D52,0x092D47,0x5C95BA,0x0A954E,/*2001-2010* /0x0B4A43,0x4B5537,0x0AD54A,0x955ABF,0x04BA53,0x0A5B48,0x652BBC,0x052B50,0x0A9345,0x474AB9,/*2011-2020* /0x06AA4C,0x0AD541,0x24DAB6,0x04B64A,0x69573D,0x0A4E51,0x0D2646,0x5E933A,0x0D534D,0x05AA43,/*2021-2030* /0x36B537,0x096D4B,0xB4AEBF,0x04AD53,0x0A4D48,0x6D25BC,0x0D254F,0x0D5244,0x5DAA38,0x0B5A4C,/*2031-2040* /0x056D41,0x24ADB6,0x049B4A,0x7A4BBE,0x0A4B51,0x0AA546,0x5B52BA,0x06D24E,0x0ADA42,0x355B37,/*2041-2050* /0x09374B,0x8497C1,0x049753,0x064B48,0x66A53C,0x0EA54F,0x06B244,0x4AB638,0x0AAE4C,0x092E42,/*2051-2060* /0x3C9735,0x0C9649,0x7D4ABD,0x0D4A51,0x0DA545,0x55AABA,0x056A4E,0x0A6D43,0x452EB7,0x052D4B,/*2061-2070* /0x8A95BF,0x0A9553,0x0B4A47,0x6B553B,0x0AD54F,0x055A45,0x4A5D38,0x0A5B4C,0x052B42,0x3A93B6,/*2071-2080* /0x069349,0x7729BD,0x06AA51,0x0AD546,0x54DABA,0x04B64E,0x0A5743,0x452738,0x0D264A,0x8E933E,/*2081-2090* /0x0D5252,0x0DAA47,0x66B53B,0x056D4F,0x04AE45,0x4A4EB9,0x0A4D4C,0x0D1541,0x2D92B5/*2091-2099*/};char* TianGanDizhi[60]={"甲子", "乙丑","丙寅","丁卯","戊辰","已巳","庚午","辛未","壬申","癸酉","甲戌","乙亥","丙子","丁丑","戊寅","已卯","庚辰","辛巳","壬午","癸未","甲申","乙酉","丙戌","丁亥","戊子","已丑","庚寅","辛卯","壬辰","癸巳","甲午","乙未","丙申","丁酉","戊戌","已亥","庚子","辛丑","壬寅","癸卯","甲辰","乙巳","丙午","丁未","戊申","已酉","庚戌","辛亥","壬子","癸丑","甲寅","乙卯","丙辰","丁巳","戊午","已未","庚申","辛酉","壬戌","癸亥"};char *ShengXiao[]={"鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","犬","猪"};char *DayTable[] ={"*","初一","初二","初三","初四","初五","初六","初七","初八","初九","初十","十一","十二","十三","十四","十五","十六","十七","十八","十九","二十","廿一","廿二","廿三","廿四","廿五","廿六","廿七","廿八","廿九","三十"};char *WeekTable[] ={"星期天","星期一","星期二","星期三","星期四","星期五","星期六"};char *MonthTable[] = {"*","正","二","三","四","五","六","七","八","九","十","十一","腊"};int Days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//定义表格,存储每月日离元旦的天数(不考虑瑞年)unsigned int MonthAdd[12] = {0,31,59,90,120,151,181,212,243,273,304,334};//定义用户要显示的年、月、日unsigned int nCurrentYear=0;unsigned int nCurrentMonth=0;unsigned int nCurrentDay=0;int count = 1; //控制背景图片、HBITMAP hBkmap;//得到图片//判断某年是否为公历瑞年int IsLeapYear(WORD iYear){//错误已更正if(((iYear%4 == 0)&&(iYear%100 != 0))||(iYear%400 == 0))return 1;elsereturn 0;}//公历日期转农历日期的函数void SunToLunar(const stDateTime* pSunDay,stDateTime* pLunarDay){int i=0;int SunDiff=0;int SpringDiff=0;int nSpringYear=pSunDay->nYear;int nSpringMonth=1;int nSpringDay=0;//计算当前公历日离当年元旦的天数SunDiff = MonthAdd[pSunDay->nMonth-1] + pSunDay->nDay - 1;if(IsLeapYear(pSunDay->nYear) && (pSunDay->nMonth > 2) )//若是闰年且大于月,天数再加SunDiff++;//计算春节所在公历日离元旦的天数:通过查表,计算当年的春节所在的公历日期,if(((LunarCalendarTable[pSunDay->nYear - 1901] & 0x60)>>5)==1)//若春节在公历月SpringDiff= (LunarCalendarTable[pSunDay->nYear-1901]&0x1F)-1;else//若春节在公历月SpringDiff= (LunarCalendarTable[pSunDay->nYear-1901]&0x1F)-1+31;//SunDiff和SpringDiff的差就是当前公历日离春节的天数if(SunDiff>SpringDiff)//公历日在春节后{int x = SunDiff - SpringDiff;int bLunar = (LunarCalendarTable[nSpringYear - 1901] & 0xF00000)>>20;//闰月月份i=0;nSpringMonth=1;for(;;){int a = (LunarCalendarTable[pSunDay->nYear-1901] & (0x80000>>i))>>(19-i);//计算大小月if(a==0)a=29;elsea=30;if(x<a)break;x =x - a;i++;nSpringMonth++;}nSpringDay =x+1;//如果有闰月if(nSpringMonth>bLunar && bLunar>0)nSpringMonth--;}else if(SunDiff<SpringDiff)//公历日在春节前{int x = SpringDiff-SunDiff;int nShift=0;int Shift=0;int bLunar = (LunarCalendarTable[nSpringYear - 1901-1] & 0xF00000)>>20;//闰月月份i=0;nSpringYear--;//需要上一年的农历信息nSpringMonth=12;//从最后一个月开始计算if (bLunar == 0)//如果没有闰月{nShift = 0x100;Shift=8;}else{nShift = 0x80;Shift=7;}for(;;){int a = (LunarCalendarTable[nSpringYear-1901] & (nShift<<i))>>(Shift+i);//计算大小月if(a==0)a=29;elsea=30;if(x<=a){x = a-x;break;}x =x - a;i++;nSpringMonth--;}nSpringDay =x+1;if(nSpringMonth<bLunar && bLunar>0)nSpringMonth++;}else {nSpringMonth= 1;nSpringDay = 1;}pLunarDay->nYear = nSpringYear;pLunarDay->nMonth= nSpringMonth;pLunarDay->nDay = nSpringDay;}//根据公历日期获得星期int GetDayOfWeek(const stDateTime* pSunDay){//根据泰勒公式//nWeek = [nYear1÷] - 2*nYear1 + nYear2 + [nYear2÷] + [26(nMonth+1)÷] + nDay - 1 int nWeek=0;int nYear1=pSunDay->nYear/100;//年的前两位数字int nYear2=pSunDay->nYear%100;//年的后两位数字int nDay=pSunDay->nDay; //公立日int nMonth=pSunDay->nMonth;//公立月数,所求的月份如果是月或月,//则应视为上一年的月或月,//也就是公式中nMonth的取值范围是从到而不是从到if(nMonth==1 || nMonth==2){nMonth=12+nMonth;nYear1=(pSunDay->nYear-1)/100;//年的前两位数字nYear2=(pSunDay->nYear-1)%100;//年的后两位数字}nWeek = nYear1/4 - 2*nYear1 + nYear2 + nYear2/4 + (26*(nMonth+1))/10 + nDay - 1;if(nWeek >= 0)nWeek = nWeek%7;//else{nWeek = nWeek%7;nWeek += 7;}return nWeek;}//根据公立年得到农历干支年char* GetGanZhi(int nYear){return TianGanDizhi[nYear%60-4];}//根据公立年得到农历生肖char* GetShengXiao(int nYear){int judge = (nYear%60-3-1)%12;return (judge >= 0) ? ShengXiao[judge]:ShengXiao[judge+12];}int GetShengXiaoID(int nYear){int judge = (nYear%60-3-1)%12;return (judge >= 0) ? judge:judge+12;}//Windows程序入口函数int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ) {g_hInst = hInstance;ShowClockDlg();}//日历绘制函数,学员自己实现该函数void DrawCalendar(HDC hDC,int nWidth,int nHeight){SYSTEMTIME datetime;int week, i, j = 67, k = 0, days, init;int a, b, c;//记录阴历年、月、日char tttt[100];HDC hdcMem;HBITMAP hbmp;BITMAP bmp;HBRUSH hbrush;HPEN hpen;RECT rc;stDateTime sundate,lunardate,sundate_today;GetLocalTime(&datetime);//获取当前时间sundate_today.nDay=datetime.wDay;sundate_today.nMonth=datetime.wMonth;sundate_today.nYear=datetime.wYear;SunToLunar(&sundate_today.nYear,&lunardate);//阳历转阴历i=lunardate.nYear;//(阴)年j=lunardate.nMonth;//(阴)月k=lunardate.nDay;//(阴)日//--------------------绘制窗体背景,加载背景图片-----------------------------// (count > 12) ? (count = 1): count;hdcMem = CreateCompatibleDC(hDC);wsprintf(tttt,"../image/skin/%d.bmp",count);hdcMem=CreateCompatibleDC(hDC);hbmp = (HBITMAP)LoadImage(g_hInst,tttt ,IMAGE_BITMAP,600,500,LR_LOADFROMFILE);GetObject(hbmp, sizeof(BITMAP), &bmp);SelectObject(hdcMem,hbmp);BitBlt(hDC, 0, 0, bmp.bmWidth, bmp.bmHeight, hdcMem, 0, 0, SRCCOPY);DeleteObject(hbmp);//-----------------------输出阳历当日日期---------------------------------------// hpen=GetStockObject(DEFAULT_GUI_FONT);SelectObject(hDC,hpen);SetTextColor(hDC,RGB(250,0,0));wsprintf(tttt,"今天是%d-%d-%d",datetime.wYear,datetime.wMonth,datetime.wDay);TextOut(hDC,100,30,tttt,strlen(tttt));//----------------------输出阴历当日日期----------------------------------------// wsprintf(tttt,"农历%s月%s日",MonthTable[j], DayTable[k]);TextOut(hDC,300,30,tttt,strlen(tttt));//----------------------输出天干地支及生肖----------------------------------------// wsprintf(tttt,"%s%s年",GetGanZhi(i),GetShengXiao(i));TextOut(hDC,15,30,tttt,strlen(tttt));TextOut(hDC,550,282,"年",2);TextOut(hDC,550,310,"月",2);if(nCurrentYear == 0)//如果还没设定当前时间{nCurrentDay=datetime.wDay;nCurrentMonth=datetime.wMonth;nCurrentYear=datetime.wYear;}sundate.nDay=nCurrentDay;sundate.nMonth=nCurrentMonth;sundate.nYear=nCurrentYear;week = GetDayOfWeek(&sundate);SunToLunar(&sundate,&lunardate);//阳历转阴历i=lunardate.nYear;//(阴)年j=lunardate.nMonth;//(阴)月k=lunardate.nDay;//(阴)日//设置日历表变化年hpen=(HPEN)CreateFont(15,10,0,0,9,FALSE,FALSE,FALSE,DEFAULT_CHARSET,OUT_CHARACTER_PRECIS,CLIP_DEFAULT_ PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH,"黑体");SelectObject(hDC,hpen);SetTextColor(hDC,RGB(250,0,0));//颜色设置wsprintf(tttt,"%d",sundate.nYear);TextOut(hDC,500,280,tttt,strlen(tttt));hpen=GetStockObject(DEFAULT_GUI_FONT);SelectObject(hDC,hpen);//设置日历表变化月hpen=(HPEN)CreateFont(15,10,0,0,9,FALSE,FALSE,FALSE,DEFAULT_CHARSET,OUT_CHARACTER_PRECIS,CLIP_DEFAULT_ PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH,"黑体");SelectObject(hDC,hpen);SetTextColor(hDC,RGB(250,0,0));//颜色设置wsprintf(tttt,"%d",sundate.nMonth);(strlen(tttt)==1) ? TextOut(hDC,525,305,tttt,strlen(tttt)):TextOut(hDC,525,305,tttt,strlen(tttt));//--------------------输出日历表--------------------------------------------//hpen=(HPEN)CreateFont(15,8,0,0,9,FALSE,FALSE,FALSE,DEFAULT_CHARSET,OUT_CHARACTER_PRECIS,CLIP_DEFAULT_P RECIS,DEFAULT_QUALITY,DEFAULT_PITCH,"黑体");SelectObject(hDC,hpen);SetTextColor(hDC,RGB(120,120,0));//设置日历字体颜色sundate.nDay=1;week = GetDayOfWeek(&sundate);days = Days[nCurrentMonth];//当月有多少天init = 58;i = (week-1)*67+init;j = 105;(week == 0) ? (j = j-50):j;//如果第一天为星期天for(k = 1;k<=days;k++)//核心算法{SetTextColor(hDC,RGB(255,0,0));//设置星期天颜色sundate.nDay=k;sundate.nMonth =nCurrentMonth;sundate.nYear=nCurrentYear;SunToLunar(&sundate,&lunardate);//阳历转阴历a=lunardate.nYear;//(阴)年b=lunardate.nMonth;//(阴)月c=lunardate.nDay;//(阴)日i = i+67;if((week+k-1)%7==0)//每过一星期换行{j = j+50;i = init;}if(k==datetime.wDay && nCurrentYear==datetime.wYear&& nCurrentMonth==datetime.wMonth)//背景色标注当前日期 {SetRect (&rc,i-28,j-10, i+38, j+40);hbrush=CreateSolidBrush(RGB(250,0,0));FillRect(hDC,&rc,hbrush);}SetTextColor(hDC,RGB(250,0,0));//节日颜色if(sundate.nMonth==1&&sundate.nDay==1)//法定节假日{TextOut(hDC,i-10,j,"元旦",4);}else if(sundate.nMonth==10&&sundate.nDay==1){TextOut(hDC,i-18,j,"国庆节",6);}else{if((week+k-1)%7==0 || (week+k-1)%7==6)SetTextColor(hDC,RGB( 255, 0, 0));//公立日期颜色(周六周天颜色特殊) elseSetTextColor(hDC,RGB( 0, 64, 0));wsprintf(tttt, "%d", k);//显示公历TextOut(hDC,i, j,tttt,strlen(tttt));}//显示农历SetTextColor(hDC,RGB(250,0,0));//节日颜色if(b==1&&c==1){TextOut(hDC,i-10,j+20,"春节",4);//农历节日显示}else if(b==1&&c==15){TextOut(hDC,i-18,j+20,"元宵节",6);//农历节日显示}else if(b==5&&c==5){TextOut(hDC,i-18,j+20,"端午节",6);//农历节日显示}else if(b==8&&c==15){TextOut(hDC,i-18,j+20,"中秋节",6);//农历节日显示}else if(c == 1)//每月一号显示当前月,否则显示日期{SetTextColor(hDC,RGB(200,0,50));//阴历日期颜色(月份)wsprintf(tttt, "%s月", MonthTable[b]);//输出阴历时间(月份)TextOut(hDC,i-10, j+20,tttt,strlen(tttt));}else{SetTextColor(hDC,RGB(0,128,255));//阴历日期颜色wsprintf(tttt, "%s", DayTable[c]);TextOut(hDC,i-10, j+20,tttt,strlen(tttt));}hdcMem= CreateCompatibleDC(hDC);//通过光栅运算消除底色switch((nCurrentYear-4)%12){case 0:hBkmap = (HBITMAP)LoadImage(g_hInst,"../Image/shengxiao/1.bmp",IMAGE_BITMAP,50,50,LR_LOADFROMFILE);break;case 1:hBkmap = (HBITMAP)LoadImage(g_hInst,"../Image/shengxiao/2.bmp",IMAGE_BITMAP,50,50,LR_LOADFROMFILE);break;case 2:hBkmap = (HBITMAP)LoadImage(g_hInst,"../Image/shengxiao/3.bmp",IMAGE_BITMAP,50,50,LR_LOADFROMFILE);break;case 3:hBkmap = (HBITMAP)LoadImage(g_hInst,"../Image/shengxiao/4.bmp",IMAGE_BITMAP,50,50,LR_LOADFROMFILE);break;case 4:hBkmap = (HBITMAP)LoadImage(g_hInst,"../Image/shengxiao/5.bmp",IMAGE_BITMAP,50,50,LR_LOADFROMFILE);break;case 5:hBkmap = (HBITMAP)LoadImage(g_hInst,"../Image/shengxiao/6.bmp",IMAGE_BITMAP,50,50,LR_LOADFROMFILE);break;case 6:hBkmap = (HBITMAP)LoadImage(g_hInst,"../Image/shengxiao/7.bmp",IMAGE_BITMAP,50,50,LR_LOADFROMFILE);break;case 7:hBkmap = (HBITMAP)LoadImage(g_hInst,"../Image/shengxiao/8.bmp",IMAGE_BITMAP,50,50,LR_LOADFROMFILE);break;case 8:hBkmap = (HBITMAP)LoadImage(g_hInst,"../Image/shengxiao/9.bmp",IMAGE_BITMAP,50,50,LR_LOADFROMFILE);break;case 9:hBkmap = (HBITMAP)LoadImage(g_hInst,"../Image/shengxiao/10.bmp",IMAGE_BITMAP,50,50,LR_LOADFROMFILE);break;case 10:hBkmap = (HBITMAP)LoadImage(g_hInst,"../Image/shengxiao/11.bmp",IMAGE_BITMAP,50,50,LR_LOADFROMFILE);break;case 11:hBkmap = (HBITMAP)LoadImage(g_hInst,"../Image/shengxiao/12.bmp",IMAGE_BITMAP,50,50,LR_LOADFROMFILE);break;}SelectObject(hdcMem,hBkmap);BitBlt(hDC,500,350,100,100,hdcMem,-10,-10,SRCCOPY);}hpen = CreatePen(PS_SOLID, 2, RGB(100,100,100));//设置画笔SelectObject(hDC, hpen);//为设备环境配置画笔//画框架for(i = 95; i < 400; i += 50)//画横线{MoveToEx (hDC, 30, i, NULL);LineTo (hDC, 498, i);}for(i = 30; i < 500;i += 67)//画竖线{MoveToEx (hDC, i, 95, NULL);LineTo (hDC, i, 395);}//输出文字j = 70;hpen=(HPEN)CreateFont(12,5,0,0,4,FALSE,FALSE,FALSE,DEFAULT_CHARSET,OUT_CHARACTER_PRECIS,CLIP_DEFAULT_P RECIS,DEFAULT_QUALITY,DEFAULT_PITCH,"黑体");hpen=GetStockObject(DEFAULT_GUI_FONT);SelectObject(hDC,hpen);SetTextColor(hDC,RGB(255,255,0));TextOut(hDC,35,76,"星期日",6);TextOut(hDC,35+j,76,"星期一",6);TextOut(hDC,35+2*j,76,"星期二",6);TextOut(hDC,35+3*j,76,"星期三",6);TextOut(hDC,35+4*j,76,"星期四",6);TextOut(hDC,35+5*j,76,"星期五",6);TextOut(hDC,35+6*j,76,"星期六",6);}//事件函数:点击日历界面上各个按钮后被调用,学员自己实现该函数//注意:该函数调用完后,系统自动调用DrawCalendar函数// 因此,可以理解为,该函数和DrawCalendar函数是联动的void CalendarButtonEvent(UINT nID){if(nID==IDC_BTN_YEARUP)//点击了"年↑"按钮nCurrentYear++;}else if(nID==IDC_BTN_YEARDOWN)//点击了"年↓"按钮{nCurrentYear--;}if(nID==IDC_BTN_MONTHUP)//点击了"月↑"按钮{if(nCurrentMonth==12){nCurrentYear++;nCurrentMonth=1;}else{nCurrentMonth++;}}else if(nID==IDC_BTN_MONTHDOWN)//点击了"月↓"按钮{if(nCurrentMonth==1){nCurrentYear--;nCurrentMonth=12;}else{nCurrentMonth--;}}else if(nID==IDC_BTN_SKIN){//绘制窗体背景,加载背景图片count++;}if(nID==IDC_BTN_TODAY)//今天的按钮{SYSTEMTIME DateTime;GetLocalTime(&DateTime);nCurrentMonth=DateTime.wMonth;nCurrentYear=DateTime.wYear;nCurrentDay=DateTime.wDay;}//...}//--------------------输出表盘信息--------------------------------------------// void DrawWeek(HDC hDC,int week)//输出表盘的星期{HFONT newFont;int x=35,y=36;newFont=CreateFont(10,9,0,0,0,0,0,0,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH | FF_DONTCARE,NULL);SelectObject(hDC,newFont);switch(week){case 0:TextOut(hDC,x,y,TEXT("星期日"),6);break;case 1:TextOut(hDC,x,y,TEXT("星期一"),6);break;case 2:TextOut(hDC,x,y,TEXT("星期二"),6);break;case 3:TextOut(hDC,x,y,TEXT("星期三"),6);break;case 4:TextOut(hDC,x,y,TEXT("星期四"),6);break;case 5:TextOut(hDC,x,y,TEXT("星期五"),6);break;default:TextOut(hDC,x,y,TEXT("星期六"),6);break;}}void DrawGanZhi(HDC hDC,int year)//输出表盘的天干地支{char *ch;TCHAR szBuffer[12];ch=GetGanZhi(year);wsprintf(szBuffer,"%s",ch);SetTextColor(hDC,RGB(2,128,0));//文字颜色TextOut(hDC,34,72,szBuffer,4);//输出年份TextOut(hDC,73,73,TEXT("年"),2);}void DrawLunar(HDC hDC) //输出表盘的阳历、阴历日期{TCHAR szBuffer[21];SYSTEMTIME DateTime;stDateTime SunDay,LunarDay;GetLocalTime(&DateTime);SunDay.nYear= DateTime.wYear;SunDay.nMonth= DateTime.wMonth;SunDay.nDay =DateTime.wDay;SunToLunar(&SunDay,&LunarDay);wsprintf(szBuffer,"%s月%s",MonthTable[LunarDay.nMonth],DayTable[LunarDay.nDay]);SetTextColor(hDC,RGB(255,0,0));//文字颜色if(LunarDay.nMonth==11)TextOut(hDC,20,90,szBuffer,4);TextOut(hDC,30,90,szBuffer,8);}//该函数每.5秒被调用一次,时钟界面上的文字绘制,学员自己实现该函数void DrawClockText(HDC hDC)//表盘函数调用{SYSTEMTIME DateTime;//获得当前系统的本地时间int week=0,year=0;GetLocalTime(&DateTime);week=DateTime.wDayOfWeek;year=DateTime.wYear;SetTextColor(hDC,RGB(200,200,2));//设置星期颜色DrawWeek(hDC,week);DrawGanZhi(hDC,year);DrawLunar( hDC);}5 总结与体会5.1遇到的问题与解决途径5.1.1 (问题:日历表的阳历日期在有的月输出时正确,有的月就输出到表格外面以及有的月份初一显示为*)解决方法:问题是出现在计算日期输出时出现了个bug,在跟同学探讨后,经老师指点,修正后,问题就解决啦。

相关文档
最新文档