• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

通用菜单生成程序

发布: 2007-6-08 22:43 | 作者: seanhe | 来源: | 查看: 19次 | 进入软件测试论坛讨论

领测软件测试网
功能还不是很完善,我正在改进中。这个小东东折腾了我好几天。 :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/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备2023014753号-2
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网