易码技术论坛

 找回密码
 加入易码
搜索
查看: 119475|回复: 9

帮忙给个菜单代码

[复制链接]
发表于 2005-9-1 10:57:00 | 显示全部楼层
这个是我在灰度绘图器中使用的菜单

  1. 事先将所有选项保存在opItem字符串数组里面
  2. int  OptionMenu(addr opTitle,char offset,char opNum,char cho);//绘制一个选项菜单,返回-1取消选择

  3. opTitle 菜单标题
  4. offset 第一选项在opItem的位置
  5. opNum 选项数目
  6. cho 默认选项

  7. int  OptionMenu(addr opTitle,char offset,char opNum,char cho){
  8. char key;
  9. char lastMs;
  10. char lastKey;
  11. char index;
  12. index = 0;
  13. lastKey = 1;
  14. GetBlock(0,0,160,80,1,imageBuf);
  15. SetBgColor(4);
  16. Block(19,6,140,66,0);
  17. SetBgColor(0);
  18. SetFgColor(15);
  19. Rectangle(21,8,138,64,1);
  20. Line(22,23,137,23,0x42);
  21. TextOut(80-strlen(opTitle)*3,10,opTitle,5);
  22. do{
  23.   if (cho - index > 2){
  24.    index = cho - 2;
  25.   }
  26.   if (index > cho && index > 0){
  27.    index--;
  28.   }
  29.   SetBgColor(4);
  30.   Block(22,24,137,63,0);
  31.   SetBgColor(0);
  32.   SetFgColor(15);
  33.   sprintf(textBuf,"%s",opItem[index+offset]);
  34.   TextOut(23,25,textBuf,5);
  35.   sprintf(textBuf,"%s",opItem[index+1+offset]);
  36.   TextOut(23,38,textBuf,5);
  37.   if (opNum > 2 ){
  38.    sprintf(textBuf,"%s",opItem[index+2+offset]);
  39.    TextOut(23,51,textBuf,5);
  40.   }
  41.   if (index < opNum - 3){
  42.    TextOut(125,51,"↓",5);
  43.   }
  44.   if (index > 0){
  45.    TextOut(125,25,"↑",5);
  46.   }
  47.   Refresh();
  48.   Box(22,24+(cho-index)*13,125,37+(cho-index)*13,1,2);
  49.   if (lastKey ==1){
  50.    getchar();
  51.    lastKey = 0;
  52.   }
  53.   ReleaseKey(128);
  54.   do{
  55.    key = getchar();
  56.   }while(key != KEY_UP &&
  57.       key != KEY_DOWN &&
  58.       key != KEY_ESC &&
  59.       key != KEY_ENTER)
  60.   lastMs = Getms();
  61.   if (key == KEY_DOWN && cho < opNum - 1){
  62.     cho++;
  63.   }
  64.   if (key == KEY_UP && cho > 0){
  65.     cho--;
  66.   }
  67.   if (key == KEY_ENTER){
  68.    WriteBlock(0,0,160,80,1,imageBuf);
  69.    Refresh();
  70.    SetFgColor(fgColor);
  71.    SetBgColor(bgColor);
  72.    return cho;
  73.   }
  74.   while (((Getms()-lastMs)&0xff)<256/10);
  75. }while(key != KEY_ESC);
  76. WriteBlock(0,0,160,80,1,imageBuf);
  77. Refresh();
  78. SetFgColor(fgColor);
  79. SetBgColor(bgColor);
  80. return -1;
  81. }
复制代码
 楼主| 发表于 2005-9-1 19:28:00 | 显示全部楼层
我的那个问题解决了,谢谢!

还有,在我编的菜单里,我除了按上,下,左,右,确认外,一按其他的键就退出,怎么回事哦???
发表于 2005-9-1 19:38:00 | 显示全部楼层
楼上把你的代码贴出来吧,要不然我们不能分析问题的原因
发表于 2005-9-2 21:16:00 | 显示全部楼层
我曾经些的菜单函数:
http://www.walkpad.com.cn/wqx/forum/showthread.php?s=&threadid=39043&highlight=%B2%CB%B5%A5%BA%AF%CA%FD
发表于 2005-9-3 11:35:00 | 显示全部楼层
#define esc 27
#define up_key  20
#define down_key 21
#define enter_key 13
#define left_key 23
#define righy_key 22
char key;
int x=1,y=1;

void select()
{   
ClearScreen();
SetScreen(0);

while (1)
{
Refresh();
Box(x*25-22,y*24-23,x*25+2,y*24,1,2);
key=getchar();
Box(x*25-22,y*24-23,x*25+2,y*24,1,2);  
  if (key==up_key) y--;      
  if (key==down_key) y++;
  if (key==left_key) x--;
  if (key==righy_key) x++;
  if (x<1) x=6;
  if (x>6) x=1;
  if (y<1) y=2;
  if (y>2) y=1;
if (key==enter_key) return;
if (key==esc) exit(0);

   Box(x*25-22,y*24-23,x*25+2,y*24,1,2);

}
}
void main()
{
select();
if (x==1&&y==1) {     }   //子程序1
if (x==1&&y==2) {     }  //子程序2
...........
if (x==2&&y==1) {     }  //子程序n
if (x==2&&y==2) {     }  //子程序n+1
...........
}


这段代码够朴素简洁吧,是我在 爱的精灵里面用的
 楼主| 发表于 2005-9-4 16:35:00 | 显示全部楼层
int s;
void caidan()
{ ClearScreen();
TextOut(3,9,"进入软件",0x81);
  TextOut(3,32,"制作人员",0x81);
TextOut(3,55,"退出软件",0x81);
Refresh(); }   
void xuan(int x)  
{  if(x==1) {s=1;   
ClearScreen();     
caidan();         
Block(2,8,66,24,2);
Refresh();}        
  if(x==2) {
s=2;   
  ClearScreen();   
   caidan();      
   Block(2,31,66,48,2);
Refresh();}         
     if(x==3)      
     {s=3;  
   ClearScreen();   
caidan();     
      Block(2,54,66,70,2);
     Refresh();      }}  
             void key(){  
  char a;   
a=getchar();     
     if(s==1&&a==21)  
  { xuan(2);a=0;  key();}  
       if(s==2&&a==21){xuan(3);a=0;key();}
  if(s==3&&a==21){xuan(1);a=0;key();}
   if(s==1&&a==20){xuan(3);a=0;key();}
  if(s==2&&a==20){xuan(1);a=0;key();}  
if(s==3&&a==20){xuan(2);a=0;key();}  
if(s==2&&a==27){exit(0);}   
           if(s==2&&a==13){
ClearScreen();   
   TextOut(0,0,"chenyanyi独自制作",1);  
TextOut(0,13,"e-mail:",1);
TextOut(0,26,"chenyanyi1989@yahoo.com.cn",1);
TextOut(0,40,"欢迎光临〖仙剑RPG〗",1);
TextOut(0,55,"我们欢迎你!",1);
  Refresh();a=0;key();}                     }         
void main() {xuan(1);    key();    }
 楼主| 发表于 2005-9-17 09:33:00 | 显示全部楼层
我的代码也很简洁,不是简洁主要是简单!但是谁能给个原因,为什么按别的键就退出????
发表于 2005-9-22 14:36:00 | 显示全部楼层
在void main()上上面的一行加上key=0;xuan(1);key();就可以了
 楼主| 发表于 2005-9-30 14:19:00 | 显示全部楼层
NONONO,应该弄成循环!
 楼主| 发表于 2005-9-1 10:00:33 | 显示全部楼层 |阅读模式
我写了一个选菜单的代码,但写出的代码特长,而且我不知道怎么确认选中的菜单项,麻烦给个代码!
您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2025-8-24 06:26 , Processed in 0.009068 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表