如何在程序中设计使用鼠标

Author: 许国平 Date: 1997-01-01

  下面这个程序设计了一个简单光条菜单,用键盘或鼠标都能操作该菜单。读者可以利用这个程序介绍的方法在你的应用程序中使用鼠标。
  程序清单如下:#include "dos.h"
  #include "bios.h"
  #include "graphics.h"
  #include "io.h"
  #define M-Pressed 1
  union REGS in,out;
  struct SREGS seg;
  char menu[4][12]={"menumenu-1","menumenu-2","menumenu-3","exit"};
  int chz;
  int m-exist=0;
  unsigned mx,my;
  /*鼠标当前位置*/ 
  main() 
  { int mz,zt=1;   
  int gdrive=VGA,gmode=VGAHI;   
  initgraph(&gdrive,&gmode,"d:\tc ");   
  setfillstyle(1,BLUE);   
  bar(0,0,639,479);   
  m-exist=checkmouse();   
  initm(1); 
  while(1)   
  { initm(zt);   
  if((chz=mgetch())==M-Pressed && m-exist)     
  { delay(100); /*鼠标处理*/
  if(in-range(20,20,140,30)) zt=1;      
  if(in-range(20,40,140,50)) zt=2;      
  if(in-range(20,60,140,70)) zt=3;      
  if(in-range(20,80,140,90)) break;}   
  else{ if(chz==0x4800)
  /*键盘处理*/    
  if(zt>1) zt--;     
  else zt=4;      
  if(chz==0x5000)      
  if(zt<4) zt++;       
  else zt=1;   
  if(chz==0x000d && zt==4) break;      
  if(chz==0x001b) break;}}  /*按ESC退出*/    
  closegraph();}  /*菜单处理*/
  int initm(int par1) 
  { int i;   
  if(m-exist) hidemouse();
  setfillstyle(1,RED);   
  for(i=0;i<4;i++)    
  { bar(20,20+i*20,140,30+i*20);      
  outtextxy(20,20+i*20,menu[i]);}  
  setfillstyle(1,GREEN);  
  bar(20,20*par1,140,30+20*(par1-1));  
  outtextxy(20,20*par1,menu[par1-1]);}  
  int in-range(int mx1,int my1,int mx2,int my2)  
  { if(mx>my1 && mx<my2 &&my>mx1 && my<mx2)    
  return 1;    
  else  return 0;}
  /*鼠标模拟键盘输入函数getch()*/ 
  int mgetch() 
  { char ch; 
  while(!bioskey(1))  
  { showmouse();    
  in.x.bx=0; /*取鼠标当前位置*/
  in.x.ax=3;    
  int86(0x33,&in,&out);
  delay(30);    
  if(out.x.bx==1)     
  {mx=out.x.dx;      
  my=out.x.cx;      
  return M-Pressed;}}
  return(getchr());}        /*隐藏鼠标*/
  hidemouse()
  {in.x.ax=02; 
  int86(0x33,&in,&out);}    /*显示鼠标*/
  showmouse()
  {in.x.ax=01; 
  int86(0x33,&in,&out);}    /*检查鼠标是否存在,1-存在,0-不存在*/
  int checkmouse()
  {in.x.ax=0; 
  int86(0x33,&in,&out); 
  if(out.x.bx!=2) 
  return 0; 
  return 1; }
  int getchr()
  { int ch1,ch2;  
  ch1=getch();  
  if(ch1==0)  
  {ch2=getch();   
  ch2=ch2<<8;   
  ch2|=ch1;   
  return(ch2);}   
  else return (ch1);}