功能还不是很完善,我正在改进中。这个小东东折腾了我好几天。 :oops:
[code:1:0c9ffa1d10]
/*********** 主程序 ****************/
/*** 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);
}
[/code:1:0c9ffa1d10]
htldm 回复于:2003-10-11 08:54:55 |
菜单参数配置文件 menu.conf
[code:1:26d743f75f] # # 格式为: 菜单号|项目个数|项目名称...... # 菜单数量最大为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| [/code:1:26d743f75f] |
海德 回复于:2003-10-11 09:31:47 |
:lol: |
kofd 回复于:2003-10-11 09:48:35 |
好东西,珍藏! |
foolboy007 回复于:2003-10-11 10:01:07 |
跟俺这的程序差不多
只不过 俺这的菜单配置程序是xml格式的 不知道有啥区别 |
tingya 回复于:2003-10-11 10:33:24 |
比起我的功能差远了。可以支持任意多层次的菜单,需要者请到
http://asp.6to23.com/vcprogram/resdown/resource/fmenu.zip下在,这是图书<unix/Linux下的Curses库开发指南>配套原程序.下在后请奖程序中所有的 f_winlabel.h该成f_menuhead.h进行便宜. |
sdccf 回复于:2003-10-11 14:34:00 |
错别字多多! |
tingya 回复于:2003-10-12 12:25:55 |
能看懂就行,你老兄一定是看懂了。:) |
alanlql 回复于:2003-10-12 22:57:38 |
楼上的朋友,我这好象不能下哦,hehe |
li2002 回复于:2003-10-13 09:15:56 |
确实下不了,下不了的东东就不要说了,浪费大家时间~~ |
kunrong 回复于:2003-10-13 09:34:55 |
确实不错!谢谢楼主!我要好好的读一下!认真的学习一下! |
阿徐 回复于:2003-10-13 11:56:11 |
嗬嗬,很有用,但是还有一个问题,比方说,如果我要进入菜单后按enter,如何执行程序,或弹出另外一个子窗口,该如何实现,我也来修改
学习看看,把这个东东完善!! |
tingya 回复于:2003-10-13 12:33:25 |
http://asp.6to23.com/vcprogram/resdown/resource/fmenu.zip |
阿徐 回复于:2003-10-13 13:03:35 |
楼上的,还是不能呀,你这个东东阿保存为0字节,不能下 |
mrhxn 回复于:2003-10-13 13:59:06 |
的确不行!贴一个上来! |
kunrong 回复于:2003-10-13 15:28:43 |
真的不能下哦。。。。。期待中。。。。。。 |
sdccf 回复于:2003-10-13 20:55:18 |
http://unix-cd.com/softdown/show.asp?id=539 |
edit 回复于:2003-10-14 09:46:49 |
有错
cc -g f_loadfield.c f_loadlabel.c f_otherfun.c xmlparse.c hashtable.c xmltok.c xmlrole.c f_drawform.c -lform -lcurses f_loadfield.c: "./f_menuhead.h", line 137: error: identifier redeclared: F_MENU f_loadlabel.c: |
sdccf 回复于:2003-10-14 09:53:18 |
请作者说一下在SCO UNIX下的编译方法. |
htldm 回复于:2003-10-14 09:56:17 |
这个程序确实还不是很完善,我也只是抛砖引玉,希望大家共同完善它 |
sdccf 回复于:2003-10-14 09:58:18 |
我是说那个随书的源程序。 |
lzlcd 回复于:2004-05-12 09:45:09 |
是个实用的好东东,我试用用看 |
lhk 回复于:2005-04-16 22:38:41 |
[quote:4f1885edf3="htldm"][/quote:4f1885edf3]
message() 不好用,不好用啊。反正我怎么试也没有看见帮助信息? 不知道怎么回事啊! 是一个问题, 怎么弄啊,告诉我啊 |
zhyesno 回复于:2005-04-18 08:58:20 |
不错,编译了,挺漂亮的.
Thx。。。 |
myqueue 回复于:2005-04-26 15:34:32 |
http://myqueue.net.dhis.org/mytui/index.php
也欢迎提宝贵意见 |
nirvana1125 回复于:2005-04-27 11:21:27 |
编译完成。确实很漂亮。我正在想怎么能实用呢。多谢。多谢! |
nirvana1125 回复于:2005-04-27 14:20:20 |
希望大侠们能指明如何调用外部shell,或者4gl等可执行程序。
感激。 |
延伸阅读
文章来源于领测软件测试网 https://www.ltesting.net/