📄 emlfunc.c
字号:
#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 + -