Programming 版 (精华区)

发信人: Scorpion (你想过吗?), 信区: Programming
标  题: menu.c
发信站: 哈工大紫丁香 (2002年10月18日14:53:36 星期五), 站内信件

#include "bios.h"
#include "dos.h"
#include "view.c"
#define UP     0x48
#define DOWN   0x50
#define RIGHT  0x4d
#define LEFT   0x4b
#define ESC    27
#define ENTER  13
#define KEY union key
union key
{
 int key;
 char ch[2];
};
#define MENU struct menu
struct menu
{
 VIEW view;
 int  xnum;
 int  ynum;
 char **items;
 int  curx;
 int  cury;
 int  itemlen;
};
void cursor(int i,int j)
{
 union REGS in;
 in.h.ah=1;
 in.h.ch=i;
 in.h.cl=j;
 int86(0x10,&in,&in);
}
void hidecursor()
{
 cursor(1,0);
 return;
}
void showcursor()
{
 cursor(6,7);
 return;
}
void Menu_init(MENU *menu,int x,int y,int xnum,int ynum,
           char **items,int backcolor,int textcolor,int border)
{
 int len,width,height;
 int i,num=xnum*ynum;
 menu->itemlen=0;
 for(i=0;i<num;i++)
 {
  len=strlen(items[i]);
    if(menu->itemlen<len)
       menu->itemlen=len;
 }
 menu->itemlen+=2;
 if(border==NOBORDER)
 {
  width=xnum*menu->itemlen;
  height=ynum;
 }
 else
  {
   width=xnum*menu->itemlen+2;
   height=ynum+2;
  }
 View_init(&menu->view,x,y,width,height,backcolor,textcolor,border);
 menu->xnum=xnum;
 menu->ynum=ynum;
 menu->items=items;
 menu->curx=0;
 menu->cury=0;
}
void Menu_showcuritem(MENU *menu,int anti)
{
 View_putstring(&menu->view,menu->curx*menu->itemlen+1,menu->cury,
                menu->items[menu->cury*menu->xnum+menu->curx],anti);
}
int Menu_open(MENU *menu)
{
 int i,j;
 if(menu->view.status==OPEN)
   return 1;
 if(!View_open(&menu->view))
   return 0;
 for(j=0;j<menu->ynum;j++)
   {
        for(i=0;i<menu->xnum;i++)
          {
           View_putstring(&menu->view,i*menu->itemlen+1,j,
                          menu->items[j*menu->xnum+i],NORMAL);
          }
   }
 Menu_showcuritem(menu,ANTI);
 return 1;
}
void Menu_close(MENU *menu)
{
 View_close(&menu->view);
}
int Menu_drive(MENU *menu)
{
 KEY key;
 if(menu->view.status==CLOSE)
   {
    Menu_open(menu);
   }
 while(1)
   {
    key.key=bioskey(0);
    if(key.ch[0])
     {
      if(key.ch[0]==ESC)
        return -1;
      if(key.ch[0]==ENTER)
        return menu->cury*menu->xnum+menu->curx;
     }
     else
       {
        Menu_showcuritem(menu,NORMAL);
        switch(key.ch[1])
          {
           case UP:
             menu->cury=menu->cury<=0? menu->ynum-1:menu->cury-1;
             break;
           case DOWN:
             menu->cury=(menu->cury>=menu->ynum-1)? 0:menu->cury+1;
             break;
           case LEFT:
             menu->curx=menu->curx<=0? menu->xnum-1:menu->curx-1;
             break;
           case RIGHT:
             menu->curx=(menu->curx>=menu->xnum-1)? 0:menu->curx+1;
             break;
          }
             Menu_showcuritem(menu,ANTI);
     }
   }
}
--

※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 天外飞仙]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.356毫秒