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

📄 schfunc.c

📁 基于东南大学开发的SEP3203的ARM7中的所有驱动
💻 C
📖 第 1 页 / 共 3 页
字号:
#include "scheme.h"
#include "schfunc.h"
#include "schdb.h"
/*add by DSA 2004.07.01*/
extern	void FreeDBList( LOCALSEARCHLIST **DB_list, U16 *num );
/*end add*/

/***********************************************************************************************/
//提醒列表的显示:
STATUS	SchemeDisplayList( U16 *suffix_in_digs, U32 *bt_flag, U32 *bt_name, U8 reserved )
{
	SCHEME_STRU			*scheme_stru;  	       
	U16					i = 0;
//	BYTE				*record;

	while( ( *suffix_in_digs != EOD ) && ( i < SCHEME_DISP_NUM ) )
	{
		if( ( scheme_stru = TransReadScheme( *suffix_in_digs, 0 ) ) == NULL )
//		if( ( scheme_stru = TransReadScheme( *suffix_in_digs, &record ) ) == NULL )
			return SCHEME_ERROR;

		EnableWindow(*bt_flag, TRUE);
		if( *(scheme_stru->alarm_type) == DO_NOT_ALARM  )
			SetWindowText(*bt_flag, "C", NULL);				
		if( *(scheme_stru->alarm_type) == RING_ALARM )
			SetWindowText(*bt_flag, "R", NULL);
		if( *(scheme_stru->alarm_type) == WINDOW_ALARM )
			SetWindowText(*bt_flag, "W", NULL);
		if( *(scheme_stru->type) == SCHEME_MATURITY )
			EnableWindow( *bt_flag, FALSE );

		EnableWindow( *bt_name, TRUE);	
		SetWindowText( *bt_name++, scheme_stru->name, NULL);
		
		i++;
		bt_flag++;	
		suffix_in_digs++;
		Lfree( scheme_stru );
//		Lfree( record );
	}

	while( i < SCHEME_DISP_NUM )
	{
		SetWindowText( *bt_flag, NULL, NULL );
		EnableWindow( *bt_flag++, FALSE );			
		if( i == 0 )
			SetWindowText( *bt_name, "此记录为空!", NULL );
		else
			SetWindowText( *bt_name, NULL, NULL );
		EnableWindow( *bt_name++, FALSE );
		i++;
	}		
		
	bt_name -= i; 
	bt_flag -= i;
		
	return	SCHEME_OK;
}

/***********************************************************************************************/
//浏览提醒内容的页面
STATUS DisplayScheme( U16 select_no, U8 reserved )
{
	static	MSG    	Msg;
	U32				pGC;
	U8				quit = FALSE;
	U32				mainwin, tskbar;	//主窗口
	U32				bt_edit, bt_del, bt_first, bt_up, bt_down, bt_last;	//功能键	
	U32				st1, st_name, st2, st_time, st3, st_period, st4, st_num, st5, st_type, st6, ed_content;	//提醒记录显示区	
	U16             msgbox;
	SCHEME_STRU		*scheme_stru;
	static char		*disp_time, *alarm_type, *alarm_mode;	//时间转换为可显示时间、提醒方式(不提醒、开闹铃或提示窗)、定期提醒模式(按月或按年等)
	U8				disp_flag =	FALSE;
	U16				number = 0;	//当前列表中记录的数目	
    
	pGC = GetGC();
	memset( (void *)&Msg, 0x0, sizeof(MSG) );

	ClearScreen( pGC, WHITE);	
	
	mainwin = CreateWindow(WNDCLASS_WIN, "电子秘书", WS_OVERLAPPEDWINDOW|WS_USERBOX|WS_CLOSEBOX, 0,0,LCD_WIDTH-1,LCD_HEIGHT-1,0,0,NULL);
	//任务栏
	tskbar = CreateWindow(WNDCLASS_TSKBAR, NULL, WS_CHILD|TBS_TYPICAL, 0, 0, 0, 0,mainwin, 0, NULL);

	//功能键
	bt_edit = CreateWindow(WNDCLASS_BUTTON, "编", WS_CHILD|BS_REGULAR, LCD_WIDTH/2-20*3-4*2.5,20,20,20,mainwin,0,NULL);
	bt_del = CreateWindow(WNDCLASS_BUTTON, NULL, WS_CHILD|BS_REGULAR, LCD_WIDTH/2-20*2-4*1.5,20,20,20,mainwin,0,(void *)zi_delete);
	bt_first = CreateWindow(WNDCLASS_BUTTON, NULL, WS_CHILD|BS_REGULAR, LCD_WIDTH/2-20-4*0.5,20,20,20,mainwin,0,(void *)zi_first);
	bt_up = CreateWindow(WNDCLASS_BUTTON, NULL, WS_CHILD|BS_REGULAR, LCD_WIDTH/2+4*0.5,20,20,20,mainwin,0,(void *)zi_prev);
	bt_down = CreateWindow(WNDCLASS_BUTTON, NULL, WS_CHILD|BS_REGULAR, LCD_WIDTH/2+20*1+4*1.5,20,20,20,mainwin,0,(void *)zi_next);
	bt_last = CreateWindow(WNDCLASS_BUTTON, NULL, WS_CHILD|BS_REGULAR, LCD_WIDTH/2+20*2+4*2.5,20,20,20,mainwin,0,(void *)zi_last);

	//提醒内容列表
	st1 = CreateWindow(WNDCLASS_STATIC, "标题:", WS_CHILD|SS_TEXT, LCD_WIDTH/10,42,34,20,mainwin,0,NULL);
	st_name = CreateWindow(WNDCLASS_STATIC, NULL, WS_CHILD|SS_TEXT, LCD_WIDTH/10+38,42,LCD_WIDTH*0.8-38,20,mainwin,0,NULL);
	st2 = CreateWindow(WNDCLASS_STATIC, "时间:", WS_CHILD|SS_TEXT, LCD_WIDTH/10,64,34,20,mainwin,0,NULL);
	st_time = CreateWindow(WNDCLASS_STATIC, NULL, WS_CHILD|SS_TEXT, LCD_WIDTH/10+34,64,LCD_WIDTH*0.8-36,20,mainwin,0,NULL);
	st3 = CreateWindow(WNDCLASS_STATIC, "周期:", WS_CHILD|SS_TEXT, LCD_WIDTH/10,86,34,20,mainwin,0,NULL);
	st_period = CreateWindow(WNDCLASS_STATIC, NULL, WS_CHILD|SS_TEXT, LCD_WIDTH/10+38,86,LCD_WIDTH*0.8-38,20,mainwin,0,NULL);
	st4 = CreateWindow(WNDCLASS_STATIC, "次数:", WS_CHILD|SS_TEXT, LCD_WIDTH/10,108,34,20,mainwin,0,NULL);
	st_num = CreateWindow(WNDCLASS_STATIC, NULL, WS_CHILD|SS_TEXT, LCD_WIDTH/10+38,108,LCD_WIDTH*0.8-38,20,mainwin,0,NULL);
	st5 = CreateWindow(WNDCLASS_STATIC, "模式:", WS_CHILD|SS_TEXT, LCD_WIDTH/10,130,34,20,mainwin,0,NULL);
	st_type = CreateWindow(WNDCLASS_STATIC, NULL, WS_CHILD|SS_TEXT, LCD_WIDTH/10+38,130,LCD_WIDTH*0.8-38,20,mainwin,0,NULL);
	st6 = CreateWindow(WNDCLASS_STATIC, "内容:", WS_CHILD|SS_TEXT, LCD_WIDTH/10,152,34,20,mainwin,0,NULL);
	ed_content = CreateWindow(WNDCLASS_EDITOR, NULL, WS_CHILD|ES_MULTI_REGULAR, LCD_WIDTH/10+38,152,LCD_WIDTH*0.8-38,66,mainwin,SCHEME_CONTENT_LEN,NULL);
//	EnableWindow( ed_content, FALSE );

	number = global_scheme_list->num;

	scheme_stru = TransReadScheme( select_no, 0 );		//获得提醒记录的内容
//	scheme_stru = TransReadScheme( select_no, &record );//获得提醒记录的内容

	if( ( disp_time = SwitchToDispTime( scheme_stru->time ) ) == NULL )	//转换为可显示的时间
		return SCHEME_ERROR;
	alarm_mode = GetAlarmMode( scheme_stru->alarm_mode );//提醒模式(按月或按年)
	alarm_type = GetAlarmType( scheme_stru->alarm_type );//提醒方式(不提醒、开闹铃或提示窗)

	//显示记录内容
	SetWindowText( st_name, scheme_stru->name, NULL );				//名称
	SetWindowText( st_time, disp_time, NULL );						//时间
	SetWindowText( st_period, alarm_mode, NULL );					//提醒模式(按月或按年)
	SetWindowText( st_num, scheme_stru->alarm_repeat_num, NULL );	//提醒次数
	SetWindowText( st_type, alarm_type, NULL );						//提醒方式(不提醒、开闹铃或提示窗)
	SetWindowText( ed_content, scheme_stru->content, NULL );		//提醒内容
	Lfree( disp_time );

	if( *(scheme_stru->type) == SCHEME_MATURITY )	//过期的提醒不能再编辑
		EnableWindow( bt_edit, FALSE );

	if( select_no == 0 )	//第一条记录
	{
//		SetWindowText( bt_first, NULL, (void *)zi_first_dis);
		EnableWindow( bt_first, FALSE );
//		SetWindowText( bt_up, NULL, (void *)zi_prev_dis);
		EnableWindow( bt_up, FALSE );
	}

	if( ( number == 1 )	//只有一条记录
		|| ( select_no == (U16)( number - 1 ) ) )	//最后一条记录	
	{
//		SetWindowText( bt_last, NULL, (void *)zi_last_dis);
		EnableWindow( bt_last, FALSE );
//		SetWindowText( bt_down, NULL, (void *)zi_next_dis);
		EnableWindow( bt_down, FALSE );
	}
	
	while( !quit )
	{
		ASIXGetMessage( &Msg, NULL, 0, 0 );
		switch( Msg.message )
		{
			case WM_COMMAND:
				if( Msg.lparam == bt_edit )		//编辑
				{
					disp_flag =	TRUE;	//显示新的记录的标志
					//检查当前记录
//					else if( rv == SCHEME_MATU )
//					EnableWindow( bt_edit, TRUE );
//					scheme_stru = TransReadScheme( select_no, 0 );
//					scheme_stru = TransReadScheme( select_no, &record );
					ModifyScheme( &select_no, scheme_stru, 0 );	
//					Lfree( record );
//					if( rv == SCHEME_ERROR )
//						return SCHEME_ERROR;
				}
				else if( Msg.lparam == bt_del )	//删除
				{
					msgbox = MessageBox( mainwin, "确实要删除此记录吗?", "提醒", MB_OKCANCEL|MB_ICONQUESTION );
					if( msgbox == IDOK )
					{
						DynAlarm( global_scheme_list->head[select_no].index, DEL_TIMER );
						if( TransDelScheme( select_no, 0 ) == SCHEME_ERROR )	//删除提醒
							return SCHEME_ERROR;
						number = global_scheme_list->num;
						if( select_no == number )	//删除的是最后一条记录,显示前一条记录
							select_no = number - 1; 
						disp_flag = TRUE;	//显示新的记录的标志
//						Lfree( record );
					}
				}
				else if( Msg.lparam == bt_first )//第一条
				{
					if( select_no != 0 )	
					{
						disp_flag = TRUE;	//显示新的记录的标志
						select_no = 0;			//到顶
//						Lfree( record );
					}
				}
				else if( Msg.lparam == bt_up )	//上一条
				{
					if( select_no != 0 )
					{
						disp_flag = TRUE;	//显示新的记录的标志
						select_no = select_no - 1;
//						Lfree( record );
					}
				}
				else if( Msg.lparam == bt_down )//下一条
				{
					if( select_no != ( number - 1 ) )
					{
						disp_flag = TRUE;	//显示新的记录的标志
						select_no = select_no + 1;
//						Lfree( record );
					}
				}
				else if( Msg.lparam == bt_last )//最后一条
				{
					if( select_no != ( number - 1 ) )
					{
						disp_flag = TRUE;	//显示新的记录的标志
						select_no = ( number - 1 );		//到底
//						Lfree( record );
					}
				}

				if( disp_flag == TRUE )
				{
					disp_flag = FALSE;		//重置显示标志
					if( number != 0 )
					{
						Lfree( scheme_stru );
						scheme_stru = TransReadScheme( select_no, 0 );//获得提醒记录的内容
						if( ( disp_time = SwitchToDispTime( scheme_stru->time ) ) == NULL )	//转换为可显示的时间
							return SCHEME_ERROR;
						alarm_mode = GetAlarmMode( scheme_stru->alarm_mode );//提醒模式(按月或按年)
						alarm_type = GetAlarmType( scheme_stru->alarm_type );//提醒方式(不提醒、开闹铃或提示窗)
						//显示记录内容
						SetWindowText( st_name, scheme_stru->name, NULL );				//名称
						SetWindowText( st_time, disp_time, NULL );						//时间
						SetWindowText( st_period, alarm_mode, NULL );					//提醒模式(按月或按年)
						SetWindowText( st_num, scheme_stru->alarm_repeat_num, NULL );	//提醒次数
						SetWindowText( st_type, alarm_type, NULL );						//提醒方式(不提醒、开闹铃或提示窗)
						SetWindowText( ed_content, scheme_stru->content, NULL );		//提醒内容
						Lfree( disp_time );

						if( select_no == 0 )	//第一条记录
						{
	//						SetWindowText( bt_first, NULL, (void *)zi_first_dis);
							EnableWindow( bt_first, FALSE );
	//						SetWindowText( bt_up, NULL, (void *)zi_prev_dis);
							EnableWindow( bt_up, FALSE );
						}else{
	//						SetWindowText( bt_first, NULL, (void *)zi_first);
							EnableWindow( bt_first, TRUE );
	//						SetWindowText( bt_up, NULL, (void *)zi_prev);
							EnableWindow( bt_up, TRUE );
						}

						if( ( number == 1 )	//只有一条记录
							|| ( select_no == (U16)( number - 1 ) ) )	//最后一条记录	
						{
	//						SetWindowText( bt_last, NULL, (void *)zi_last_dis);
							EnableWindow( bt_last, FALSE );
	//						SetWindowText( bt_down, NULL, (void *)zi_next_dis);
							EnableWindow( bt_down, FALSE );
						}else{
	//						SetWindowText( bt_last, NULL, (void *)zi_last);
							EnableWindow( bt_last, TRUE );
	//						SetWindowText( bt_down, NULL, (void *)zi_next);
							EnableWindow( bt_down, TRUE );
						}
					}else{	//删空返回主页面
						MessageBox( mainwin, "此组记录已删空!", "提醒", MB_OKCANCEL|MB_ICONQUESTION );
						quit = TRUE;
					}

				}
				break;
			case WM_QUIT:
				quit = TRUE;
				break;
			default:
				break;
		}
		DefWindowProc( Msg.message, Msg.lparam, Msg.data, Msg.wparam ); 
	}
	Lfree( scheme_stru );
//	Lfree( record );
	DestroyWindow( mainwin );
	return SCHEME_OK;
}

/***********************************************************************************************/
//编辑提醒的页面
STATUS ModifyScheme( U16 *select_no, SCHEME_STRU *scheme_stru, U8 reversed)
{
	static	MSG    	Msg;
	U32				pGC;
	U8				quit = FALSE;
	U32				mainwin, keyboard, tskbar;	//主窗口、软件盘
	U32				ed_name, year_list,month_list, day_list, hour_list, minute_list, period_list;	//提醒记录显示区(第一页)	
	U32				st, bt_down, bt_up, bt_ok, bt_cancel;//静态框、功能键
	U32				ed_num, alarm_list, ed_content;	//提醒记录显示区(第二页)	
	FIRSTPAGEICON	firstpageicon;
	SECONDPAGEICON	secondpageicon;
	U16				msgbox;
//	ASIX_DATE		date;
	TIME_STRU		*time, *conversion_time;
	U8				control_symbol = MODIFY_FIRST_PAGE;
	static char	    time_buf[SCHEME_TIME_LEN] = {0}, name_buf[SCHEME_NAME_LEN] = {0}; 
	static char	    alarm_type[SCHEME_ALARM_TYPE_LEN] = {0}, period_buf[SCHEME_ALARM_MODE_LEN] = {0};
	static char		num_buf[SCHEME_ALARM_REPEAT_NUM_LEN] = {0}, content_buf[SCHEME_CONTENT_LEN] = {0};
	U32				rv = SCHEME_OK;
    
	pGC = GetGC();
	ClearScreen( pGC, WHITE);	
	memset( (void *)&Msg, 0x0, sizeof(MSG) );
	
	mainwin = CreateWindow(WNDCLASS_WIN, "电子秘书", WS_OVERLAPPEDWINDOW|WS_USERBOX|WS_CLOSEBOX, 0,0,LCD_WIDTH-1,LCD_HEIGHT-1,0,0,NULL);
	keyboard = CreateWindow( WNDCLASS_KEYBD,NULL,WS_CHILD|KBS_PINGYING|0xff,1,144,158,70,mainwin,0,NULL);
	//任务栏
	tskbar = CreateWindow(WNDCLASS_TSKBAR, NULL, WS_CHILD|TBS_TYPICAL, 0, 0, 0, 0,mainwin, 0, NULL);

	firstpageicon = DrawFirstPage( mainwin );
	st = firstpageicon.st;
	ed_name = firstpageicon.ed_name;
	year_list = firstpageicon.year_list;
	month_list = firstpageicon.month_list;
	day_list = firstpageicon.day_list;
	hour_list = firstpageicon.hour_list;
	minute_list = firstpageicon.minute_list;
	period_list = firstpageicon.period_list;
	bt_down = firstpageicon.bt_down;
	bt_ok = firstpageicon.bt_ok;
	bt_cancel = firstpageicon.bt_cancel;

	time = (TIME_STRU *)scheme_stru->time;
	if( ( conversion_time = (TIME_STRU *)Lmalloc(sizeof(TIME_STRU) ) ) == NULL )
		return SCHEME_ERROR;
	TimetoInt( time, conversion_time );
	//显示记录内容
	SetWindowText( ed_name, scheme_stru->name, NULL );		//名称
	SelectListBox( year_list, (U8)(conversion_time->year-2000-1) );
	SelectListBox( month_list, (U8)(conversion_time->month-1) );
	SelectListBox( day_list, (U8)(conversion_time->day-1) );
	SelectListBox( hour_list, (U8)conversion_time->hour );
	SelectListBox( minute_list, (U8)conversion_time->minute );
	SelectListBox( period_list, (U8)(*(scheme_stru->alarm_mode)-48) );

	memcpy( time_buf, scheme_stru->time, SCHEME_TIME_LEN );
	memcpy( name_buf, scheme_stru->name, SCHEME_NAME_LEN );
	memcpy( alarm_type, scheme_stru->alarm_type, SCHEME_ALARM_TYPE_LEN );//提醒方式(不提醒、开闹铃或提示窗)字符串长度
	memcpy( period_buf, scheme_stru->alarm_mode, SCHEME_ALARM_MODE_LEN );//定期提醒模式(按月或按年等)的字符串长度
	memcpy( content_buf, scheme_stru->content, SCHEME_CONTENT_LEN );
	memcpy( num_buf, scheme_stru->alarm_repeat_num, SCHEME_ALARM_REPEAT_NUM_LEN );
	
	SetFocus( ed_name );
	while( !quit )
	{
		ASIXGetMessage( &Msg, NULL, 0, 0 );
		switch( Msg.message )
		{
			case	WM_LISTBOX:
				if( Msg.lparam == period_list )
				{
					switch( Msg.wparam )
					{
						case	0:
							period_buf[0] = BY_HOUR;
							break;
						case	1:
							period_buf[0] = BY_DAY;
							break;
						case	2:
							period_buf[0] = BY_WEEK;
							break;
						case	3:
							period_buf[0] = BY_MONTH;
							break;
						case	4:
							period_buf[0] = BY_YEAR;
							break;
					}
				}

				if( Msg.lparam == year_list )
					conversion_time->year = Msg.wparam + 2000 + 1;
					
				if( Msg.lparam == month_list )
					conversion_time->month = Msg.wparam + 1;
						
				if( Msg.lparam == day_list )
					conversion_time->day = Msg.wparam + 1;
						
				if( Msg.lparam == hour_list )
					conversion_time->hour = Msg.wparam;
				
				if( Msg.lparam == minute_list )
					conversion_time->minute = Msg.wparam;

				if( Msg.lparam == alarm_list )
				{
					switch( Msg.wparam )
					{
						case	0:
							alarm_type[0] = DO_NOT_ALARM;
							break;
						case	1:
							alarm_type[0] = RING_ALARM;
							break;
						case	2:
							alarm_type[0] = WINDOW_ALARM;

⌨️ 快捷键说明

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