⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 calendar.c

📁 一个操作系统源代码 用于嵌入式设备 在Vc++环境下仿真 成功移植到多款处理器上
💻 C
📖 第 1 页 / 共 2 页
字号:
/*********************************************************************
 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 + -