用c或c++编写一个多级菜单。至少三级。

要求如题目所示,要尽量详细些。
最好是能在vc6.0上运行的,谢了,各位。

一个参考程序如下。程序涉及到一些底层库函数的调用和cpu内部寄存器的使用,需要有相当软硬件水准去理解。
编译环境:中文win-tc或tc3.0或borland c++
#include <stdio.h>
#include <dos.h>
#include <stdlib.h>
#include <bios.h>
#include <conio.h>
#include <string.h>
#include <ctype.h>

#define BORDER 1
#define ESC 27
#define REV_VID 0x1e
#define NORM_VID 0x40

char *main_menu[] =
{
"F --- 文件管理",
"D --- 磁盘管理",
"H --- 打印服务",
"X --- 退出菜单",
};

char* sub_menu1[] =
{
"S --- 文件显示",
"P --- 文件打印",
"C --- 文件拷贝",
"D --- 文件删除",
"X --- 返回上级",
};

char* sub_menu2[] =
{
"B --- BOOT区备份",
"R --- BOOT区恢复",
"X --- 返回上级",
};

char* sub_menu3[] =
{
"O --- 打印图形",
"F --- 打印文本",
"X --- 返回上级",
};

void goto_xy(int x, int y) /*将光标移动到指定位置*/
{
union REGS regs;
regs.h.ah = 2;
regs.h.dl = x;
regs.h.dh = y;
regs.h.bh = 0;
int86( 0x10, ®s, ®s );
}

void save_video( int startx, int endx, int starty, int endy, unsigned int* buf_ptr )
/*将指定区域的视频模式存储到指定的内存中去*/
{
union REGS r;
register int i, j;
for( i = starty; i < endy; i++)
for( j = startx; j < endx; j++ )
{
goto_xy(j, i);
r.h.ah = 8;
r.h.bh = 0;
*buf_ptr++ = int86( 0x10, &r, &r );
putchar(' ');
}
}

void chineseputs( int x, int y, char *p, int attrib ) /*在指定的位置显示中文字符*/
{
union REGS r;
while(*p)
{
r.h.ah = 2;
r.h.dl = x++;
r.h.dh = y;
int86(0x10, &r, &r);
r.h.ah = 9;
r.h.bh = 0;
r.x.cx = 1;
r.h.al = *p++;
r.h.bl = attrib;
int86( 0x10, &r, &r );

}
}

void disp_box( int x1, int y1, int x2, int y2, int attrib) /*显示边框*/
{
unsigned char* boxchar[6] = {"┏","━","┓","┃","┗","┛"};
register int i;
for( i = x1; i <= x2; i++ )
{
chineseputs( i, y1, boxchar[1], attrib );
chineseputs( i, y2, boxchar[1], attrib );
}
for( i = y1; i <= y2; i++ )
{
chineseputs( x1, i, boxchar[3], attrib );
chineseputs( x2, i, boxchar[3], attrib );
}
chineseputs( x1, y1, boxchar[0], attrib );
chineseputs( x2, y1, boxchar[2], attrib );
chineseputs( x2, y2, boxchar[5], attrib );
chineseputs( x1, y2, boxchar[4], attrib );
}

void display_menu( char* menu[], int x, int y, int count ) /*显示菜单项*/
{
register int i;
for( i = 0; i < count; i++, x++)
{
goto_xy( x, y );
cprintf( menu[i]);
}
}

int is_in( char* s, char c) /*返回字符串中热键的位置*/
{
register int i;
for( i = 0; *s; i++ )
if( *s++ == c ) return i + 1;
return 0;
}

int get_resp( int x, int y, int count, char* menu[], char* keys ) /*获得用户的响应*/
{
union inkey
{
char ch[2];
int i ;
} c ;
int arrow_choice = 0, key_choice;
y++;
goto_xy(x, y);
chineseputs( y, x, menu[0], REV_VID);
for(;;)
{
while(!bioskey(1));
c.i = bioskey(0);
goto_xy( x + arrow_choice, y);
chineseputs( y, x+arrow_choice, menu[arrow_choice], NORM_VID );
if( c.ch[0] )
{
key_choice = is_in( keys, tolower( c.ch[0] ));
if( key_choice ) return key_choice - 1;
switch( c.ch[0] )
{
case '\r': return arrow_choice;
case ' ': arrow_choice++;
break;
case ESC : return -1;
}
}
else
{
switch( c.ch[1] )
{
case 72: arrow_choice--;
break;
case 80: arrow_choice++;
break;
}
}
if( arrow_choice == count ) arrow_choice = 0;
if( arrow_choice < 0 ) arrow_choice = count - 1;
goto_xy( x + arrow_choice, y );
chineseputs( y, x+arrow_choice, menu[ arrow_choice ], REV_VID );
}
}

void restore_video( int startx, int endx, int starty, int endy, unsigned char* buf_ptr )
/*恢复原有的视频方式*/
{
union REGS r;
register int i, j;
for( j = startx; j < endx; j++)
for( j = starty; j < endy; j++ )
{
goto_xy(i, j);
r.h.ah = 9;
r.h.bh = 0;
r.x.cx = 1;
r.h.al = *buf_ptr++;
r.h.bl = *buf_ptr++;
int86( 0x10, &r, &r );
}
}

int popup( char* menu[], char* keys, int count, int x, int y, int border )
/*弹出式菜单的显示*/
{
register int i, len;
int endx, endy, choice;
unsigned int *p;
if((x>24)||(x<0)||(y>79)||(y<0))
{
printf("范围错");
return -2;
}
len = 0;
for( i = 0; i < count; i++ )
if( strlen( menu[i]) > len ) len = strlen( menu[i] );
endy = len + 2 + y;
endx = count + 1 + x;
if((endx+1>24)||(endy+1>79))
{
printf("菜单不匹配");
return -2;
}
p = (unsigned int *) malloc((endx-x+1)*(endy-y+1));
if( !p ) exit(1);
save_video( x, endx + 1, y, endy+1, p );
if( border ) disp_box( y, x, endy, endx, YELLOW );
display_menu( menu, x + 1, y + 1, count );
choice = get_resp( x + 1, y, count, menu, keys );
restore_video( x, endx + 1, y, endy + 2, (unsigned char* ) p);
free( p );
return choice;
}

int main()
{
int i, j;
directvideo = 0;
for(;;)
{
clrscr();
goto_xy(0, 0);
textcolor( BLACK );
textbackground( RED );
switch( popup( main_menu, "fdhx", 4,5, 16, BORDER ))
{
case 0:
clrscr();
switch( popup( sub_menu1, "spcdx", 5, 5, 16, BORDER ))
{
case 0:
clrscr();
goto_xy( 24, 20 );
cprintf("你选择了文件显示功能");
getch();
break;
case 1:
clrscr();
goto_xy( 24, 20 );
cprintf("你选择了文件打印功能");
getch();
break;
case 2:
clrscr();
goto_xy( 24, 20 );
cprintf("你选择了文件拷贝功能");
getch();
break;
case 3:
clrscr();
goto_xy(24,20);
cprintf("你选择了文件删除功能");
getch();
break;
case 4:
break;
default:
break;
}
break;
case 1:
clrscr();
switch( popup( sub_menu2, "brx", 3, 5, 16, BORDER ))
{
case 0:
clrscr();
goto_xy(24,20);
cprintf("你选择了BOOT区备份功能");
getch();
break;
case 1:
clrscr();
goto_xy(24,20);
cprintf("你选择了BOOT区恢复功能");
getch();
break;
case 2:
break;
default:
break;
}
break;
case 2:
clrscr();
switch( popup( sub_menu3, "of", 3, 5, 16, BORDER ))
{
case 0:
clrscr();
goto_xy( 24, 20 );
cprintf("你选择了打印图形功能");
getch();
break;
case 1:
clrscr();
goto_xy(24,20);
cprintf("你选择了打印文本功能");
getch();
break;
case 2:
break;
default:
break;
}
break;
case 3:
case -1:
return 0;
default:
break;
}
}

return 0;
}

那就是你的不是啰。要用vc可以到vc++板块提问,vb/vc调用几个控件就完事了。我原以为你是要用c写出代码。
温馨提示:内容为网友见解,仅供参考
第1个回答  2009-07-14
用可视化编程,现在哪还有用代码裸写图形界面的
第2个回答  2009-07-14
用MFC的话应该很容易吧
第3个回答  2009-07-14
我给你个建议:直接用资源编辑器,编辑一个3级菜单。用VC++把它显示出来,一切OK!

用c或c++编写一个多级菜单。至少三级。
while(!bioskey(1)); c.i = bioskey(0); goto_xy( x + arrow_choice, y); chineseputs( y, x+arrow_choice, menu[arrow_choice], NORM_VID ); if( c.ch[0] ) { key_choice = is_in( keys, tolower( c.ch[0] )); if( key_choice ) return key_choice - 1; switch( c.ch[0] ...

用C\/C++语言设置多级子菜单,设置快捷键,通过键盘激活快捷键
回答:比如有个菜单叫新建,你要在它上面加一个子菜单在属性中直接勾中pop-up,就会出现一个子菜单。 快捷键设置:可以简单的在字母的前面加&,如新建快捷方式为ctrl+N,则可以如下设置菜单caption,新建(&N)\\tCtrl+N 其实在Accelerator下的IDR_MAINFRAME中就可以直接指定某个菜单的快捷方式。

关于C和C++得编程。想用他们编一些界面 类似于对话框之类。之前听说C和...
函数caculate计算某个雷周围的雷数,根据前面的分析知道,计算某个雷周围的雷数本身就是一个递归过程,在编制时应注意递归的边界条件,稍不注意会陷入无穷递归而耗尽了系统的资源。 6. 菜单命令的响应是游戏交互的另一个重要方式,下面的九个命令响应函数分别与九个菜单项相对应,用以完成用户的更新和设置命令。 ongam...

C++编写一个菜单显示程序
include <string.h> using namespace std;void showMenu(){ cout<<"主 菜 单"<<endl;cout<<"1.添加记录 2.显示记录"<<endl;cout<<"3.读取记录 4.保存记录"<<endl;} void input(){ int select;cin>>select;switch(select){ case 0:exit(1); \/\/程序正常退出 case 1:cout<<"...

用C++编程:实现一个简单菜单程序,运行时显示“Menu:A(dd) D(elete...
char c;while(1){printf("A.增加\\nB.删除\\nC.排序\\nD.退出\\n");c=getchar();if(c=='A')printf("数据已增加");else if(c==‘B’)printf("数据已删除");else if(c=='C')printf("数据已排序");else if(c=='D')break;} ...

编写一个菜单程序输入1~5进入相应选择项假设相应选择为1加法运算2减法...
一、编写一个菜单程序,输入1~5,进入相应选择项。假设相应选择为“1、加法运算”,“2、减法运算”,“3、乘法运算”,“4、除法运算”和“5、退出”。请注意限制其它输入。C++ 希望各位C语言高手帮帮忙我会非常感谢大家的!vivianlove55 | 浏览1795 次 |举报 我有更好的答案推荐...

教师科研管理系统 请用C\/C++编写一系统,实现教师科研工作管理,软件的入 ...
回答:分太少,不做

用C++编写一个C程序,输入a,b,c,3个值,输出其中最大者
楼下写法是C语言,那种方法我就不用C++写了,给你一种全新的思路:include <iostream>#include <algorithm>using namespace std;int main(){ int arr[3]; for(int i = 0; i != 3; ++i) cin >> arr[i]; sort(arr, arr + 3); cout << "Max: " << arr[2] <<...

求助 急需一个c语言或c++编写界面的设计报告以及源代码
initgraph(&gdriver,&gmode,"C:\\Program Files\\WINYES\\TC201E\\BGI");setlinestyle(0,1,3);setcolor(LIGHTGRAY);circle(X,Y,RR);setlinestyle(0,1,1);for(NUM=0;NUM<12;NUM++){ setcolor(11);X_DRAW=X+R_DRAW*cos(NUM*2*PI\/12);Y_DRAW=Y+R_DRAW*sin(NUM*2*PI\/12);circle(X_...

c++如何编写一个程序
在编写C++程序时,建议使用gcc编译器。在Linux系统中,你可以使用一些可视化开发工具,如Qt、Eclipse或Codeblocks。其中,gcc编译器相对简单,适用于命令行环境,能够编译C和C++代码。第一步:打开终端,随便进入一个文件夹,用于存放你编写的程序。在终端中,输入命令"vi Hello.cpp",其中Hello.cpp是你的...

相似回答