⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pop2.c

📁 水利水电工程常用ForTran程序集 水利水电工程常用ForTran程序集
💻 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 灌  区建筑物",
	"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   开  关  站",
	"4   挡  土  墙"
   };

char *guan_qu[]={
	"1   引 水 枢纽",
	"2   渠系建筑物",
	"3   排      水",
	"4   排  灌  站"
   };

char *oth_arct[]={
	"1   观 测 设备",
   };

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;
    }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -