text.c
来自「redboy for gba 是BPNS为GBA编写的一个小软件。软件的邹形是B」· C语言 代码 · 共 673 行 · 第 1/2 页
C
673 行
#include <CsAgb.h>
#include <math.h>
#include <rb_stdio.h>
#include <graph.h>
#include <Qgraph.h>
#include <rb_mem.h>
#include <string.h>
#define mVRAM (u16 *) 0x06000000
#define plines 10 //每页显示行数
#define TEXT_DAT 0x06012C00 //用于存放文本数据
extern void show_float(double x,u16 color);
extern void paint_dre(u8 xp,u8 yp,u16 color,u8 ch);
extern void txt_set(u16 *M);//文本浏览设置
extern void txt_get(u16 *M);
extern u8 rb_yp,is_basic_run;
extern u32 _fid,_iid,_line;
extern void new_scroll(u32 lc,u32 len);
const u16 tit_co[]={
28164,27106,27106,27107,27107,27107,28164,28164,28197,28197,29222,29255,
29255,30312,30312,30345};
extern void win_plate(char *tit,char *mes,u16 bg);
extern char _file[40];
extern void title(char *);
extern int menu(char *items,int n);
const char text_menus[4][15]={"1.文本阴影","2.书签设置","3.帮助说明","4.字体设置",};
const char font_menus[3][15]={"1.更改模式","2.选择字体","3.字距设置"};
const char text_helps[]=
"文本操作说明:
===============================
您可以通过方向键控制浏览内容:
LEFT :向前换行
RIGHT :向后换行
UP :向上翻页
DOWN :向下翻页
A :下一页
START :浏览设置
SELECT:快速转页
B :退出浏览
组合键功能:
L+LEFT :向上换行(连续)
L+RIGHT:向下换行(连续)
L+UP :向上翻页(连续)
L+DOWN :向下翻页(连续)
L+R :帮助说明
L+A :字体设置
L+B :启用/取消文本阴影
R+A :保存书签
R+B :启用/取消自动滚屏
R+UP :自动滚屏速度加
R+DOWN :自动滚屏速度减
R+LEFT :调用系统配色方案
R+RIGHT:调用系统配色方案
===============================
浏览设置:
进入浏览设置后,你可以更改字体和背景颜色。
LEFT :颜色分量减
RIGHT:颜色分量增
UP :选择颜色分量
DOWN :选择颜色分量";
char is_in_text_help=0;
extern void (*sys_deamon)();
extern void show_obj(int xp,int yp);
extern void myobj_new_str(char *str,u8 step);
const u16 text_colors[]={
RGB(30,30,30),0,
0,RGB(30,30,30),
RGB(3,7,15),RGB(30,30,30),
RGB(30,30,30),RGB(3,7,15),
RGB(30,30,30),RGB(30,0,0),
RGB(30,0,0),RGB(30,30,30)
};
extern void list_bmark(u8 bg,u8 act);
extern u8 find_bmark(u32 fid);
extern u8 rb_xp,rb_yp,rb_error;
extern void autop_set(u8 *M,u8 act);
void show_speed(u8 speed)
{
const char ch[]="0123456789ABCDEF";
char str[16]="SPEED:";
char aa[2]="0\0";
aa[0]=ch[speed];
strcat(str,aa);
myobj_new_str(str,1);
show_obj(30,100);
rb_error=5;
}
extern u32 TM_CN;
void text_deamon()
{
rb_yp=(rb_yp+1)%(1+rb_xp);
if (TM_CN%4==0) auto_bmark();
if (rb_error) rb_error--;
if (rb_error==0) hiden_myobj();
}
struct text_line
{
u32 add;
struct text_line *next;//下一行
struct text_line *pre;//上一行
};
void text(char *text,u16 color,u16 bg,u32 *sav);//文本显示
void text_help()
{
u32 *sav=(u32 *)new_malloc(1024);
is_in_text_help=1;
text(text_helps,RGB(30,30,30),RGB(15,15,15),sav);
is_in_text_help=0;
new_free(sav);
}
void show_txt_num(u8 xp,u8 yp,u16 color,u16 page)
{
char str[5];
int i;
for (i=0;i<3;i++)
{
str[2-i]=page%10+48;
page=page/10;
}
str[3]='\0';
cwrite(xp,yp,color,str);
}
void text_set_show(u8 *co,u8 *bg,u8 op,u8 loc)
{
u8 *p;
int i;
r_box(23,41,197,54,RGB(bg[0],bg[1],bg[2]),1);
if (op)
{
cwrite(25,43,RGB(co[0],co[1],co[2]),"您现在正在更改字体颜色");
p=co;
}
else
{
cwrite(25,43,RGB(co[0],co[1],co[2]),"您现在正在更改背景颜色");
p=bg;
}
r_box(51,61,171,72,RGB(7,14,21),1);
r_box(51,76,171,87,RGB(7,14,21),1);
r_box(51,91,171,102,RGB(7,14,21),1);
r_box(51,61,51+p[0]*4,72,RGB(p[0],0,0),1);
r_box(51,76,51+p[1]*4,87,RGB(0,p[1],0),1);
r_box(51,91,51+p[2]*4,102,RGB(0,0,p[2]),1);
for (i=0;i<3;i++)
{
r_box(30,60+i*15,43,73+i*15,RGB(30,30,30),0);
if (i==loc) r_box(31,61+i*15,42,72+i*15,RGB(30,30,0),1);
else r_box(31,61+i*15,42,72+i*15,RGB(7,14,21),1);
}
}
void color_3d(u16 color,u8 *co)
{
u16 ms0=0x7C00;
u16 ms1=0x3E0;
u16 ms2=0x1F;
co[2]=(color&ms0)>>10;
co[1]=(color&ms1)>>5;
co[0]=color&ms2;
}
void text_set(u16 *color)
{
u8 co[3]={30,30,30};
u8 bg[3]={0,9,16};
u8 i;
u8 op=1;
u8 *p=co;
u8 done=1;
u8 loc=0;
color_3d(color[0],co);
color_3d(color[1],bg);
r_box(21,21,201,141,0,0);
r_box(20,20,200,140,RGB(30,30,30),0);
r_box(21,21,199,36,RGB(3,7,15),1);
//for (i=0;i<179;i++)
//r_line(i+21,21,i+21,36,RGB(3+i*0.1125,7+i*96/1000,15+i*625/10000),1);
cwrite(22,24,RGB(30,30,30),"文本浏览设置");
r_box(21,37,199,139,RGB(7,14,21),1);
cwrite(22,125,RGB(30,30,30),"SELECT健:切换 START健:重置");
cwrite(22,110,RGB(30,30,30),"A 健:应用 B 健:退出");
r_box(22,40,198,55,RGB(30,30,30),0);
r_box(23,41,197,54,RGB(bg[0],bg[1],bg[2]),1);
cwrite(25,42,RGB(co[0],co[1],co[2]),"现在正在更改字体颜色");
r_box(50,60,172,73,RGB(30,30,30),0);
r_box(50,75,172,88,RGB(30,30,30),0);
r_box(50,90,172,103,RGB(30,30,30),0);
while (1)
{
readkey();
if(CS_IsKeyDown(KEY_LEFT) || CS_IsKeyHold(KEY_L))
{
if (p[loc]>0) p[loc]--;
else p[loc]=30;
done=1;
}
else if(CS_IsKeyDown(KEY_RIGHT) || CS_IsKeyHold(KEY_L))
{
if (p[loc]<30) p[loc]++;
else p[loc]=0;
done=1;
}
else if(CS_IsKeyDown(KEY_UP))
{
if(loc>0) loc--;
else loc=2;
done=1;
}
else if(CS_IsKeyDown(KEY_DOWN))
{
if(loc<2) loc++;
else loc=0;
done=1;
}
else if(CS_IsKeyDown(KEY_SELECT))
{
op=!op;
done=1;
if (op) p=co;
else p=bg;
}
else if(CS_IsKeyDown(KEY_A))
{
color[0]=RGB(co[0],co[1],co[2]);
color[1]=RGB(bg[0],bg[1],bg[2]);
txt_set(color);
return;
}
else if(CS_IsKeyDown(KEY_B)) return;
else if(CS_IsKeyDown(KEY_START))
{
color_3d(RGB(30,30,30),co);
color_3d(RGB(0,9,16),bg);
done=1;
}
if (done)
{
text_set_show(co,bg,op,loc);
done=0;
}
}
}
u32 quik_page(u32 lines,u32 nowline)//快速换页
{
u8 done=1;
u8 loc=0;
u32 pages,now;
u16 i;
pages=lines/plines;
if (pages*plines<lines) pages++;
now=nowline/plines;
//u8 i;
r_box(21,21,201,141,0,0);
r_box(20,20,200,140,RGB(30,30,30),0);
r_box(21,21,199,36,RGB(3,7,15),1);
//for (i=0;i<179;i++)
//r_line(i+21,21,i+21,36,RGB(3+i*0.1125,7+i*96/1000,15+i*625/10000),1);
cwrite(22,23,RGB(30,30,30),"快速翻页");
r_box(21,37,199,139,RGB(7,14,21),1);
r_line(20,36,200,36,RGB(30,30,30),1);
cwrite(22,40,RGB(30,30,30),"转到第");
show_txt_num(60,40,RGB(30,30,0),now+1);
cwrite(84,40,RGB(30,30,30),"/");
show_txt_num(93,40,RGB(30,30,30),pages);
r_box(22,60,198,71,RGB(30,30,30),0);
Q_box(23,61,197,70,0);
Q_box(23,61,23.0+174.0*(now+1)/pages,70,RGB(30,30,0));
cwrite(22,75,RGB(30,30,30),"R 键:末页");
cwrite(22,88,RGB(30,30,30),"L 键:首页");
cwrite(22,101,RGB(30,30,30),"A 键:确定");
cwrite(22,114,RGB(30,30,30),"B 键:取消");
cwrite(22,127,RGB(30,30,30),"方向键:转页");
while (1)
{
for (i=0;i<8000;i++) CS_ReadKey();
if (CS_IsKeyHold(KEY_B)) return nowline;
else if (CS_IsKeyHold(KEY_A)) return now*plines;
else if (CS_IsKeyHold(KEY_L)) return 0;
else if (CS_IsKeyHold(KEY_R)) return lines?lines-1:0;
else if(CS_IsAnyKeyHold(KEY_UP))
{
if (now)
{
now--;
done=1;
}
}
else if (CS_IsAnyKeyHold(KEY_DOWN))
{
if (now+1<pages)
{
done=1;
now++;
}
}
else if(CS_IsAnyKeyHold(KEY_LEFT))
{
if (now>9) now=now-10;
else now=0;
done=1;
}
else if(CS_IsAnyKeyHold(KEY_RIGHT))
{
if (now+11<pages) now=now+10;
else if (pages) now=pages-1;
done=1;
}
if (done)
{
Q_box(60,40,84,49,RGB(7,14,21));
show_txt_num(60,40,RGB(30,30,0),now+1);
Q_box(23,61,197,70,15855);
Q_box(23,61,23.0+174.0*(1+now)/pages,70,30720);
done=0;
}
}
}
u32 text_pre_do(char *text,u32 *sav)//文本预处理
{
u32 lines=1;
u32 tp=0;//文本指针
u8 xp=2;
u8 lend=0;
sav[0]=0;
while (text[tp]!='\0')
{
if (text[tp]>127)//汉字
{
if (xp>212+6)
{
sav[lines]=tp;
lines++;
xp=14;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?