📄 calendar.c
字号:
/*********************************************************************
Project Name : pda solive
Title : set up date
File Name : Calendar.c
**********************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <ppsm.h>
#include <asixwin.h>
#include <asixapp.h>
#include <asixwin\disp.h>
#include <asixwin\asix_lb.h>
//#include <hardware\drball\m68328.h>
//#include <hardware\drball\hc.h>
#include <sys\rtc.h>
#include <resource\bitmap.h>
#include "yinli.h"
#include "calendar.h"
//注册表
//TASKDESCRIPTION CALTskDesp =
//{"CALENDAR", ASIX_APP, 0, yingyong, 2048, 1, LCD_WIDTH, LCD_HEIGHT, Calendar, APP_PRI};
void Calendar()
{
U32 hgc;
//窗口和控件ID
U32 mainwin;
U32 tskbar;
U32 ok; //确定按钮
U32 cancel; //取消按钮
U32 timeset; //时间设置按钮
U32 yeardisp, monthdisp; //年,月的显示框
U32 yeartip; //年的提示
// U32 datetip; //日期提示
U32 yinlitip; //阴历提示
U32 yinli; //阴历的显示框
U32 uparrow; //向上按钮
U32 downarrow; //向下按钮
//函数变量
S16 xSrc,ySrc,xDest,yDest;
U8 yearchange = 0;
const char *weekName[7]={"日",
"一",
"二",
"三",
"四",
"五",
"六",
};
char line[30];
U16 i;
const U8 monthDay[]={31,28,31,30,31,30,31,31,30,31,30,31};
U8 monthDayLen;
U8 firstDayPos;
U32 daydisp;
U8 quit = 0;
WORD xpos, ypos; //笔点击的坐标
U8 dragflag = 0xff;
U8 nowitem = 0xff;
S16 nowyear;
S16 nowmonth;
S16 nowday;
S16 temp;
MSG msg;
ASIX_DATE date;
ASIX_TIME time;
//初始化
struct LBOX_ITEM lboxitem[] =
{
ICON_ENABLE, UNDERLINE, "一月",
ICON_ENABLE, UNDERLINE, "二月",
ICON_ENABLE, UNDERLINE, "三月",
ICON_ENABLE, UNDERLINE, "四月",
ICON_ENABLE, UNDERLINE, "五月",
ICON_ENABLE, UNDERLINE, "六月",
ICON_ENABLE, UNDERLINE, "七月",
ICON_ENABLE, UNDERLINE, "八月",
ICON_ENABLE, UNDERLINE, "九月",
ICON_ENABLE, UNDERLINE, "十月",
ICON_ENABLE, UNDERLINE, "十一月",
ICON_ENABLE, UNDERLINE, "十二月",
ICON_END, UNDERLINE, NULL
};
hgc = GetGC();
ReadDateTime( &date, &time );
nowday = date.day;
nowmonth = date.month;
nowyear = date.year;
sprintf(line, "%2d", nowyear);
// mainwin = CreateWindow(WNDCLASS_WIN, "系统日期", WS_OVERLAPPEDWINDOW, 0, 0, LCD_WIDTH, LCD_HEIGHT, 0, 0, NULL);
mainwin = CreateWindow(WNDCLASS_WIN, "系统日期", WS_OVERLAPPEDWINDOW, 0, 0, LCD_WIDTH, LCD_HEIGHT, 0, 0, NULL);
tskbar = CreateWindow(WNDCLASS_TSKBAR, NULL, WS_CHILD|TBS_TYPICAL, 0, 0, 0, 0,mainwin, 0, NULL);
// datetip = CreateWindow(WNDCLASS_STATIC, "日期:", WS_CHILD|SS_TEXT|SS_LEFT, 5, 35, 30, 16, mainwin, 0, NULL);
yeardisp = CreateWindow(WNDCLASS_STATIC, line, WS_CHILD|SS_TEXT|SS_BOARD|SS_ALIGN, LCD_WIDTH/24, 25, LCD_WIDTH/4, LCD_HEIGHT/10, mainwin, 0, NULL);
yeartip = CreateWindow(WNDCLASS_STATIC, "年", WS_CHILD|SS_TEXT, LCD_WIDTH*1/2 - 7 , 25, 14, 24, mainwin, 0, NULL);
uparrow = CreateWindow(WNDCLASS_BUTTON, NULL, WS_CHILD|BS_ICON|BS_FLAT|BS_BOARD, LCD_WIDTH*7/24, 25, LCD_WIDTH/12, LCD_HEIGHT/20, mainwin, 0, (char *)up7x7);
downarrow = CreateWindow(WNDCLASS_BUTTON, NULL, WS_CHILD|BS_ICON|BS_FLAT|BS_BOARD, LCD_WIDTH*7/24, 25 + LCD_HEIGHT/20 , LCD_WIDTH/12, LCD_HEIGHT/20, mainwin, 0, (char *)down7x7);
monthdisp = CreateWindow(WNDCLASS_LIST, "ListBox", WS_CHILD|LBS_POPUP, LCD_WIDTH*2/3 - LCD_WIDTH/24, 25, LCD_WIDTH/3, LCD_HEIGHT/10, mainwin, 0, lboxitem);
SelectListBox(monthdisp, (U8)(nowmonth - 1));
//显示阴历
if(nowyear <= 2030 && nowyear >= 1900)
yyhs(line,nowyear,nowmonth,nowday);
else
if(MessageBox(mainwin, "阴历只能在1900-2030年之间!", "提醒", MB_ICONEXCLAMATION|MB_OK) == IDOK)
memset(line, 0x00, 30);
yinlitip = CreateWindow(WNDCLASS_STATIC, "农历:", WS_CHILD|SS_TEXT|SS_LEFT, 5, LCD_HEIGHT - 70, LCD_WIDTH/8, 25, mainwin, 0, NULL);
yinli = CreateWindow(WNDCLASS_STATIC, line, WS_CHILD|SS_TEXT|SS_LEFT, 40, LCD_HEIGHT - 70, LCD_WIDTH/4, 25, mainwin, 0, NULL);
ok = CreateWindow(WNDCLASS_BUTTON, "保存设置", WS_CHILD|BS_ICON|BS_FLAT|BS_BOARD, 1, LCD_HEIGHT-45, LCD_WIDTH/3, 25, mainwin, 0, NULL);
timeset = CreateWindow(WNDCLASS_BUTTON, "时间设置", WS_CHILD|BS_ICON|BS_FLAT|BS_BOARD, LCD_WIDTH/3, LCD_HEIGHT-45, LCD_WIDTH/3, 25, mainwin, 0, NULL);
cancel = CreateWindow(WNDCLASS_BUTTON, "恢复设置", WS_CHILD|BS_ICON|BS_FLAT|BS_BOARD, LCD_WIDTH*2/3,LCD_HEIGHT-45, LCD_WIDTH-LCD_WIDTH*2/3, 25, mainwin, 0, NULL);
EnableWindow( ok, FALSE );
EnableWindow( cancel, FALSE );
//创建active area
xSrc=1;
ySrc=DATE_BEGIN_YPOS - 1;
//xDest= LCD_WIDTH - 1;
xDest= LCD_WIDTH - 1;
yDest= LCD_HEIGHT - 65;
ActiveAreaEnable( (P_U32)&daydisp,INPUT_AREA,CONTINUOUS_MODE,xSrc,ySrc,xDest,yDest, 0);
//显示星期
for(i=0;i<DAY_LINE_NUM;i++)
{
xSrc=i*(DAY_ITEM_LEN + DAY_GAP) + DAY_GAP;
ySrc=60;
Disp16String((char *)weekName[i],xSrc,ySrc);
}
//获得当前月的长度
if(nowmonth==2)
{
if((nowyear%4==0 && nowyear%100 != 0) || (nowyear%400 == 0)) //闰年时二月29天,平时二月28天
monthDayLen=29;
else monthDayLen=28;
}
else monthDayLen=monthDay[nowmonth-1];
firstDayPos=CalculateWeek(nowyear,nowmonth,1);
for(i=0; i<monthDayLen; i++)
{
xSrc=DATE_BEGIN_XPOS+((i+firstDayPos)%DAY_LINE_NUM)*(DAY_ITEM_LEN + DAY_GAP);
ySrc=DATE_BEGIN_YPOS+((i+firstDayPos)/DAY_LINE_NUM)*DAY_ITEM_LEN;
xDest=xSrc+DAY_ITEM_LEN;
yDest=ySrc+DAY_ITEM_LEN;
sprintf(line,"%2d",i+1);
Disp16String(line,xSrc,ySrc);
if(i==nowday-1)
{
nowitem = i + firstDayPos;
InvRec(hgc, xSrc-(DAY_ITEM_LEN-14)/2, ySrc-(DAY_ITEM_LEN-10)/2,DAY_ITEM_LEN,DAY_ITEM_LEN);
}
}
while(!quit)
{
ASIXGetMessage( &msg, NULL, 0, 0 );
switch( msg.message )
{
case WM_COMMAND:
if(msg.lparam == uparrow) //
{
nowyear += 1;
yearchange = 1;
EnableWindow( ok, TRUE );
EnableWindow( cancel, TRUE );
}
else
if(msg.lparam == downarrow)
{
nowyear -= 1;
yearchange = 1;
EnableWindow( ok, TRUE );
EnableWindow( cancel, TRUE );
}
else
if(msg.lparam == timeset)
{
//进入时间设置
quit = 1;
}
else
if(msg.lparam == cancel)
{
//重新读入日期
ReadDateTime( &date, &time );
if(nowday != date.day || nowyear != date.year || nowmonth != date.month)
{
nowyear = date.year;
nowmonth = date.month;
nowday = date.day;
//更新年份
sprintf(line, "%2d", nowyear);
SetWindowText(yeardisp, line, NULL);
//更新月份
SelectListBox(monthdisp, (U8)(nowmonth - 1));
//清空day的显示区
xSrc=1;
ySrc=DATE_BEGIN_YPOS - 10;
//xDest= LCD_WIDTH - 1;
//yDest= 173;
xDest= LCD_WIDTH - 1;
yDest= LCD_HEIGHT - 65;
ClearRec(hgc, WHITE,xSrc,ySrc,xDest-xSrc,yDest-ySrc, REPLACE_STYLE);
//获得当前月的长度
if(nowmonth==2)
{
if((nowyear%4==0 && nowyear%100 != 0) || (nowyear%400 == 0)) //闰年时二月29天,平时二月28天
monthDayLen=29;
else monthDayLen=28;
}
else monthDayLen=monthDay[nowmonth-1];
//更新日期
firstDayPos=CalculateWeek(nowyear,nowmonth,1);
for(i=0; i<monthDayLen; i++)
{
xSrc=DATE_BEGIN_XPOS+((i+firstDayPos)%DAY_LINE_NUM)*(DAY_ITEM_LEN + DAY_GAP);
ySrc=DATE_BEGIN_YPOS+((i+firstDayPos)/DAY_LINE_NUM)*DAY_ITEM_LEN;
xDest=xSrc+DAY_ITEM_LEN;
yDest=ySrc+DAY_ITEM_LEN;
sprintf(line,"%2d",i+1);
Disp16String(line,xSrc,ySrc);
if(i == nowday-1)
{
nowitem = i + firstDayPos;
//InvRec(hgc, xSrc,ySrc,xDest-xSrc,yDest-ySrc);
InvRec(hgc, xSrc-(DAY_ITEM_LEN-14)/2, ySrc-(DAY_ITEM_LEN-10)/2,DAY_ITEM_LEN,DAY_ITEM_LEN);
}
}
//更新阴历的显示
if(nowyear <= 2030 && nowyear >= 1900)
{
ClearRec(hgc, WHITE,40,LCD_HEIGHT - 70,LCD_WIDTH/2, 25, REPLACE_STYLE);
yyhs(line,nowyear,nowmonth,nowday);
SetWindowText(yinli, line, NULL);
}
else
{
SetWindowText(yinli, "", NULL);
}
}
EnableWindow( ok, FALSE );
EnableWindow( cancel, FALSE );
}
else
if(msg.lparam == ok)
{
date.year = nowyear;
date.month = nowmonth;
date.day = nowday;
SetGlobalDate( &date );
EnableWindow( ok, FALSE );
EnableWindow( cancel, FALSE );
}
if(yearchange)
{
//更新年份显示
sprintf(line, "%2d", nowyear);
SetWindowText(yeardisp, line, NULL);
//清空day的显示区
xSrc=1;
ySrc=DATE_BEGIN_YPOS - 10 ;
//xDest= LCD_WIDTH - 1;
//yDest= 173;
xDest= LCD_WIDTH - 1;
yDest= LCD_HEIGHT - 65;
//ClearRec(hgc, WHITE,xSrc,ySrc,xDest-xSrc,yDest-ySrc, REPLACE_STYLE);
ClearRec(hgc, WHITE,xSrc, ySrc,xDest-xSrc,yDest-ySrc, REPLACE_STYLE);
//获得当前月的长度
if(nowmonth==2)
{
if((nowyear%4==0 && nowyear%100 != 0) || (nowyear%400 == 0)) //闰年时二月29天,平时二月28天
monthDayLen=29;
else monthDayLen=28;
}
else monthDayLen=monthDay[nowmonth-1];
//更新显示
firstDayPos=CalculateWeek(nowyear,nowmonth,1);
for(i=0; i<monthDayLen; i++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -