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

📄 emlfunc.c

📁 国家ASIC工程中心使用的嵌入式操作系统
💻 C
📖 第 1 页 / 共 4 页
字号:
#include "email.h"
#include "emlfunc.h"
#include "emldb.h"

/***********************************************************************************************/
//显示各邮箱邮件
STATUS DispEmailList( U8 box_type, U8 reserved )
{
	MSG					Msg;
	U32					pGC;
	U8					quit = FALSE;
	U32					mainwin;		//主创口
	U32					bt_add, bt_del, bt_refresh, menu_search, lbox_folder,bt_empty;//功能键
	U32					bt_flag[EMAIL_DISP_NUM], bt_list[EMAIL_DISP_NUM];	//标志和标题BUTTON
	U32					scroll, hmenu;	//滚动条
	U32					tskbar;
	
	static char			keystring[KEYSTRING_LEN] = {0}, type[EMAIL_TYPE_LEN] = {0};
	U16					suffix_in_disp[EMAIL_DISP_NUM]; 
	U8					topdir = FALSE, enddir = FALSE;//标志滚动滑块在页首和页尾,用于阻止相同页面的重刷  
	U16					startp, endp, low, high; 
	U8					select_bt = EMAIL_DISP_NUM;
	U8					activeflag[EMAIL_DISP_NUM] = {UNACTIVE};//标题单击、双击
	U8					display_flag = FALSE, keep_flag = FALSE, refresh = FALSE;//汇总显示标志
	U16					i, count;
	U16					select_no;
	U8					keystring_buf;
	EMAIL_STRU			*email_stru;
	U16					number = 0;	//当前列表中记录的数目	
	EMAIL_SEARCH_STRU	email_search_stru;
	LOCALSEARCHLIST		*global_email_list = NULL; 
	struct	LBOX_ITEM	folder_lbox[]= 
	{
		1, 1, "文件夹",
		1, 1, "收件箱",
		1, 1, "发件箱",
		1, 1, "已发送邮件",
		1, 1, "垃圾箱",
		0, 0, NULL,
	};

	struct	MENU_ITEM	search_menu[]= 
	{
		1, 1, "时间",
		1, 1, "主题",
		1, 1, "发件人",
		0, 0, NULL,
	};

	pGC = GetGC();
	ClearScreen( pGC, WHITE);
	
	//初始化数组
	memset( (P_VOID)keystring, 0x0, KEYSTRING_LEN);
	memset( suffix_in_disp, EOD, EMAIL_DISP_NUM*sizeof(U16) );
	memset( (P_VOID)&Msg, 0x0, sizeof(MSG));
		
	//主窗口
	mainwin=CreateWindow(WNDCLASS_WIN,"电子邮件",WS_OVERLAPPEDWINDOW,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_add = CreateWindow(WNDCLASS_BUTTON, NULL, WS_CHILD|BS_REGULAR, 4, 20, 20, 20, mainwin, 0, (void *)zi_new);			
	bt_del = CreateWindow(WNDCLASS_BUTTON, NULL, WS_CHILD|BS_REGULAR, 26, 20, 20, 20, mainwin, 0, (void *)zi_delete);	
	bt_refresh = CreateWindow(WNDCLASS_BUTTON, "刷", WS_CHILD|BS_REGULAR, 48, 20, 20, 20, mainwin, 0, NULL);				
	menu_search = CreateWindow(WNDCLASS_MENU, (void *)zi_find, WS_CHILD, 70, 20, 20, 20, mainwin, 0, (void *)search_menu);	
	lbox_folder = CreateWindow(WNDCLASS_LIST, NULL, WS_CHILD|LBS_POPUP, 4, 42, 70, 20,mainwin,0, folder_lbox);
	bt_empty = CreateWindow(WNDCLASS_BUTTON, "空", WS_CHILD|BS_REGULAR, 76, 42, 20, 20, mainwin, 0, NULL);	
	SelectListBox( lbox_folder, (U8)(box_type - 48+1) );//选择文件夹类型(文件夹)

	//标题和标志按钮的初始化:	
	i = 66;
	for( count = 0; count < EMAIL_DISP_NUM; count++ )
	{
		bt_flag[count] = CreateWindow(WNDCLASS_BUTTON,NULL,WS_CHILD|BS_REGULAR,4,i,20,20,mainwin,0,NULL);
		bt_list[count] = CreateWindow(WNDCLASS_BUTTON,NULL,WS_CHILD|BS_REGULAR,26,i,115,20,mainwin,0,NULL);
		i += 21;
		SetWindowText( bt_flag[count], NULL, 0);							
		SetWindowText( bt_list[count], NULL, 0);
		EnableWindow( bt_flag[count], FALSE );							
		EnableWindow( bt_list[count], FALSE );
	}			
	
//	FreeDBList( &global_email_list, &number );
	keystring_buf = box_type;
//	global_email_list = LocalFindRecord( emaillacb, EMAIL_BOX, &keystring_buf, PRECISE_PART_MATCH );
	email_search_stru.field = EMAIL_BOX;
	email_search_stru.keystring = &keystring_buf;
	email_search_stru.mode = PRECISE_PART_MATCH;
	global_email_list = TransSearchEmail( &email_search_stru, 0 );
	number = global_email_list->num;

	//设置滚动条
	low = 0; 
	startp = 0;
	if( number <= EMAIL_DISP_NUM )
	{
		high = 0;
		endp = number;
	}else{
		high = (U16)(number - EMAIL_DISP_NUM);
		endp = EMAIL_DISP_NUM;
	}
	hmenu = MAKELONG( low, high );
	scroll = CreateWindow(WNDCLASS_SCROLL, NULL, WS_CHILD|SBS_VERT, 143,66,16,148,mainwin,hmenu,NULL);

	for( i = 0; ( i < EMAIL_DISP_NUM ) && ( (startp+i) < number ); i++ )	//获得要显示的记录号
		suffix_in_disp[i] = (U16)(startp+i);

	EmailDisplayList( global_email_list, suffix_in_disp, bt_flag, bt_list );
	select_bt = EMAIL_DISP_NUM;
			
	while(!quit) 
	{
		ASIXGetMessage( &Msg, NULL, 0, 0);	
		
		switch ( Msg.message )
		{
			case	WM_LISTBOX:
				if( Msg.lparam == lbox_folder )//文件夹
				{
					FreeDBList( &global_email_list, &number );
					if( Msg.wparam == 0 )
					{
						//返回主页面
						quit = TRUE;
					}else{
						box_type = (U8)(Msg.wparam+EMAIL_RECEIVED_BOX-1);
						keystring_buf = (U8)(Msg.wparam+EMAIL_RECEIVED_BOX-1);
//						global_email_list = LocalFindRecord( emaillacb, EMAIL_BOX, &keystring_buf, PRECISE_PART_MATCH );
						email_search_stru.field = EMAIL_BOX;
						email_search_stru.keystring = &keystring_buf;
						email_search_stru.mode = PRECISE_PART_MATCH;
						global_email_list = TransSearchEmail( &email_search_stru, 0 );
						number = global_email_list->num;
						display_flag = TRUE;
					}
				}
				if( display_flag == TRUE )		//汇总	
				{
					if( select_bt != EMAIL_DISP_NUM )
					{
						activeflag[select_bt] = UNACTIVE;	
						RepaintWindow( bt_list[count], BS_INVERT );//清按钮的反色区
						select_bt = EMAIL_DISP_NUM;
					}
		
					low = 0;
					if( number <= EMAIL_DISP_NUM )
					{
						high = 0;
						endp = number;
					}else{
						high = (U16)(number - EMAIL_DISP_NUM);
						endp = EMAIL_DISP_NUM;
					}
					startp = 0;
					SetScrollRange( scroll, low, high );
					SetScrollPos( scroll, startp, 0, 0 );

					memset( suffix_in_disp, EOD, EMAIL_DISP_NUM*sizeof(U16) );
					for( i = 0; ( i < EMAIL_DISP_NUM ) && ( (startp+i) < number ); i++ )	//获得要显示的记录号
						suffix_in_disp[i] = startp+i;

					EmailDisplayList( global_email_list, suffix_in_disp, bt_flag, bt_list );
					display_flag = FALSE;
				}
				break;
			case	WM_COMMAND:				
				for( count = 0; count < EMAIL_DISP_NUM; count++ )//点击标志
				{
					if( Msg.lparam == bt_list[count] )
					{ 
						if( select_bt != EMAIL_DISP_NUM )
						{
							if( select_bt != count )	//清除原来反色的按钮
							{
								RepaintWindow( bt_list[select_bt], BS_INVERT );
								RepaintWindow( bt_list[count], BS_INVERT );
								activeflag[select_bt] = UNACTIVE;
							}
						}else{
							RepaintWindow( bt_list[count], BS_INVERT );
						}
						
						switch( activeflag[count] )
						{
							case	UNACTIVE:
							case	DOUBLEACTIVE:
								select_bt = (U8)count;
								activeflag[count] = SINGLEACTIVE;		  					
								select_no = suffix_in_disp[select_bt];
								break;

							case	SINGLEACTIVE:
								select_bt = (U8)count;
								activeflag[count] = DOUBLEACTIVE;
									
								select_no = suffix_in_disp[select_bt];
//								InvRec( pGC, 26, select_bt * 20 + 70, 114, 20 );
								RepaintWindow( bt_list[select_bt], BS_INVERT );
								DisplayEmail( global_email_list, select_no, 0 );
								refresh = TRUE;
								display_flag = TRUE;
								break;
						}
						break;
					}
				}

				if( Msg.lparam == bt_add )		//写信
				{
					CreateEmail( 0 );
					startp = 0;
					refresh = TRUE;
				}
				if( Msg.lparam == bt_del )		//删除
				{
					if( number != 0 )
					{
						email_stru = TransReadEmail( global_email_list, select_no, 0 );
						if( *(email_stru->box) == EMAIL_RUB_BOX )	//垃圾箱
						{
							TransDelEmail( global_email_list, select_no, 0 );
						}else{//把邮件保存到垃圾箱中
							*(email_stru->box) = EMAIL_RUB_BOX;
							TransModifyEmail( global_email_list, select_no, email_stru, 0 );
						}
						Lfree( email_stru );
						Lfree( global_email_list->head[select_no].data );

						for( i = select_no; i < (U16)( number - 1 ); i++ )
						{
							global_email_list->head[i].index = global_email_list->head[i+1].index; 
							global_email_list->head[i].data = global_email_list->head[i+1].data; 
							global_email_list->head[i].datalen = global_email_list->head[i+1].datalen; 
						}
						Lfree( global_email_list->head[number - 1].data );
						number--;
						global_email_list->num = number;
						if( number == 0 )
						{
							MessageBox(mainwin, "此组记录已删完!", "提醒", MB_ICONEXCLAMATION|MB_OK);
						}else{
							if( select_no == number )	//删除的是最后一条记录,显示前一条记录
							{
								select_no = number - 1; 
							}else{
								keep_flag = TRUE;
							}
						}
					}
					display_flag = TRUE;
				}
				if( Msg.lparam == bt_refresh || refresh == TRUE )	//刷新
				{
					FreeDBList( &global_email_list, &number );
					keystring_buf = box_type;
//					global_email_list = LocalFindRecord( emaillacb, EMAIL_BOX, &keystring_buf, PRECISE_PART_MATCH );
					email_search_stru.field = EMAIL_BOX;
					email_search_stru.keystring = &keystring_buf;
					email_search_stru.mode = PRECISE_PART_MATCH;
					global_email_list = TransSearchEmail( &email_search_stru, 0 );
					number = global_email_list->num;
					display_flag = TRUE;
					refresh = FALSE;
					startp = 0;
				}
				if( Msg.lparam == bt_empty )	//清空当前文件夹
				{
//					if( global_email_list->head == 0 )
					for( i = 0; i < number; i++ )
					{
						email_stru = TransReadEmail( global_email_list, i, 0);
						if( *(email_stru->box) == EMAIL_RUB_BOX )	//垃圾箱
						{
							TransDelEmail( global_email_list, i, 0 );
						}else{//把邮件保存到垃圾箱中
							*(email_stru->box) = EMAIL_RUB_BOX;
							TransModifyEmail( global_email_list, i, email_stru, 0 );
						}
						Lfree( email_stru ); 
					}
					FreeDBList( &global_email_list, &number );
					display_flag = TRUE;
				}
				if( Msg.lparam == menu_search )//查找
				{
					global_email_list = SearchEmail( global_email_list, (U8)Msg.wparam, 0 );
					number = global_email_list->num;
					startp = 0;
					display_flag = TRUE;
				}
	
				if( display_flag == TRUE )		//汇总	
				{
					if( select_bt != EMAIL_DISP_NUM  )
					{
//						if( keep_flag == FALSE )
						{
							activeflag[select_bt] = UNACTIVE;	
							RepaintWindow( bt_list[select_bt], BS_INVERT );//清按钮的反色区
//							select_bt = EMAIL_DISP_NUM;
						}
					}
		
					low = 0;
					if( number <= EMAIL_DISP_NUM )
					{
						high = 0;
						endp = number;
					}else{
						high = (U16)(number - EMAIL_DISP_NUM);
						endp = EMAIL_DISP_NUM;
					}
//					startp = 0;
					SetScrollRange( scroll, low, high );
					SetScrollPos( scroll, startp, 0, 0 );

					memset( suffix_in_disp, EOD, EMAIL_DISP_NUM*sizeof(U16) );
//					for( i = 0; ( i < EMAIL_DISP_NUM ) && ( (startp+i) < global_email_list->num ); i++ )	//获得要显示的记录号
					for( i = 0; ( i < EMAIL_DISP_NUM ) && ( (startp+i) < number ); i++ )	//获得要显示的记录号
						suffix_in_disp[i] = startp+i;

					EmailDisplayList( global_email_list, suffix_in_disp, bt_flag, bt_list );
					if( keep_flag == TRUE )
					{
						activeflag[select_bt] = SINGLEACTIVE;	
						RepaintWindow( bt_list[select_bt], BS_INVERT );//清按钮的反色区
					}else{
						select_bt = EMAIL_DISP_NUM;
					}
					display_flag = FALSE;
					keep_flag = FALSE;
				}
				break;
			case	WM_VSCROLL:
				if(Msg.lparam == scroll)
				{
					if( startp == 0 )	topdir = TRUE;
					if( endp == number )	enddir = TRUE;

					switch( Msg.wparam )
					{
						case	SB_LINEDOWN:
								startp++;
								endp++;
								break;
						case	SB_LINEUP:
								startp--;
								endp--;
								break;										
						case	SB_PAGEDOWN:
								startp += EMAIL_DISP_NUM;
								endp += EMAIL_DISP_NUM;
								break;										
						case	SB_PAGEUP:
								startp -= EMAIL_DISP_NUM;
								endp -= EMAIL_DISP_NUM;
								break;
						case	SB_ENDSCROLL :
								startp = (U8)GetScrollPos(scroll,0,0,0);
								endp = startp - EMAIL_DISP_NUM;
								break;
						default :
								break;
					}
														    
					low = 0;
					if( number > EMAIL_DISP_NUM )
					{
						high = (U16)(number - EMAIL_DISP_NUM);
						if( (S8)(startp) < 0 )	startp = 0;
						if( startp > high )		startp = high;		
						endp = startp + EMAIL_DISP_NUM;
					}else{
						high = 0;
						startp = 0;
						endp = (U16)number;
					}

					if(topdir==TRUE)
						if( startp != 0 ) topdir = FALSE;
					if( enddir == TRUE )
						if( endp != number ) enddir = FALSE;
					SetScrollRange( scroll, low, high );
					
					if( ( topdir == FALSE ) && ( enddir == FALSE ) )
					{

						SetScrollPos( scroll, startp, 0, 0 ); 
						if( select_bt != EMAIL_DISP_NUM)       //移动的时候需要使原来选择的记录返黑
						{
//							InvRec( pGC, 26, select_bt * 20 + 70, 114, 20 );
							RepaintWindow( bt_list[select_bt], BS_INVERT );
							activeflag[select_bt] = UNACTIVE;
							select_bt = EMAIL_DISP_NUM;
						}
						memset( suffix_in_disp, EOD, EMAIL_DISP_NUM*sizeof(U16) );
						for( i = 0; ( i < EMAIL_DISP_NUM ) && ( (startp+i) < number ); i++ )	//获得要显示的记录号
							suffix_in_disp[i] = startp+i;
						EmailDisplayList( global_email_list, suffix_in_disp, bt_flag, bt_list );
					}

				}
				break;

⌨️ 快捷键说明

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