扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
/*********** 主程序 ****************/
/*** cc menu.c -lcurses -omenu */
#include <stdio.h>
#include <curses.h>
#include <ctype.h>
#define ENTER 10
#define ESCAPE 27
WINDOW *menubar,*messagebar,*temp,*temp1;
char param[10][10][13];
void init_curses()
{
initscr();
start_color();
init_pair(1,COLOR_WHITE,COLOR_BLUE);
init_pair(2,COLOR_BLUE,COLOR_WHITE);
init_pair(3,COLOR_RED,COLOR_WHITE);
init_pair(4,COLOR_WHITE,COLOR_RED);
curs_set(0);
noecho();
keypad(stdscr,TRUE);
}
void GetSubStr(char *des, char *src, char ch,int n)
{
int i,len;
char *p1,*p, tmp[300];
strcpy( tmp, src );
*des=0;
p1 = tmp;
i=0;
while(i<n)
{
i++;
p = (char *)strchr(p1,ch);
if(p != NULL)
{
*p++ = 0;
p1 = p;
}
}
p = (char *)strchr(p1,ch);
if(p != NULL)
{
*p = 0;
strcpy(des,p1);
}
}
int get_param(char *name)
{
FILE *fp;
char ss[201],xm[3],gs[3];
int i,j;
sprintf(ss,"%s.conf",name);
if((fp=fopen(ss,"r"))==NULL) return(-1);
for(j=0;j<10;j++) for(i=0;i<10;i++) memset(param[j][i],0,13);
while(1)
{
memset(ss,0,201);
fgets(ss,200,fp);
if(feof(fp)) break;
if(ss[0]=='#') continue;
GetSubStr(xm,ss,'|',0);
GetSubStr(gs,ss,'|',1);
j=atoi(xm);
for(i=1;i<=atoi(gs);i++)
{
sprintf(param[j][0],"%s",gs);
GetSubStr(param[j][i],ss,'|',i+1);
}
}
fclose(fp);
return(0);
}
void draw_menubar(WINDOW *menubar)
{
int i;
wbkgd(menubar,COLOR_PAIR(2));
for(i=0;i<atoi(param[0][0]);i++)
{
wattron(menubar,COLOR_PAIR(3));
mvwprintw(menubar,0,i*14+2,"%1d.",i+1);
wattroff(menubar,COLOR_PAIR(3));
mvwprintw(menubar,0,i*14+4,"%-12s",param[0][i+1]);
}
}
WINDOW **draw_menu(int menu)
{
int i,start_col;
WINDOW **items;
items=(WINDOW **)malloc((atoi(param[menu][0])+1)*sizeof(WINDOW *));
start_col=(menu-1)*14+2;
items[0]=newwin(atoi(param[menu][0])+2,14,3,start_col);
wbkgd(items[0],COLOR_PAIR(2));
box(items[0],ACS_VLINE,ACS_HLINE);
for(i=1;i<=atoi(param[menu][0]);i++)
{
items[i]=subwin(items[0],1,12,3+i,start_col+1);
wprintw(items[i],"%s",param[menu][i]);
}
wbkgd(items[1],COLOR_PAIR(4));
wrefresh(items[0]);
return items;
}
void delete_menu(WINDOW **items,int count)
{
int i;
for(i=0;i<count;i++) delwin(items[i]);
free(items);
}
int scroll_menu(WINDOW **items,int menu)
{
int key,count,selected=0;
count=atoi(param[menu][0]);
while (1)
{
key=getch();
if (key==KEY_DOWN || key==KEY_UP)
{
wbkgd(items[selected+1],COLOR_PAIR(2));
wnoutrefresh(items[selected+1]);
if (key==KEY_DOWN)
selected=(selected+1) % count;
else
selected=(selected+count-1) % count;
wbkgd(items[selected+1],COLOR_PAIR(4));
wnoutrefresh(items[selected+1]);
doupdate();
}
else if (key==KEY_LEFT || key==KEY_RIGHT)
{
delete_menu(items,count+1);
touchwin(stdscr);
refresh();
if (key==KEY_LEFT)
{
menu-=1;
if(menu<=0) menu=atoi(param[0][0]);
items=draw_menu(menu);
return scroll_menu(items,menu);
}
if (key==KEY_RIGHT)
{
menu+=1;
if(menu>atoi(param[0][0])) menu=1;
items=draw_menu(menu);
return scroll_menu(items,menu);
}
}
else if (key==ESCAPE || key=='0' || key=='q')
{
delete_menu(items,count+1);
return -1;
}
else if (key==ENTER)
{
delete_menu(items,count+1);
return selected;
}
}
}
message(char *ss)
{
wbkgd(messagebar,COLOR_PAIR(2));
wattron(messagebar,COLOR_PAIR(3));
mvwprintw(messagebar,0,0,"%80s"," ");
mvwprintw(messagebar,0,(80-strlen(ss))/2-1,"%s",ss);
wattroff(messagebar,COLOR_PAIR(3));
wrefresh(messagebar);
}
int main(int argc,char **argv)
{
int key;
int selected_item;
char ss[81];
WINDOW **menu_items;
if(get_param(argv[0]))
{
printf("\n打开配置文件 %s.conf 错!\n",argv[0]);
return(-1);
}
init_curses();
bkgd(COLOR_PAIR(1));
menubar=subwin(stdscr,1,80,1,0);
messagebar=subwin(stdscr,1,80,24,0);
temp=subwin(stdscr,22,80,2,0);
temp1=subwin(stdscr,20,78,3,1);
strcpy(ss,"通用菜单生成程序");
mvwprintw(stdscr,0,(80-strlen(ss))/2-1,"%s",ss);
draw_menubar(menubar);
message("请按数字键选择相应菜单. ESC 或'0'键退出.");
box(temp,ACS_VLINE,ACS_HLINE);
refresh();
do {
key=getch();
if(isdigit(key)&&key>'0'&&key<=atoi(param[0][0])+'0')
{
werase(messagebar);
wrefresh(messagebar);
menu_items=draw_menu(key-'0');
selected_item=scroll_menu(menu_items,key-'0');
touchwin(stdscr);
refresh();
}
} while (key!=ESCAPE && key!='q' && key!='0');
delwin(temp1);
delwin(temp);
delwin(menubar);
delwin(messagebar);
endwin();
return(0);
}
菜单参数配置文件 menu.conf
#
# 格式为: 菜单号|项目个数|项目名称......
# 菜单数量最大为10个
#
0|6|菜单一|菜单二|菜单三|菜单四|菜单五|菜单六|
1|3|menu11|menu12|menu13|
2|8|menu21|menu22|menu23|menu24|menu25|menu26|menu27|menu28|
3|5|menu31|menu32|menu33|menu34|menu35|
4|4|menu41|menu42|menu43|menu44|
5|2|menu51|menu52|
6|1|menu61|
濠电姷鏁告慨鐑姐€傛禒瀣劦妞ゆ巻鍋撻柛鐔锋健閸┾偓妞ゆ巻鍋撶紓宥咃躬楠炲啫螣鐠囪尙绐為梺褰掑亰閸撴盯鎮惧ú顏呪拺闂傚牊鍗曢崼銉ョ柧婵犲﹤瀚崣蹇旂節婵犲倻澧涢柛瀣ㄥ妽閵囧嫰寮介妸褋鈧帡鏌熼挊澶婃殻闁哄瞼鍠栭幃婊堝煛閸屾稓褰嬮柣搴ゎ潐濞叉ê鐣濈粙璺ㄦ殾闁割偅娲栭悡娑㈡煕鐏炲墽鐭嬫繛鍫熸倐濮婄粯鎷呯粵瀣異闂佹悶鍔嬮崡鍐茬暦閵忋倕鍐€妞ゆ劑鍎卞皬闂備焦瀵х粙鎴犫偓姘煎弮瀹曚即宕卞Ο闀愮盎闂侀潧鐗嗛幊搴㈡叏椤掆偓閳规垿鍩ラ崱妞剧凹濠电姰鍨洪敋閾荤偞淇婇妶鍛櫤闁稿鍊圭换娑㈠幢濡纰嶉柣搴㈣壘椤︾敻寮诲鍫闂佸憡鎸鹃崰搴敋閿濆鏁嗗〒姘功閻绻涢幘鏉戠劰闁稿鎹囬弻锝呪槈濞嗘劕纾抽梺鍝勬湰缁嬫垿鍩為幋锕€宸濇い鏇炴噺閳诲﹦绱撻崒娆戝妽妞ゃ劌鎳橀幆宀勫磼閻愰潧绁﹂柟鍏肩暘閸斿矂鎮為崹顐犱簻闁圭儤鍨甸鈺呮倵濮橆剦妲归柕鍥у瀵粙濡歌閸c儳绱撴担绛嬪殭婵☆偅绻堝濠氭偄绾拌鲸鏅i悷婊冪Ч閹﹢鎳犻鍌滐紲闁哄鐗勯崝搴g不閻愮儤鐓涢悘鐐跺Г閸犳﹢鏌℃担鐟板鐎规洜鍠栭、姗€鎮╅搹顐ら拻闂傚倷娴囧畷鍨叏閹惰姤鈷旂€广儱顦崹鍌炴煢濡尨绱氶柨婵嗩槸缁€瀣亜閺嶃劎鈽夋繛鍫熺矒濮婅櫣娑甸崨顔俱€愬銈庡亝濞茬喖宕洪埀顒併亜閹哄棗浜鹃梺鎸庢穿婵″洤危閹版澘绫嶉柛顐g箘椤撴椽姊虹紒妯哄鐎殿噮鍓欒灃闁告侗鍠氶崢鎼佹⒑閸撴彃浜介柛瀣閹﹢鏁冮崒娑氬幈闁诲函缍嗛崑鍡樻櫠椤掑倻纾奸柛灞剧☉缁椦囨煙閻熸澘顏柟鐓庢贡閹叉挳宕熼棃娑欐珡闂傚倸鍊风粈渚€骞栭銈傚亾濮樺崬鍘寸€规洖缍婇弻鍡楊吋閸涱垽绱遍柣搴$畭閸庨亶藝娴兼潙纾跨€广儱顦伴悡鏇㈡煛閸ャ儱濡煎褜鍨伴湁闁绘ǹ绉鍫熺畳闂備焦瀵х换鍌毼涘Δ鍛厺闁哄洢鍨洪悡鍐喐濠婂牆绀堟慨妯挎硾閽冪喖鏌曟繛褍瀚烽崑銊╂⒑缂佹ê濮囨い鏇ㄥ弮閸┿垽寮撮姀鈥斥偓鐢告煥濠靛棗鈧懓鈻嶉崶銊d簻闊洦绋愰幉楣冩煛鐏炵偓绀嬬€规洟浜堕、姗€鎮㈡總澶夌处
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者