📄 listbox.c
字号:
#include <curses.h>#include <panel.h>#include <menu.h>#include <stdlib.h>#include "public.h"#include "screen.h"#include "listbox.h"void FreeList(LIST_NODE *p) { MENU *menu = p->menu; ITEM** items = menu_items(menu); WINDOW* win = menu_win(menu); WINDOW* sub = menu_sub(menu); PANEL *panel = p->panel; LIST_RECORD *record = p->record; unpost_menu(menu); werase(win); wrefresh(win); delwin(sub); delwin(win); while(*items) free_item(*items++); del_panel(panel); free(record); free(p);}LIST_NODE *InitList(int y, int x, int disp, char *fname)//0-成功 !0-失败{ LIST_NODE *p; int rows, cols, maxitem = 0; int cnt = 0; char buf[80], name[80], tmp[80]; ITEM **items; LIST_RECORD *record; MENU *menu; FILE *fp; WINDOW *win; PANEL *panel; if((fp = fopen(fname,"r")) == NULL) { fprintf(stderr,"读列表文件[%s]失败\r",fname); return(NULL); } while((fscanf(fp, "%[^\n]\n", buf) != EOF)) maxitem++; rewind(fp); items = (ITEM **)calloc(maxitem + 1,sizeof(ITEM)); record = (LIST_RECORD *)calloc(maxitem + 1,sizeof(LIST_RECORD)); if(disp > maxitem) disp = maxitem; while((fscanf(fp, "%[^\n]\n", buf) != EOF)) { memset(name, 0, sizeof(name)); memset(tmp, 0, sizeof(tmp)); GetString(tmp, buf, 1, '|'); strcat(name, tmp); memset(record[cnt].ret, 0 ,sizeof(record[cnt].ret)); strcpy(record[cnt].ret, Trim(tmp)); strcat(name, " "); memset(tmp, 0, sizeof(tmp)); GetString(tmp, buf, 2, '|'); strcat(name, tmp); memset(record[cnt].name, 0, sizeof(record[cnt].name)); strcpy(record[cnt].name, name); items[cnt] = new_item(record[cnt].name,NULL); cnt++; } items[cnt] = (ITEM *) NULL; fclose(fp); if(!(menu = new_menu(items))){ //建立列表项 perror("建立列表项失败!"); return(NULL); } set_menu_format(menu, disp, 1); scale_menu(menu, &rows, &cols); menu_opts_off(menu,O_SHOWDESC); if(win = newwin(rows + 2, cols + 4, y, x)) { //建立新窗口 if((panel = new_panel(win)) == NULL) { //窗口与屏面关联 perror("建立列表屏幕失败!"); return(NULL); } keypad(win, TRUE); set_menu_win(menu, win);//菜单与窗口关联 set_menu_sub(menu, derwin(win, rows, cols, 1, 2));//画菜单子项 } else { perror("建立列表窗口失败!"); return(NULL); } box(win, 0, 0); if(post_menu(menu) != E_OK ) { //显示菜单 perror("显示列表失败!"); return(NULL); } else { update_panels();//更新屏幕 doupdate();//刷新 } p = (LIST_NODE * ) malloc(sizeof(LIST_NODE)); p->record = record; p->menu = menu; p->panel = panel; return(p);}int ListIndex(MENU *menu){ return(item_index(current_item(menu)));}char *DriverList(LIST_NODE *p){ int c; MENU *menu = p->menu; WINDOW *win = menu_win(menu); while(c = wgetch(win)) switch(c) { case KEY_DOWN: menu_driver(menu, REQ_DOWN_ITEM); break; case KEY_UP: menu_driver(menu, REQ_UP_ITEM); break; case 'N': menu_driver(menu, REQ_SCR_DPAGE); break; case 'P': menu_driver(menu, REQ_SCR_UPAGE); break; case 0x0a://Enter return(p->record[ListIndex(menu)].ret); case 0x1b://ESC return((char *) 0); default: menu_driver(menu,c); break; }}/*char *ListBox(int y, int x, int len, char *fname){ static char listret[32]; LIST_NODE *p; int ret; if((p = InitList(y, x, len, fname)) == NULL) return((char *) NULL); strcpy(listret, DriverList(p)); FreeList(p); return(listret);}*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -