?? pop2.c
字號:
#include "stdio.h"
#include "dos.h"
#include "stdlib.h"
/* #include "alloc.h"
#include "bios.h" */
#define BORDER 1
#define ESC 27
#define REV_VID 0X70
#define NORM_VID 7
void save_video(),restore_video();
void goto_xy(),cls(),write_string(),write_char();
void display_menu(),draw_border();
char far *vid_mem;
char *mainmenu[]={
"0 退 出",
"1 擋 水建筑物",
"2 泄 水建筑物",
"3 引 水建筑物",
"4 過 壩建筑物",
"5 水電站建筑物",
"6 灌 區(qū)建筑物",
"7 其 它建筑物",
"8 其 它"
};
char *dng_shui[]={
"1 土 石 壩",
"2 重 力 壩",
"3 拱 壩",
"4 其 它 壩型"
};
char *xie_shui[]={
"1 水 閘",
"2 溢 流 壩",
"3 其 它"
};
char *guo_ba[]={
"1 升 船 機",
"2 船 閘"
};
char *yin_shui[]={
"1 渠 道",
"2 隧 洞",
"3 壓 力 管道",
"4 其 它"
};
char *pwr_stat[]={
"1 進 水 口",
"2 廠 房",
"3 開 關(guān) 站",
"4 擋 土 墻"
};
char *guan_qu[]={
"1 引 水 樞紐",
"2 渠系建筑物",
"3 排 水",
"4 排 灌 站"
};
char *oth_arct[]={
"1 觀 測 設(shè)備",
};
char *other[]={
"1 課 間 音 樂",
"2 疑 問 解 答",
"3 "
};
main()
{
int i;
cls();
goto_xy(0,0);
popup(mainmenu,"012345678",9,1, 3,BORDER);
popup(dng_shui, "1234",4,5,10,BORDER);
popup(xie_shui,"123",3,10,18,BORDER);
}
int popup(menu,keys,count,x,y,border)
char *menu[];
char *keys;
int count;
int x,y;
int border;
{
register int i,len;
int endx,endy,choice,vmode;
unsigned char *p;
if((x>24)||(x<0)||(y>79)||(y<0))
{ printf("range error");
return -2;
}
vmode=video_mode();
if((vmode!=2)&&(vmode!=3)&&(vmode!=7))
{ printf("video must be 80 column test mode");
exit(1);
}
if(vmode==7) vid_mem=(char far *)0xb0000000;
else vid_mem=(char far *)0xb8000000;
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("menu won't fit");
return -2;
}
p=(unsigned char *)malloc(2*(endx-x+1)*(endy-y+1));
if(!p) exit(1);
save_video(x,endx+1,y,endy+1,p);
if(border) draw_border(x,y,endx,endy);
display_menu(menu,x+1,y+1,count);
choice=get_resp(x+1,y,count,menu,keys);
restore_video(x,endx+1,y,endy+1,p);
free(p);
return choice;
}
void display_menu(menu,x,y,count)
char *menu[];
int x,y,count;
{
register int i;
for(i=0;i<count;i++,x++)
{ write_string(x,y,menu[i],NORM_VID);
}
}
void draw_border(startx,starty,endx,endy)
int startx,starty,endx,endy;
{
register int i;
char far *v,far *t;
v=vid_mem;
t=v;
for(i=startx+1;i<endx;i++)
{ v+=(i*160)+starty*2;
*v++=179;
*v=NORM_VID;
v=t;
v+=(i*160)+endy*2;
*v++=179;
*v=NORM_VID;
v=t;
}
for(i=starty+1;i<endy;i++)
{ v+=(startx*160)+i*2;
*v++=196;
*v=NORM_VID;
v=t;
v+=(endx*160)+i*2;
*v++=196;
*v=NORM_VID;
v=t;
}
write_char(startx,starty,218,NORM_VID);
write_char(startx,endy,191,NORM_VID);
write_char(endx,starty,192,NORM_VID);
write_char(endx,endy,217,NORM_VID);
}
get_resp(x,y,count,menu,keys)
int x,y,count;
char *menu[];
char *keys;
{
union inkey
{ char ch[2];
int i;
} c;
int arrow_choice=0,key_choice;
y++;
goto_xy(x,y);
write_string(x,y,menu[0],REV_VID);
for(;;) {
while(!bioskey(1));
c.i=bioskey(0);
goto_xy(x+arrow_choice,y);
write_string(x+arrow_choice,y,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);
write_string(x+arrow_choice,y,menu[arrow_choice],REV_VID);
}
}
void write_string(x,y,p,attrib)
int x,y;
char *p;
int attrib;
{
register int i;
char far *v;
v=vid_mem;
v+=(x*160)+y*2;
for(i=y;*p;i++)
{ *v++=*p++;
*v++=attrib;
}
}
void write_char(x,y,ch,attrib)
int x,y;
char ch;
int attrib;
{
register int i;
char far *v;
v=vid_mem;
v+=(x*160)+y*2;
*v++=ch;
*v=attrib;
}
void save_video(startx,endx,starty,endy,buf_ptr)
int startx,starty,endx,endy;
unsigned char *buf_ptr;
{
register int i,j;
char far *v,far *t;
v=vid_mem;
for(i=starty;i<endy;i++)
for(j=startx;j<endx;j++)
{ t=v+(j*160)+i*2;
*buf_ptr++=*t++;
*buf_ptr++=*t;
* (t-1)=' ';
}
}
void restore_video(startx,endx,starty,endy,buf_ptr)
int startx,starty,endx,endy;
unsigned char *buf_ptr;
{
register int i,j;
char far *v,far *t;
v=vid_mem;
t=v;
for(i=starty;i<endy;i++)
for(j=startx;j<endx;j++)
{ v=t;
v+=(j*160)+i*2;
*v++=*buf_ptr++;
*v=*buf_ptr++;
}
}
void cls()
{
union REGS r;
r.h.ah=6;
r.h.al=0;
r.h.ch=0;
r.h.cl=0;
r.h.dh=24;
r.h.dl=79;
r.h.bh=7;
int86(0x10,&r,&r);
}
void goto_xy(x,y)
int x,y;
{
union REGS r;
r.h.ah=2;
r.h.dl=y;
r.h.dh=x;
r.h.bh=0;
int86(0x10,&r,&r);
}
video_mode()
{
union REGS r;
r.h.ah=15;
return int86(0x10,&r,&r) &255;
}
is_in(s,c)
char *s,c;
{
register int i;
for(i=0;*s;i++) if(* s++==c) return i+1;
return 0;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -