void debugMessage(char* text1, char* text2, int value) { int key; MsgBoxPush(4); mPrintXY(3,2,(char*)text1, TEXT_MODE_TRANSPARENT_BACKGROUND, TEXT_COLOR_BLACK); char buffer1[10]; itoa(value, (unsigned char*)buffer1); char buffer2[15]; strcpy(buffer2, text2); strcat(buffer2, buffer1); mPrintXY(3,3,(char*)buffer2, TEXT_MODE_TRANSPARENT_BACKGROUND, TEXT_COLOR_BLACK); mGetKey(&key); MsgBoxPop(); }
void main(void){ Bdisp_EnableColor(0);//Use 3-bit mode. The progress bar looks the same in 16-bit mode. Bdisp_AllClr_VRAM(); for(;;){ int i; for(i=0;i<9001;++i){ ProgressBar2("Acting busy",i,9001); if(keyPressed(KEY_PRGM_MENU)){ int key; GetKey(&key); break; } } MsgBoxPop(); } }
void Disp_About() { /* 显示关于信息(界面绘制) */ beg: font16 = open_font("\\\\fls0\\24PX.hzk"); select_font(font16); MsgBoxPush(5); ClearArea(35,45,349,166); locate_OS(3,2); Print_OS("iBooks Pro C",0,0); print_chs_2(38, 71, 0, "版本 "); locate_OS(7, 3); Print_OS("1.50", 0, 0); print_chs_2(38, 95, 0, "制作:清水视野工作室"); print_chs_2(38, 119, 0, "本程序依"); locate_OS(10, 5); Print_OS("GNU GPL v3",0,0); print_chs_2(38, 143, 0, "协议开放源代码。"); close_font(font16); while (1) { int key; GetKey(&key); switch (key) { case KEY_CTRL_EXIT: MsgBoxPop(); return;break; } } }
void browse_main() { /* 文件浏览器主函数 */ char ncat[64], workdir[64] = "\\\\fls0"; // 当前目录 f_name *a=get_file_list("\\\\fls0\\*.*"); // 存储文件列表的二维数组 int pos=0,firstn=0; // 列表光标位置、列表下移的行数 unsigned int key; char subdir_fn[32]; // 供接收子目录文件名输入的缓冲区 FONTCHARACTER fname[64]; int handle = 0; DefineStatusAreaFlags(3, 0x01 | 0x02 | 0x100, 0, 0); beg: if (a) qsort(a, getn(a), sizeof(char *), cmp); font16 = open_font("\\\\fls0\\24PX.hzk"); select_font(font16); draw_browser(workdir,firstn,pos,a); // 绘制浏览器界面 close_font(font16); // 显示当前工作目录于状态栏 if (strcmp(workdir, "\\\\fls0") == 0) DefineStatusMessage("", 0, 0, 0); else { memset(ncat, 0, sizeof(ncat)); GetDisplayDirName(workdir, ncat); DefineStatusMessage(ncat, 0, 0, 0); } while (1) { GetKey(&key); switch (key) { case KEY_CTRL_UP: // 光标上移 if (a) { aa(&pos,&firstn,getn(a)); goto beg; } break; case KEY_CTRL_DOWN: // 光标下移 if (a) { bb(&pos,&firstn,getn(a)); goto beg; } break; case KEY_CTRL_F6: // 显示关于信息 Disp_About(); goto beg; break; case KEY_CTRL_F1: // 打开光标位置的文件 case KEY_CTRL_EXE: if (a) // 如果文件列表不为空 { if (strchr(a[pos+firstn].name,'[')) // 如果打开的是文件夹 { memset(ncat,0,sizeof(ncat)); //strcat(ncat,"\\\\fls0\\"); strcat(ncat, workdir); strcat(ncat, "\\"); strcat(ncat, ++a[pos+firstn].name); memset(workdir, 0, sizeof(workdir)); strcpy(workdir, ncat); strcat(ncat, "\\*.*"); // 解析出文件夹名称 a=get_file_list(ncat); // 浏览该文件夹 pos=0; firstn=0; // 列表初始化 goto beg; } else // 如果打开的是文本文件 { memset(ncat,0,sizeof(ncat)); strcpy(ncat,workdir); strcat(ncat,"\\"); strcat(ncat,a[pos+firstn].name); // 解析出文件名称 iRead_main(ncat); // 启动阅读器 goto beg; } } break; case KEY_CTRL_F2: // 根据输入的文件名打开文件 memset(subdir_fn, 0, sizeof(subdir_fn)); if (Subdir_Open(subdir_fn)) { memset(ncat, 0, sizeof(ncat)); strcpy(ncat, workdir); strcat(ncat, "\\"); strcat(ncat, subdir_fn); // 连接上输入的文件名字 strcat(ncat, ".txt"); char_to_font(ncat, fname); handle = Bfile_OpenFile_OS(fname,0); if (handle <= 0) // 如果文件未找到 { Disp_FileNotFound(); MsgBoxPop(); goto beg; break; } MsgBoxPop(); Bfile_CloseFile_OS(handle); // 重新绘制浏览器界面 font16 = open_font("\\\\fls0\\24PX.hzk"); select_font(font16); draw_browser(workdir, firstn, pos, a); close_font(font16); // 启动阅读器 iRead_main(ncat); } goto beg; break; case KEY_CTRL_EXIT: // 从文件夹返回根目录 if (strcmp(workdir,"\\\\fls0")!=0) // 如果当前在文件夹内 { memset(ncat,0,sizeof(ncat)); strncpy(ncat,workdir,strlen(workdir)-strlen(strrchr(workdir,'\\'))); memset(workdir,0,sizeof(workdir)); strcpy(workdir,ncat); strcat(ncat,"\\*.*"); // 解析出上一级目录的名称 a=get_file_list(ncat); // 浏览该文件夹 pos=0;firstn=0; // 初始化列表 goto beg; } break; } } }
int Subdir_Open(const char* fn) { /* 子目录文件名输入(界面绘制) 参数说明: fn: 接收从键盘输入文件名的缓冲区 */ FONTCHARACTER fname[64]; char keybuff[32]; // 接受文件名的字符缓冲区 int inspos = 0; memset(keybuff, 0, sizeof(keybuff)); MsgBoxPush(4); beg: font16 = open_font("\\\\fls0\\24PX.hzk"); select_font(font16); ClearArea(0, 192, 384, 216); draw_pic(0, 192, 61, 22, 0, Menu_Sub_Jump); ClearArea(35, 45, 349, 141); print_chs_2(38, 71, 0, "输入欲打开的文件名:"); locate_OS(3, 4); Print_OS("[ ].txt", 0, 0); locate_OS(4, 4); Print_OS(keybuff, 0, 0); close_font(font16); while (1) { int key; GetKey(&key); switch (key) { case KEY_CTRL_EXIT: MsgBoxPop(); return 0; break; case KEY_CTRL_DEL: if (inspos > 0) { keybuff[--inspos] = 0; // 最后一个字节置为 NULL,标识已删除 goto beg; } break; case KEY_CTRL_F1: case KEY_CTRL_EXE: strcpy(fn, keybuff); //MsgBoxPop(); return 1; break; default: if (key >= 0x30 && key <= 0x39 || key >= 0x41 && key <= 0x5A || key >= 0x61 && key <= 0x7A) // 输入数字 0~9 或英文字母 a-z、A-Z { if (inspos <= 8) { keybuff[inspos++] = key; // 最后一个字节添加输入 goto beg; } } } } }
int divide_page(const char* filename,const int pages,int save) { /* 分页函数 参数说明: filename: 当前打开文件的文件名 pages: 需要分的页数 save: 是否需要跳回第一页 (初始化时使用) 返回值: 0: 已读到文件末尾 1: 未读到文件末尾 */ int cx,cy; int i=0,j; const int pp=16; int is_chs=0; // 中文字符标识 int tmp=cached,total=0; int decades_passed = 1; int handle; char* buf=(char*)malloc(460); FONTCHARACTER fname[64]; char_to_font(filename,fname); handle=Bfile_OpenFile_OS(fname,0); tmp=cached; totbytes=bytes[cached]; // 保险修正 // 如果请求的页数超过 9999 页,修正为 9999 页 if ((total=tmp+pages)>9999) total=9999; // 在 9999 页时尝试往后翻一页,跳出 if (cached+1>9999) {Bfile_CloseFile_OS(handle);return 0;}; // 在屏幕上显示分页的进度 ProgressBar(0, total - tmp); for (j=tmp;j<total;++j) // 从当前已缓存页面分到请求的页面,使用模拟填充显示区域方法 { // 尝试读取一段文字以备分页 memset(buf,0,461); Bfile_ReadFile_OS(handle,buf,400,totbytes); // 如果读到文件末尾则跳出 if (!buf[0]) { ProgressBar(total - tmp, total - tmp); Bfile_CloseFile_OS(handle); MsgBoxPop(); return 0; } // 填充位置设置为初始状态 cx=0; cy=24; for (i=0;;) { is_chs=buf[i] & 0x80; // 判断高位字节,确定是否为中文 if ((cx+pp)>368) // 填充超过屏幕右边缘 goto cn; if (is_chs) i+=2; // 中文,跳2字节 else { if (buf[i] == '\r' || buf[i] == '\n') // 若读到回车符直接进入下一行 { i++; if (buf[i] == '\r' || buf[i] == '\n') // 若读到回车符直接进入下一行 i++; goto cn; } i++; } // 将字符填充入当前行,增加字符偏移 if (is_chs) cx+=25; else cx+=18; // 填充超过屏幕右边缘 if (cx>368) { cn: cx=0; cy+=24; // 增加纵向字符偏移,进入下一行 if (cy>190) // 填充超过屏幕下边缘,跳出 break; } } bytes[j+1]=i+totbytes; // 将最后一个字符在文件中的位置存入下一页的缓存,以备读取 totbytes+=i; // 读取字节指针增加 ++cached; // 已缓存页面增加,表示分页成功 // 每分完1/10的总体,增加进度显示 if (j - tmp == (total - tmp) / 10 * decades_passed) { ProgressBar(j - tmp, total - tmp); decades_passed++; } } if (save) page=0; // 跳回第一页 ProgressBar(total - tmp, total - tmp); Bfile_CloseFile_OS(handle); MsgBoxPop(); return 1; }
void Page_Jump(const char* fn) { /* 跳页(界面绘制) 参数说明: fn: 当前打开文件的文件名 */ FONTCHARACTER fname[64]; char tip[64],tmp[64]; char keybuff[32]; // 接受页码的字符缓冲区 int inspos=0,target; memset(keybuff, 0, sizeof(keybuff)); MsgBoxPush(5); beg: font16 = open_font("\\\\fls0\\24PX.hzk"); select_font(font16); ClearArea(0,192,384,216); draw_pic(0,192,61,22,0,Menu_Sub_Jump); draw_pic(63,192,61,22,0,Menu_Jump); ClearArea(35,45,349,166); print_chs_2(38,47,0,"当前页/已缓存页数:"); locate_OS(3,3); memset(tmp,0,sizeof(tmp));memset(tip,0,sizeof(tip)); itoa(page+1,tmp,10);strcat(tip,tmp); strcat(tip,"/");memset(tmp,0,sizeof(tmp)); itoa(cached,tmp,10);strcat(tip,tmp); Print_OS(tip,0,0); print_chs_2(38,119,0,"输入目标页码:"); locate_OS(3,6); Print_OS("[ ]",0,0); locate_OS(4,6); Print_OS(keybuff,0,0); close_font(font16); while (1) { int key; GetKey(&key); switch (key) { case KEY_CTRL_EXIT: MsgBoxPop(); return;break; case KEY_CTRL_F2: Confirm_AllDivide(fn); // 尝试全部分页 goto beg;break; case KEY_CTRL_DEL: if (inspos>0) { keybuff[--inspos]=0; // 最后一个字节置为 NULL,标识已删除 goto beg; } break; case KEY_CTRL_F1: case KEY_CTRL_EXE: if (inspos==0) break; target=atoi(keybuff); if (target>cached) // 如果目标位置超出已缓存页面数,尝试分页 { if (!divide_page(fn, target-cached, 1)) page = cached - 1; // 若分页已达文件末尾,则将当前页面修正到最后一页 else page=target-1; // 否则修正当前页面为输入的目标位置 } else page=target-1; // 修正当前页面为输入的目标位置 MsgBoxPop(); return;break; default: if (key>=0x30&&key<=0x39) // 输入数字 0~9 { if (inspos<=3) { if (key==0x30&&inspos==0) break; // 尝试第一位输入 0 时跳出 keybuff[inspos++]=key; // 最后一个字节添加输入 goto beg; } } } } }
void Read_Bookmark(const char* fn,int* pages,int* n) { /* 读取书签(界面绘制) 参数说明: fn: 当前打开文件的文件名 pages: 接受当前所在页码的缓冲区 n: 接受已缓存页面数的缓冲区 */ int handle,_n=0,_page=*pages; int i,sel=0; FONTCHARACTER fname[64]; char tip[64],tmp[64]; MsgBoxPush(5); beg: font16 = open_font("\\\\fls0\\24PX.hzk"); select_font(font16); ClearArea(0,192,384,216); draw_pic(0,192,61,22,0,Menu_ReadB); ClearArea(35,49,349,166); print_chs_2(38,47,0,"读取书签"); close_font(font16); for (i=0;i<4;++i) { memset(tmp,0,sizeof(tmp));memset(tip,0,sizeof(tip)); strcat(tip,"["); itoa(i+1,tmp,10);strcat(tip,tmp); strcat(tip,"]"); if (bookmark[i]) { strcat(tip," Page "); memset(tmp,0,sizeof(tmp)); itoa(bookmark[i],tmp,10);strcat(tip,tmp); } else strcat(tip," Empty"); locate_OS(3,3+i); Print_OS(tip,0,0); } Bdisp_AreaReverseVRAM(35,72+sel*24,349,94+sel*24); while (1) { int key; GetKey(&key); switch (key) { case KEY_CTRL_UP: if (sel>0) --sel; goto beg;break; case KEY_CTRL_DOWN: if (sel<3) ++sel; goto beg;break; case KEY_CTRL_EXE: if (bookmark[sel]) { *pages=bookmark[sel]-1; // 读取书签 MsgBoxPop(); return; } else goto beg;break; case KEY_CTRL_F1: case KEY_CTRL_EXIT: *pages=_page; MsgBoxPop(); return;break; } } }
void Save_Bookmark(const char* fn,unsigned int pages,int n) { /* 存储书签(界面绘制) 参数说明: fn: 当前打开文件的文件名 pages: 当前所在页码 n: 已缓存页面数 */ int handle,size,i=0; int sel=0,flag; char tip[64],tmp[64]; MsgBoxPush(5); beg: flag=0; font16 = open_font("\\\\fls0\\24PX.hzk"); select_font(font16); ClearArea(0,192,384,216); draw_pic(0,192,124,22,0,Menu_PutB); ClearArea(35,49,349,166); print_chs_2(38,47,0,"存储书签"); close_font(font16); for (i=0;i<4;++i) { memset(tmp,0,sizeof(tmp));memset(tip,0,sizeof(tip)); strcat(tip,"["); itoa(i+1,tmp,10);strcat(tip,tmp); strcat(tip,"]"); if (bookmark[i]) { strcat(tip," Page "); memset(tmp,0,sizeof(tmp)); itoa(bookmark[i],tmp,10);strcat(tip,tmp); } else strcat(tip," Empty"); locate_OS(3,3+i); Print_OS(tip,0,0); } Bdisp_AreaReverseVRAM(35,72+sel*24,349,94+sel*24); while (1) { int key; GetKey(&key); switch (key) { case KEY_CTRL_UP: if (sel>0) --sel; goto beg;break; case KEY_CTRL_DOWN: if (sel<3) ++sel; goto beg;break; case KEY_CTRL_F1: case KEY_CTRL_EXE: bookmark[sel]=pages+1; // 存储书签 goto prg;break; case KEY_CTRL_F2: case KEY_CTRL_DEL: bookmark[sel]=0;flag=1;goto prg;break; // 删除书签 case KEY_CTRL_EXIT: MsgBoxPop(); return; } } prg: Save_Config(fn,n); if (flag) goto beg; MsgBoxPop(); }