Unix下用C编写类Windows菜单-C / C++-优质IT资源分享社区

admin
管理员
管理员
  • UID1
  • 粉丝27
  • 关注4
  • 发帖数581
  • 社区居民
  • 忠实会员
  • 原创写手
阅读:168回复:0

  Unix下用C编写类Windows菜单

楼主#
更多 发布于:2016-05-20 18:46

在开发程序时,程序的界面、开放性是两个非常重要的方面,目前,在Unix系统下运转的程序的界面大都比较呆板,并且,在进行功用扩大时也不是很便利。那么,能不能规划一个象

Windows那样可以依照用户请求随意调整界面,功用扩大便利的程序呢?答案是必定的。笔者经过实践,规划了一个菜单程序,使用户在对菜单的显式款式不满意时,只需经过对菜单参数文件进行操作即可完成对菜单方位、宽度、长度、是不是有边框等进行调整;在用户需求进行功用扩大时,也无须改动源程序,只须对参数文件进行操作就可将新增功用挂到菜单上。

一 参数文件阐明

本程序需求借肋两个参数文件来完成:

(1)、对菜单中每一项参数进行阐明的文件(menu.def),它格局如下所述:

!所属菜单代号!项顺序号!菜单项称号!外挂程序称号!下级菜单代号!

阐明:

1、如菜单代号为"0",则表明此项属于主菜单;

2、如外挂程序称号为"0",则表明此菜单项对应的进程在菜单程序内部或对应于一个子菜单;

3、如下级菜单代号为"0",则表明此菜单项无下级子菜单;

4、项顺序号一起可作为菜单热键使用。

假如文件menu.def中有下面这一行:

!0!3!格局化磁盘!format /dev/rfd0135ds18!0!

它表明主菜单的第三项为格局化磁盘,它对应的履行进程为 format

/dev/rfd0135ds18,本项无子菜单。

假如用户想把自个编的完成查询功用程序XXX挂到本程序主菜单第4项上,则可在menu.def中添加下面这一行:

!0!4!查询!XXX!0!

(2)、对各菜单参数进行阐明文件(menu.conf),其格局如下所述:

!菜单代号!上一级菜单代号!边框象征!菜单宽度!菜单行数!菜单列数!开始横坐标!开始纵坐标!

阐明:

1、边框象征为"0"表明无框,为"1"表明有边框;

2、上级菜单代号为"-1",表明无上级菜单;

3、如菜单代号为"0",表明主菜单。

当用户对菜单显现款式不满意时,可经过调整此文件规划个性化的界面。

二 编程完成

本程序文件为menu.c,有些代码如下:

#include

#define ESC 27

#define ENT 13

#define REFRESH 12

#define MAX_M 10 /* 菜单最大层数 */

void

initial(),nomlastpos(),revcurpos(),disponepage(),dispprevline();

void

dispnextline(),domenu(),getmenuconf(),keycont();

void getitem(), get_m_conf(),

get_m_item(),clearwin(),execprog();

/* 标识每一菜单项的构造 */

struct menu {

short menu_code; /* 所属菜单代号 */

short item_order; /* 项顺序号 */

char item[20]; /* 菜单项称号 */

char prog[80]; /* 本项菜单履行程序 */

short submenu_code; /* 下一级菜单编号 */

struct menu *next; /* 指向上一项的指针 */

struct menu *prev; /* 指向下一项的指针 */

}

m_item,*head,*this,*new,*last,*scrpos,*lastscrpos,*begin,*lastbegin,*lastscr[MAX_M];

/* 标识每一菜单内容的构造 */

struct menuconf {

short menu_code; /* 菜单代号 */

short last_code; /* 上一级菜单代号 */

short bord_flag; /* 边框象征 0--无边框 1--有边框 **/

short m_wight; /* 菜单显现宽度 */

short m_lengh; /* 每一行项数 */

short m_col; /* 菜单列数 */

short m_bx; /* 菜单开始横坐标 */

short m_by; /* 菜单开始纵坐标 */

} m_conf;

WINDOW *menuwin, *boxwin, *curw, *lastw[MAX_M],

*workwin;

long curpos, lastcurpos, lastscrcurpos,

lastmenucur[MAX_M];

short menu_no = 0, wno = 0;

/* 主函数 */

main()

{

initial();

getmenuconf(0); /* 取第0号菜单参数 */

/* 创立主窗口 */

menuwin=newwin(m_conf.m_lengh, m_conf.m_wight,

m_conf.m_bx+1, m_conf.m_by+1);

curw=menuwin; lastw[wno]=menuwin;

getitem(); /* 取当时菜单各项内容 */

domenu(head, 0);

endwin();

}

/* 取菜单各项参数函数 */

void getitem()

{

FILE *fp;

char buff[0x100];

/* 建边框窗口 */

boxwin=newwin(m_conf.m_lengh+2,m_conf.m_wight+2,m_conf.m_bx,m_conf.m_by);

keypad(curw, TRUE);

if (m_conf.bord_flag==1) {

box(boxwin, 0,0 );

wrefresh(boxwin);

}

head=NULL;

if ((fp = fopen("./menu.def","r")) == NULL) {

fprintf(stderr, "\n不能翻开菜单界说文件\n");

return;

}

while( fgets(buff, 0x100, fp)!=NULL) {

get_m_item(buff);

if (m_item.menu_code != menu_no)

continue;

new=(struct menu*)malloc(sizeof(struct menu));

if (head == NULL) {

last = head; head = new;

}

else {

this->next = new; last = this;

}

this = new;

this->menu_code=m_item.menu_code;

this->item_order=m_item.item_order;

strcpy(this->item,m_item.item);

strcpy(this->prog,m_item.prog);

this->submenu_code=m_item.submenu_code;

this->next=NULL;

this->prev = last;

}

fclose(fp);

}

/* 菜单处理函数 */

void domenu(curscrp, curp)

struct menu *curscrp;

int curp;

{

int i, x, y;

struct menu *mpos;

this = head;

disponepage(this);

curpos = curp; scrpos = curscrp;

lastcurpos = lastscrcurpos = 0;

revcurpos();

for(;;) {

switch (wgetch(curw)) {

case ENT:

/* 有下一级菜单 */

if ((!strcmp(scrpos->prog, "0")) &&

(scrpos->submenu_code != 0)) {

lastbegin = begin->next;

getmenuconf(scrpos->submenu_code);

menu_no = scrpos->submenu_code;

wno++;

lastmenucur[wno]=curpos;

lastscr[wno] = scrpos;

lastw[wno]=curw;

workwin=newwin(m_conf.m_lengh,m_conf.m_wight,m_conf.m_bx+1,m_conf.m_by+1);

curw=workwin;

getitem();

domenu(head, 0);

}

/* 是内部函数 */

/* 是外部可履行程序 */

else {

endwin();

execprog();

}

break;

case ESC:

case 'q':

case 'Q':

case '0':

/* 无上级菜单 */

if (m_conf.last_code == -1) {

clearwin(); endwin(); exit(0);

}

/* 有上级菜单 */

else {

menu_no = m_conf.last_code;

clearwin();

getmenuconf(menu_no);

getitem();

touchwin(lastw[wno]);

curw=lastw[wno];

curpos = lastmenucur[wno];

scrpos = lastscr[wno];

wno--;

wrefresh(curw);

}

break;

case 'r':

case 'R':

case REFRESH: /* 重显屏幕 */

wrefresh(curscr);

break;

case KEY_RIGHT: /* 右光标键 */

if ( scrpos->next != NULL ) {

lastcurpos = curpos; lastscrpos = scrpos;

scrpos=scrpos->next;

getyx(curw, x, y);

if((x==m_conf.m_lengh-1)&&(curpos%m_conf.m_col==m_conf.m_col-1)){

curpos-=(m_conf.m_col-1); lastcurpos = curpos -

1;

/* 完成向上卷屏 */

wmove(curw, 0, 0); wdeleteln(curw);

dispnextline("R");

}

else

curpos++;

if ((curpos%m_conf.m_col == 0) &&

(m_conf.m_lengh == 1)) {

revcurpos(); break;

}

else {

nomlastpos(); revcurpos();

}

}

break;

case KEY_LEFT: /* 左光标键 */

if ( scrpos->prev != NULL ) {

lastcurpos = curpos; lastscrpos = scrpos;

scrpos=scrpos->prev;

getyx(curw, x, y);

if ((x==0) && (curpos%m_conf.m_col ==0))

{

curpos+=m_conf.m_col-1; lastcurpos = curpos +

1;

/* 完成向下卷屏 */

winsertln(curw); dispprevline("L");

}

else

curpos--;

if

((curpos%m_conf.m_col==m_conf.m_col-1)&&(m_conf.m_lengh==1)) {

revcurpos(); break;

}

else {

nomlastpos(); revcurpos();

}

}

break;

case KEY_UP: /* 上光标键 */

lastcurpos = curpos; lastscrpos = scrpos;

mpos = scrpos;

for(i=0; i/td>

if ( mpos->prev != NULL )

mpos=mpos->prev;

else break;

}

if ( i==m_conf.m_col ) {

getyx(curw, x, y);

if (x==0) {

lastcurpos += m_conf.m_col;

/* 完成向下卷屏 */

winsertln(curw); dispprevline("U");

}

else {

curpos-=m_conf.m_col;

}

scrpos = mpos;

if ( m_conf.m_lengh!=1)

nomlastpos();

revcurpos();

}

break;

case KEY_DOWN: /* 下光标键 */

lastcurpos = curpos; lastscrpos = scrpos;

mpos = scrpos;

for(i=0; i/td>

if ( mpos->next != NULL )

mpos=mpos->next;

else

break;

}

if ( i==m_conf.m_col ) {

getyx(curw, x, y);

if (x==m_conf.m_lengh-1) {

lastcurpos -= m_conf.m_col;

/* 完成向上卷屏 */

wmove(curw, 0, 0); wdeleteln(curw);

dispnextline("D");

}

else

curpos+=m_conf.m_col;

scrpos = mpos;

if ( m_conf.m_lengh!=1)

nomlastpos();

revcurpos();

}

break;

default:

beep();

br

优质IT资源分享社区[font=Tahoma  ]为你提供此文。[font=Tahoma  ]

[font=Tahoma  ]本站有大量优质C、C++教程视频,资料等资源,包含C,C++基础教程,高级进阶教程等等,教程视频资源涵盖传智播客,极客学院,达内,北大青鸟,猎豹网校等等IT职业培训机构的培训教学视频,价值巨大。欢迎点击下方链接查看。[font=Tahoma  ]

C、C++教程视频

优质IT资源分享社区(www.itziyuan.top)
一个免费,自由,开放,共享,平等,互助的优质IT资源分享网站。
专注免费分享各大IT培训机构最新培训教学视频,为你的IT学习助力!

!!!回帖受限制请看点击这里!!!
!!!资源失效请在此版块发帖说明!!!

[PS:按 CTRL+D收藏本站网址~]

——“优质IT资源分享社区”管理员专用签名~

本版相似帖子

游客