用easyx做万年历代码
时间: 2023-09-12 11:10:12 浏览: 103
以下是用 EasyX 绘制万年历的代码,具体注释见代码中:
```c++
#include <graphics.h>
#include <conio.h>
#include <stdio.h>
#include <time.h>
// 定义日历的行数和列数
#define ROWS 6
#define COLS 7
// 定义日历的起始年份和结束年份
#define START_YEAR 1900
#define END_YEAR 2099
// 定义每个月的天数
int daysOfMonth[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
// 定义星期几的名称
char* weekName[] = { "Sun","Mon","Tue","Wed","Thu","Fri","Sat" };
// 定义颜色
COLORREF colorWeekend = RGB(255, 0, 0);
COLORREF colorToday = RGB(0, 0, 255);
COLORREF colorOtherDay = RGB(0, 0, 0);
// 获取某年某月的天数
int getDaysOfMonth(int year, int month)
{
if (month == 1 && ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)) {
return 29;
}
return daysOfMonth[month];
}
// 获取某年某月的第一天是星期几
int getFirstDayOfWeek(int year, int month)
{
time_t t = time(NULL);
struct tm* today = localtime(&t);
today->tm_year = year - 1900;
today->tm_mon = month - 1;
today->tm_mday = 1;
mktime(today);
return today->tm_wday;
}
// 绘制日历
void drawCalendar(int year, int month)
{
// 创建绘图窗口
initgraph(500, 400);
// 设置背景色为白色
setbkcolor(WHITE);
// 设置字体
settextstyle(20, 0, "宋体");
// 计算每个格子的宽度和高度
int width = getwidth() / COLS;
int height = (getheight() - 40) / ROWS;
// 绘制日历表头
char header[20];
sprintf_s(header, "%d年%d月", year, month);
outtextxy(getwidth() / 2 - textwidth(header) / 2, 10, header);
// 绘制星期几
settextstyle(16, 0, "宋体");
for (int i = 0; i < COLS; i++) {
outtextxy(i * width, 40, weekName[i]);
}
// 计算本月第一天是星期几
int firstDayOfWeek = getFirstDayOfWeek(year, month);
// 计算本月的天数
int daysOfMonth = getDaysOfMonth(year, month);
// 绘制日期
settextstyle(20, 0, "宋体");
for (int i = 1; i <= daysOfMonth; i++) {
// 计算日期所在的行和列
int row = (i + firstDayOfWeek - 1) / COLS;
int col = (i + firstDayOfWeek - 1) % COLS;
// 计算日期所在的坐标
int x = (col - 1) * width;
int y = (row - 1) * height + 60;
// 绘制日期
char date[3];
sprintf_s(date, "%d", i);
outtextxy(x + width / 2 - textwidth(date) / 2, y + height / 2 - textheight(date) / 2, date);
// 如果是周末,设置颜色为红色
if (col == 1 || col == 7) {
settextcolor(colorWeekend);
}
else {
settextcolor(colorOtherDay);
}
// 如果是今天,设置颜色为蓝色
if (i == today->tm_mday && year == today->tm_year + 1900 && month == today->tm_mon + 1) {
settextcolor(colorToday);
}
}
// 暂停窗口
getch();
// 关闭绘图窗口
closegraph();
}
// 主函数
int main()
{
// 获取当前时间
time_t t = time(NULL);
struct tm* today = localtime(&t);
// 循环绘制万年历
for (int year = START_YEAR; year <= END_YEAR; year++) {
for (int month = 1; month <= 12; month++) {
drawCalendar(year, month);
}
}
return 0;
}
```
在代码中,我们使用了 EasyX 绘制图形界面,并使用了 time.h 库来获取当前时间,实现了自动判断今天的日期,并将今天的日期用蓝色表示。