科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道应用软件通用菜单生成程序

通用菜单生成程序

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

生成菜单的程序代码

作者:UNIX中文 来源:UNIX中文 2007年9月15日

关键字: 菜单 程序 软件

  • 评论
  • 分享微博
  • 分享邮件

/***********  主程序 ****************/

/***     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|

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    闂傚倸鍊搁崐椋庢閿熺姴鐭楅幖娣妼缁愭鏌¢崶鈺佷汗闁哄閰i弻鏇$疀鐎n亞浠炬繝娈垮灠閵堟悂寮婚弴锛勭杸閻庯綆浜栭崑鎾诲冀椤撱劎绋忛梺璺ㄥ櫐閹凤拷

    濠电姷鏁告慨鐑姐€傛禒瀣劦妞ゆ巻鍋撻柛鐔锋健閸┾偓妞ゆ巻鍋撶紓宥咃躬楠炲啫螣鐠囪尙绐為梺褰掑亰閸撴盯鎮惧ú顏呪拺闂傚牊鍗曢崼銉ョ柧婵犲﹤瀚崣蹇旂節婵犲倻澧涢柛瀣ㄥ妽閵囧嫰寮介妸褋鈧帡鏌熼挊澶婃殻闁哄瞼鍠栭幃婊堝煛閸屾稓褰嬮柣搴ゎ潐濞叉ê鐣濈粙璺ㄦ殾闁割偅娲栭悡娑㈡煕鐏炲墽鐭嬫繛鍫熸倐濮婄粯鎷呯粵瀣異闂佹悶鍔嬮崡鍐茬暦閵忋倕鍐€妞ゆ劑鍎卞皬闂備焦瀵х粙鎴犫偓姘煎弮瀹曚即宕卞Ο闀愮盎闂侀潧鐗嗛幊搴㈡叏椤掆偓閳规垿鍩ラ崱妞剧凹濠电姰鍨洪敋閾荤偞淇婇妶鍛櫤闁稿鍊圭换娑㈠幢濡纰嶉柣搴㈣壘椤︾敻寮诲鍫闂佸憡鎸鹃崰搴敋閿濆鏁嗗〒姘功閻绻涢幘鏉戠劰闁稿鎹囬弻锝呪槈濞嗘劕纾抽梺鍝勬湰缁嬫垿鍩為幋锕€宸濇い鏇炴噺閳诲﹦绱撻崒娆戝妽妞ゃ劌鎳橀幆宀勫磼閻愰潧绁﹂柟鍏肩暘閸斿矂鎮為崹顐犱簻闁圭儤鍨甸鈺呮倵濮橆剦妲归柕鍥у瀵粙濡歌閸c儳绱撴担绛嬪殭婵☆偅绻堝濠氭偄绾拌鲸鏅i悷婊冪Ч閹﹢鎳犻鍌滐紲闁哄鐗勯崝搴g不閻愮儤鐓涢悘鐐跺Г閸犳﹢鏌℃担鐟板鐎规洜鍠栭、姗€鎮╅搹顐ら拻闂傚倷娴囧畷鍨叏閹惰姤鈷旂€广儱顦崹鍌炴煢濡尨绱氶柨婵嗩槸缁€瀣亜閺嶃劎鈽夋繛鍫熺矒濮婅櫣娑甸崨顔俱€愬銈庡亝濞茬喖宕洪埀顒併亜閹哄棗浜鹃梺鎸庢穿婵″洤危閹版澘绫嶉柛顐g箘椤撴椽姊虹紒妯哄鐎殿噮鍓欒灃闁告侗鍠氶崢鎼佹⒑閸撴彃浜介柛瀣閹﹢鏁冮崒娑氬幈闁诲函缍嗛崑鍡樻櫠椤掑倻纾奸柛灞剧☉缁椦囨煙閻熸澘顏柟鐓庢贡閹叉挳宕熼棃娑欐珡闂傚倸鍊风粈渚€骞栭銈傚亾濮樺崬鍘寸€规洖缍婇弻鍡楊吋閸涱垽绱遍柣搴$畭閸庨亶藝娴兼潙纾跨€广儱顦伴悡鏇㈡煛閸ャ儱濡煎褜鍨伴湁闁绘ǹ绉鍫熺畳闂備焦瀵х换鍌毼涘Δ鍛厺闁哄洢鍨洪悡鍐喐濠婂牆绀堟慨妯挎硾閽冪喖鏌曟繛褍瀚烽崑銊╂⒑缂佹ê濮囨い鏇ㄥ弮閸┿垽寮撮姀鈥斥偓鐢告煥濠靛棗鈧懓鈻嶉崶銊d簻闊洦绋愰幉楣冩煛鐏炵偓绀嬬€规洟浜堕、姗€鎮㈡總澶夌处

    重磅专题
    往期文章
    最新文章