| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2111 人关注过本帖
标题:[求助]请问用C能否编写一个 比较美观,漂亮的菜单
只看楼主 加入收藏
ehyyngp
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2005-11-25
收藏
得分:0 
win_tc 运行的时候能显示汉字吗
我的怎么输出的是乱码
2005-12-23 17:16
qingfen
Rank: 1
等 级:新手上路
帖 子:53
专家分:0
注 册:2005-12-23
收藏
得分:0 
好像有那个printf()吧,但你有中UCDOS或是天汇汉字系统了没有?
2005-12-27 01:43
jig
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
帖 子:530
专家分:242
注 册:2005-12-27
收藏
得分:0 

当然是可以的

而且可以做出像XP那样的界面


个人网站 -  http://.h001.
2005-12-27 15:03
Prince_bule
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2005-12-27
收藏
得分:0 

在UNIX下用curses.h是可以编写的.


#define _XOPEN_SOURCE_EXTENDED
#include <curses.h>
#include <stdlib.h>
#define ESC 27
#define ENTER 10

#define ITEM_NUM_1 1
#define ITEM_NUM_2 2
#define ITEM_NUM_3 3
#define ITEM_NUM_4 4

#define ITEM_NO_1 1
#define ITEM_NO_2 2
#define ITEM_NO_3 3
#define ITEM_NO_4 4

void init_curses(void);
void Draw_menuhead(WINDOW *menuhead);
WINDOW **Draw_menu(int start_cols,int itemNo);
void Del_menu(WINDOW **items,int itemNum);
int item_num(int itemNo);

main()
{
WINDOW *menuhead,*message;
WINDOW **items;/*菜单项目指针,数组元素指向菜单项子项*/
int Key;
int count;/*菜单子项的数目*/
int Re_item;/*菜单浏览返回值*/

init_curses();

wbkgd(stdscr,COLOR_PAIR(1));
menuhead=subwin(stdscr,1,80,0,0);
message=subwin(stdscr,1,79,23,1);

Draw_menuhead(menuhead);/*绘制菜单头部*/
move(2,1);
printw("Please F1--F4 Select Menu...");
move(3,1);
printw("Please ESC Quit...");
printw("%d\n",KEY_F(1));
do
{
Key=getch();
printw("%d\n",Key);
switch(Key)
{
case KEY_F(1):
printw("------\n");
items=Draw_menu(3,ITEM_NO_1);/*第3列,第1菜单*/
Re_item=view_menu(items,/*ITEM_NUM_1,*/3,ITEM_NO
_1);
touchwin(stdscr);
refresh();
break;

case KEY_F(2):
items=Draw_menu(23,ITEM_NO_2);/*第23列,第2菜单*
/
Re_item=view_menu(items,/*ITEM_NUM_2,*/23,ITEM_N
O_2);
touchwin(stdscr);
refresh();
break;

case KEY_F(3):
items=Draw_menu(43,ITEM_NO_3);/*第43列,第3菜单*
/
Re_item=view_menu(items,/*ITEM_NUM_3,*/43,ITEM_N
O_3);
touchwin(stdscr);
refresh();
break;

case KEY_F(4):
items=Draw_menu(63,ITEM_NO_4);/*第63列,第4菜单*
/
Re_item=view_menu(items,/*ITEM_NUM_4,*/63,ITEM_N
O_4);
touchwin(stdscr);
refresh();
break;

default: break;
}
} while(Key!=ESC);

delwin(message);
delwin(menuhead);
endwin();
exit(0);
}

void Draw_menuhead(WINDOW *menuhead)
{
wbkgd(menuhead,COLOR_PAIR(2));
wrefresh(menuhead);
wmove(menuhead,0,0);
waddstr(menuhead,"菜单1");
wattron(menuhead,COLOR_PAIR(3));
waddstr(menuhead,"(F1)");
wattroff(menuhead,COLOR_PAIR(3));
wmove(menuhead,0,20);
waddstr(menuhead,"菜单2");
wattron(menuhead,COLOR_PAIR(3));
waddstr(menuhead,"(F2)");
wattroff(menuhead,COLOR_PAIR(3));
wmove(menuhead,0,40);
waddstr(menuhead,"菜单3");
wattron(menuhead,COLOR_PAIR(3));
waddstr(menuhead,"(F3)");
wattroff(menuhead,COLOR_PAIR(3));
wmove(menuhead,0,60);
waddstr(menuhead,"菜单4");
wattron(menuhead,COLOR_PAIR(3));
waddstr(menuhead,"(F4)");
wattroff(menuhead,COLOR_PAIR(3));
}

void init_curses(void)
{
initscr();
noecho();
keypad(stdscr,TRUE);
/*intrflush(stdscr,FALSE);*/
start_color(); /*初始化*/
init_pair(1,COLOR_WHITE,COLOR_BLUE);
init_pair(2,COLOR_BLUE,COLOR_WHITE);
init_pair(3,COLOR_RED,COLOR_WHITE);

curs_set(0); /*设置光标不可见*/
}

WINDOW **Draw_menu(int start_cols,int itemNo)
{
WINDOW **items;

switch(itemNo)
{
case 1:
printw("---\n");
items=(WINDOW **)malloc((ITEM_NUM_1+1)*sizeof(WINDOW *))
;

items[0]=newwin(ITEM_NUM_1+2,19,1,start_cols);
wbkgd(items[0],COLOR_PAIR(2));
box(items[0],ACS_VLINE,ACS_HLINE);

items[1]=subwin(items[0],1,17,2,start_cols+1);
wprintw(items[1],"子项A1");
items[2]=subwin(items[0],1,17,3,start_cols+1);
wprintw(items[2],"子项A2");
items[3]=subwin(items[0],1,17,4,start_cols+1);
wprintw(items[3],"子项A3");
items[4]=subwin(items[0],1,17,5,start_cols+1);
wprintw(items[4],"子项A4");
break;

case 2:
items=(WINDOW **)malloc((ITEM_NUM_2+1)*sizeof(WINDOW *))
;

items[0]=newwin(ITEM_NUM_2+2,19,1,start_cols);
wbkgd(items[0],COLOR_PAIR(2));
box(items[0],ACS_VLINE,ACS_HLINE);

items[1]=subwin(items[0],1,17,2,start_cols+1);
wprintw(items[1],"子项B1");
items[2]=subwin(items[0],1,17,3,start_cols+1);
wprintw(items[2],"子项B2");
items[3]=subwin(items[0],1,17,4,start_cols+1);
wprintw(items[3],"子项B3");
items[4]=subwin(items[0],1,17,5,start_cols+1);
wprintw(items[4],"子项B4");
break;

case 3:
items=(WINDOW **)malloc((ITEM_NUM_3+1)*sizeof(WINDOW *))
;

items[0]=newwin(ITEM_NUM_3+2,19,1,start_cols);
wbkgd(items[0],COLOR_PAIR(2));
box(items[0],ACS_VLINE,ACS_HLINE);

items[1]=subwin(items[0],1,17,2,start_cols+1);
wprintw(items[1],"子项C1");
items[2]=subwin(items[0],1,17,3,start_cols+1);
wprintw(items[2],"子项C2");
items[3]=subwin(items[0],1,17,4,start_cols+1);
wprintw(items[3],"子项C3");
items[4]=subwin(items[0],1,17,5,start_cols+1);
wprintw(items[4],"子项C4");
break;

case 4:
items=(WINDOW **)malloc((ITEM_NUM_4+1)*sizeof(WINDOW *))
;


items[0]=newwin(ITEM_NUM_4+2,19,1,start_cols);
wbkgd(items[0],COLOR_PAIR(2));
box(items[0],ACS_VLINE,ACS_HLINE);

items[1]=subwin(items[0],1,17,2,start_cols+1);
wprintw(items[1],"子项D1");
items[2]=subwin(items[0],1,17,3,start_cols+1);
wprintw(items[2],"子项D2");
items[3]=subwin(items[0],1,17,4,start_cols+1);
wprintw(items[3],"子项D3");
items[4]=subwin(items[0],1,17,5,start_cols+1);
wprintw(items[4],"子项D4");
break;

default: break;
}
wbkgd(items[1],COLOR_PAIR(1));
wrefresh(items[0]);
return items;
}

view_menu(WINDOW **items,/*int itemNum,*/int start_cols,int itemNo)
{
int select=0;/*适应求余算法,0--itemNum-1,对应1--itemNum*/
int Key;
int itemNum;

itemNo=itemNo-1;/*适应求余算法,0--3对应1--4*/
wrefresh(items[0]);
A1:
itemNum=item_num(itemNo+1);
while(1)
{
Key=getch();
if(Key==KEY_DOWN || Key==KEY_UP)
{
wbkgd(items[select+1],COLOR_PAIR(2));
wnoutrefresh(items[select+1]);
if (Key==KEY_DOWN)
select=(select+1) % itemNum;
else
select=(select+itemNum-1) % itemNum;
wbkgd(items[select+1],COLOR_PAIR(1));
wnoutrefresh(items[select+1]);/*select+1为第几项目1/2/3.
./itemNum*/
doupdate();
}
else
{
if (Key==KEY_LEFT || Key==KEY_RIGHT)
{
Del_menu(items,itemNum+1);
touchwin(stdscr);
refresh();
}
if (Key==KEY_RIGHT)
{
if (start_cols<63)
{
itemNo=(itemNo+1) % 4; /*4: 一共4个菜单*
/
start_cols=start_cols+20; /*20: 菜单之间
原点间隔数*/
}
else
{
itemNo=0;
start_cols=3;
}
}
else if (start_cols>3)
{
itemNo=(itemNo+4-1) % 4;
start_cols=start_cols-20;
}
else
{
itemNo=3;
start_cols=63;
}

items=Draw_menu(start_cols,itemNo+1);/*itemNo+1为菜单号1
\2\3\4*/
select=0;

goto A1;
/*return view_menu(items,4,start_cols); */
}

if (Key==ESC)
return( -1 );
else if(Key==ENTER)
return 1;
}
}


void Del_menu(WINDOW **items,int itemNum)
{
int i;
for(i=0;i<delwin(items[i]);i++)
free(items);
}


item_num(int itemNo)/*根据菜单号找出对应项目数*/
{
switch(itemNo)
{
case 1: return ITEM_NUM_1;
case 2: return ITEM_NUM_2;
case 3: return ITEM_NUM_3;
case 4: return ITEM_NUM_4;
}
}

/**** makefile ****/


2005-12-27 15:50
快速回复:[求助]请问用C能否编写一个 比较美观,漂亮的菜单
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019311 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved