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

📄 calendar.c

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

					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); 
					}

					yearchange = 0; 
					
					EnableWindow( ok, TRUE );
					EnableWindow( cancel, TRUE );
				}
				break; 
			case WM_LISTBOX:
				if(msg.lparam == monthdisp)
				{
					temp = nowmonth; 
					switch(msg.wparam)
					{
						case 0:
							nowmonth = 1; 
							break; 
						case 1:
							nowmonth = 2; 
							break; 
						case 2:
							nowmonth = 3; 
							break; 
						case 3:
							nowmonth = 4; 
							break; 
						case 4:
							nowmonth = 5; 
							break; 
						case 5:
							nowmonth = 6; 
							break; 
						case 6:
							nowmonth = 7; 
							break; 
						case 7:
							nowmonth = 8; 
							break; 
						case 8:
							nowmonth = 9; 
							break; 
						case 9:
							nowmonth = 10; 
							break; 
						case 10:
							nowmonth = 11; 
							break; 
						case 11:
							nowmonth = 12; 
							break; 
					}

					if(nowmonth != temp)
					{
						//清空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-(DAY_ITEM_LEN-14)/2, ySrc-(DAY_ITEM_LEN-10)/2,DAY_ITEM_LEN,DAY_ITEM_LEN); 
							}
						}
						ClearRec(hgc, WHITE,40,LCD_HEIGHT - 70,LCD_WIDTH/2, 25, REPLACE_STYLE);
						yyhs(line,nowyear,nowmonth,nowday); 
						SetWindowText(yinli, line, NULL);			//更新阴历的显示
						EnableWindow( ok, TRUE );
						EnableWindow( cancel, TRUE );
					}
				}

			case ASIX_INPUT_STATUS:				//处理点击操作
				if(msg.wparam == PPSM_INPUT_PEN_UP)
				{
					dragflag = 0; 
				}
				else
				if(msg.wparam == PPSM_INPUT_DRAG)
				{
					dragflag = 1; 
				}
				
				if(dragflag == 0)
				{
					temp = nowitem; 
					GetPosData(msg.data, &xpos, &ypos); 
					//获得当前点击的日期区域
					nowitem = (xpos-DATE_BEGIN_XPOS)/(DAY_ITEM_LEN + DAY_GAP) + ((ypos-DATE_BEGIN_YPOS)/DAY_ITEM_LEN)*DAY_LINE_NUM; 

					if(nowitem != temp)
					{
						//当选中的是日期时,该日期的区域反黑显示
						if((nowitem - firstDayPos + 1) > 0 && (nowitem - firstDayPos + 1) <= monthDayLen)			
						{
							//恢复刚才的日期区域
							xSrc=DATE_BEGIN_XPOS+(temp%DAY_LINE_NUM)*(DAY_ITEM_LEN + DAY_GAP);
							ySrc=DATE_BEGIN_YPOS+(temp/DAY_LINE_NUM)*DAY_ITEM_LEN;
							xDest=xSrc+DAY_ITEM_LEN;
							yDest=ySrc+DAY_ITEM_LEN;
						InvRec(hgc, xSrc-(DAY_ITEM_LEN-14)/2, ySrc-(DAY_ITEM_LEN-10)/2,DAY_ITEM_LEN,DAY_ITEM_LEN); 

							nowday = nowitem - firstDayPos + 1; 

							//反黑当前的日期区域
							xSrc=DATE_BEGIN_XPOS+(nowitem%DAY_LINE_NUM)*(DAY_ITEM_LEN + DAY_GAP);
							ySrc=DATE_BEGIN_YPOS+(nowitem/DAY_LINE_NUM)*DAY_ITEM_LEN;
							xDest=xSrc+DAY_ITEM_LEN;
							yDest=ySrc+DAY_ITEM_LEN;
							InvRec(hgc, xSrc-(DAY_ITEM_LEN-14)/2, ySrc-(DAY_ITEM_LEN-10)/2,DAY_ITEM_LEN,DAY_ITEM_LEN); 
						}
						else
							nowitem = (U8)temp; 
						ClearRec(hgc, WHITE,40,LCD_HEIGHT - 70,LCD_WIDTH/2, 25, REPLACE_STYLE);
						yyhs(line,nowyear,nowmonth,nowday); 
						SetWindowText(yinli, line, NULL);			//更新阴历的显示
					}


					dragflag = 0xff; 
					EnableWindow( ok, TRUE );
					EnableWindow( cancel, TRUE );
				}
				break; 

			//日期发生改变时更新显示
/*			case xxxxx:
				nowday += 1; 
				if(nowday > monthDayLen)
				{
					nowday = 1; 
					nowmonth += 1; 
				}
				if(nowmonth > 12)
				{
					nowmonth = 1; 
					nowyear += 1; 
				}

				sprintf(line, "%2d", nowyear); 
				SetWindowText(yeardisp, line, NULL); 
				SelectListBox(monthdisp, nowmonth - 1); 

				//清空day的显示区
				xSrc=1;
				ySrc=DATE_BEGIN_YPOS - 1;
				xDest= LCD_WIDTH - 1;
				yDest= 173;
				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); 
					}
				}

				if(nowyear <= 2030 && nowyear >= 1900)
				{
					yyhs(line,nowyear,nowmonth,nowday); 
					SetWindowText(yinli, line, NULL);
				}
				else
				{
					SetWindowText(yinli, "", NULL); 
				}
*/
			case WM_QUIT: 
				quit = 1; 
				break; 
		}
		DefWindowProc(msg.message, msg.lparam, msg.data, msg.wparam); 
	}

	ActiveAreaDisable(daydisp); 
	DestroyWindow( mainwin ); 
//	EndofTask(); 
	return; 
}

U8 CalculateWeek(S16 year,S16 month,S16	day) /*	返回星期,星期日值为0 */
    {
	const	U16	initYear=1980,initMonth=1,initDay=1;
	const	U8	initWeek=2; /* 1980年1月1日是星期二*/
	const	U16	initYear1=1910,initMonth1=1,initDay1=1;
	const	U8	initWeek1=6; /* 1980年1月1日是星期六*/
	U16		yearCount;
	U16		dayCount;
	U8		i;
	const	U8	monthDay[]={31,28,31,30,31,30,31,31,30,31,30,31};
	
	if(year<initYear)
		{
		if(year<initYear1) return(0);
			year=year-initYear1;
			yearCount=0;
			dayCount=0;
			while(year!=0)
				{
				dayCount +=365;
				if(yearCount%4==0)
					dayCount +=1;
				yearCount++;
				year--;	
				}	
			month =month-initMonth1;
			if(month<0)
				return(0);
			for(i=0;i<month;i++)
				dayCount+=monthDay[i];
			if((yearCount%4==0)&&(month>=3))		
				dayCount++;
			day=dayCount+day-initDay1;
			if(day<0)
				return(0);
			return((day+initWeek)%7);
		}
	year=year-initYear;
	yearCount=0;
	dayCount=0;
	while(year!=0)
		{
		dayCount +=365;
		if(yearCount%4==0)
			dayCount +=1;
		yearCount++;
		year--;	
		}	
	month =month-initMonth;
	if(month<0)
		return(0);
	for(i=0;i<month;i++)
		dayCount+=monthDay[i];

	if((yearCount%4==0)&&(month>=2)) /* 2000年3月*/		
		dayCount++;
	day=dayCount+day-initDay;
	if(day<0)
		return(0);
	return((day+initWeek)%7);
}	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -