book_mark.c
来自「redboy for gba 是BPNS为GBA编写的一个小软件。软件的邹形是B」· C语言 代码 · 共 285 行
C
285 行
#include <csagb.h>
#include <rb_stdio.h>
#include <graph.h>
#include <Qgraph.h>
#define book_mark_M 440 //电子书书签设置 20*12=240字节
#define book_mark_M2 8600 //10*12=120 电子书签二区(用于自动存档)
#define SET_BAS 10344
#define fbase 0x80E1000
extern u8 is_basic_run;
u32 _fid=0,_iid=0,_line=0;
u32 _bmark_id=0;
extern char _file[40];//选定文件
extern u32 _file_loc;
extern void nsh_text(char *tit,char *txt,u32 size);
extern void ebook(char *tit,char *ebk);
typedef struct
{
u32 fid;//书签相关的文件编号
u32 iid;//书签相关的文件内部编号
u32 line;//对应该文本的项目
} book_mark;
typedef struct //文件屬性
{
u8 type;//文件類型
u8 mask;//數據加密類型
char name[40];//文件名
u32 size;//文件大小
u32 loc;//文件地址
} fileMes;
typedef struct
{
char ftype[4];//文件类型码 "EBK"
u32 size;//文件大小
u32 icnt;//项目个数
u32 logo;//logo位图信息
u32 mus;//music信息
u32 re;//保留区
}ebk_head;//ebk文件头
typedef struct
{
char name[40];//名称
u32 loc;//项目地址
u32 csize;//压缩后大小
u32 dsize;//解压后大小
}ebk_item;//项目信息
void set_bmark(u8 id,book_mark mark)
{
if (id>29) return;
if (id>19) CS_SeekInSRAM(SRAM_SEEK_START,SET_BAS+book_mark_M2+id*sizeof(book_mark));
else CS_SeekInSRAM(SRAM_SEEK_START,SET_BAS+book_mark_M+id*sizeof(book_mark));
CS_SaveToSRAM(&mark,sizeof(book_mark));//保存书签
}
void get_bmark(u8 id,book_mark *mark)
{
if (id>19) CS_SeekInSRAM(SRAM_SEEK_START,SET_BAS+book_mark_M2+id*sizeof(book_mark));
else CS_SeekInSRAM(SRAM_SEEK_START,SET_BAS+book_mark_M+id*sizeof(book_mark));
CS_LoadFromSRAM(mark,sizeof(book_mark));//取得书签
}
void bmar_init()
{
book_mark mark={0,0,0};
u8 i;
for (i=0;i<29;i++) set_bmark(i,mark);
}
u8 find_bmark(u32 fid)//寻找相关的书签
{
u8 i=0;
book_mark mark;
for (i=0;i<20;i++)
{
get_bmark(i,&mark);
if (mark.fid==fid) return i;
}
return 0;//没有找到
}
void auto_bmark()//自动保存书签
{
u8 i,id=0,tid=0;
book_mark mark;
//arlt("AA","AA");
if (_fid==0) {_bmark_id=0;return;}
if (_bmark_id>19 && _bmark_id<30)
{
get_bmark(_bmark_id,&mark);
if (mark.fid==_fid)
{
mark.iid=_iid;
mark.line=_line;
set_bmark(_bmark_id,mark);
return;
}
}
for (i=20;i<30;i++)
{
get_bmark(i,&mark);
if (mark.fid==0 && tid==0) tid=i;
if (mark.fid==_fid) {id=i;break;}
}
if (id==0) id=tid;
if (id==0) id=20;
mark.fid=_fid;
mark.iid=_iid;
mark.line=_line;
set_bmark(id,mark);
_bmark_id=id;
}
void bmark_mes(u8 id,u8 loc,book_mark mark)//显示书签信息
{
fileMes mes;
ebk_item item;
char ids[4]="00\0";
if (id>29)
{
Q_box(1,18+loc*28,238,18+26+loc*28,32733);
return;
}
ids[0]=48+(int)(id/10);
ids[1]=48+id%10;
Q_box(1,18+loc*28,238,18+26+loc*28,32733);
r_box(2,18+loc*28,237,18+26+loc*28,RGB(3,7,15),0);
cwrite(3,20+loc*28,RGB(30,0,0),ids);
if (mark.fid<=0x8000000 || mark.fid>=0x80000000) cwrite(20,20+loc*28,RGB(3,7,15),"没有使用");
else
{
mes=*(fileMes *)mark.fid;
cwrite(20,20+loc*28,RGB(3,7,15),mes.name);
if (mark.iid<0xFFFF0000)
{
item=*(ebk_item *)(fbase+mes.loc+sizeof(ebk_head)+mark.iid*sizeof(ebk_item));
cwrite(3,20+12+loc*28,RGB(3,7,15),item.name);
}
}
//cwrite(3,20+12+loc*28,RGB(3,7,15),"中英文");
}
void list_bmark(u8 bg,u8 act)
{
int i;
u8 sel=0,old=0,np=bg;
u8 start=1,done=2;
fileMes mes;
book_mark mark,nmark={0,0,0};
is_basic_run=0;
if (act) title("书签设置:[A:保存 R:删除 L:载入]");
else title("请选择要打开的书签[R:删除书签]");
r_line(0,0,239,0,28160,0);
r_line(0,159,239,159,28160,0);
r_line(0,0,0,159,28160,0);
r_line(239,0,239,159,28160,0);
r_line(0,16,239,16,28160,0);
Q_box(1,17,238,158,32733);
while (1)
{
if (start) {CS_ReadKey();start=0;}
else readkey();
if (CS_IsKeyDown(KEY_UP) && np+sel)
{
if (sel) {sel--;done=1;}
else {np--;done=2;}
}
else if (CS_IsKeyDown(KEY_DOWN) && np+sel<29)
{
if (sel<4) {sel++;done=1;}
else {np++;done=2;}
}
else if(CS_IsKeyDown(KEY_LEFT) && np+sel)
{
if (np>4) {np-=5;done=2;}
else {np=0;sel=0;done=2;}
}
else if(CS_IsKeyDown(KEY_RIGHT) && np+sel<29)
{
done=2;
if (np>24) {np=29;sel=0;}
else
{
np+=5;
if (np+sel>29) sel=29-sel;
}
}
else if(CS_IsKeyDown(KEY_B)) return;
else if(act && CS_IsKeyDown(KEY_L))
{
if (_iid>=0xFFFFFFF0) arlt("非法操作:","请在电子书阅读器下执行此操作.");
else
{
get_bmark(np+sel,&mark);
if (mark.iid>=0xFFFFFFF0 || mark.fid==0) arlt("操作无效:","您打开的不是电子书存栏.");
else if (arlt("系统提示:","您真的要打开此书签存栏而放弃当前电子书吗?"))
{
is_basic_run=1;
_fid=mark.fid;
_iid=mark.iid;
_line=mark.line;
mes=*(fileMes *)_fid;
_file_loc=fbase+mes.loc;
strcpy(_file,mes.name);
return;
}
}
}
else if(CS_IsKeyDown(KEY_A))//相关操作
{
if (act)//保存书签
{
if (_fid==0)
{
arlt("错误操作:","该对象不能保存书签!");
return;
}
if (arlt("系统提示:","保存书签将覆盖原有记录,是否继续?\n[A:确定] [B:取消]"))
{
mark.fid=_fid;
mark.iid=_iid;
mark.line=_line;
set_bmark(np+sel,mark);
return;
}
}
else //读书签
{
is_basic_run=1;
get_bmark(np+sel,&mark);
_fid=mark.fid;
_iid=mark.iid;
_line=mark.line;
if (_fid)
{
mes=*(fileMes *)_fid;
if (_iid<0xFFFF0000)//是电子书
ebook(mes.name,fbase+mes.loc);
else nsh_text(mes.name,(char *)(fbase+mes.loc),mes.size);//是文本文件
done=2;
title("请选择要打开的书签[R:删除书签]");
r_line(0,0,239,0,28160,0);
r_line(0,159,239,159,28160,0);
r_line(0,0,0,159,28160,0);
r_line(239,0,239,159,28160,0);
r_line(0,16,239,16,28160,0);
Q_box(1,17,238,158,32733);
}
is_basic_run=0;
}
//
}
else if(CS_IsKeyDown(KEY_R))//删除
{
if (arlt("删除书签:","你真的要删除此书签吗?\n[A:确定] [B:取消]"))
set_bmark(np+sel,nmark);
done=2;
}
if (done==2)
{
for (i=0;i<5;i++)
{
if (i+np>29) break;
get_bmark(i+np,&mark);
bmark_mes(i+np,i,mark);
}
while (i<5)
{
bmark_mes(30,i,mark);
i++;
}
old=sel;
}
if (done)
{
if (old!=sel) r_box(3,19+old*28,236,17+26+old*28,0,5);
r_box(3,19+sel*28,236,17+26+sel*28,0,5);
old=sel;
done=0;
}
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?