Скачиваний:
27
Добавлен:
15.09.2014
Размер:
13.81 Кб
Скачать
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head> 
<title> КЛАВИАТУРА </title>
<META content="text/html; charset=windows-1251" http-equiv=Content-Type>
<META content="Demon" name=Author>
<BASE TARGET="main">
</head>


<body bgcolor="#50BECD" link="#0000fc" vlink="#ffff00" text="#000000">


<p>
<h1 align="center">
<a name="пример"><strong>Примеры программ
</a>
</h1>
<P>
<P>
<h3 ALIGN="CENTER"> Полный  листинг  проeкта, выводящего на экран скан-коды клавиш.</h3>
<p ALIGN="JUSTIFY">
<strong>
После запуска программа переходит в графический режим и 
рисует на экране изображение клавиатуры, после чего пользователь,
нажав клавишу на клавиатуре или кликнув левой кнопкой мыши на соответствующем
изображении на экране, видит скан-код нажатой клавиши.
</strong>

<div align="center">
<form>
<textarea name=Proga rows=22 cols=72>

		ФАЙЛ KEY.CPP
#include<stdio.h>
#include<conio.h>
#include<graphics.h>
#include<stdlib.h>
#include<dos.h>
#include<dir.h>
#include"Key.h"
#include"keys.h"
status s;

// Конструктор класса Key
Key::Key(int x1, int y1, key_str *st_uk)
{
  k=30;
  x = x1;
  y = y1;
  scan = st_uk->scn;
  ascii1 = st_uk->asc1;
  ascii2 = st_uk->asc2;
  string1 = st_uk->st1;
}

// Создает на экране изображение стандартной клавиши
void Key::on_draw( void )
{
	char ch[2];
	ch[1] = NULL;
	setcolor(2);
	arc(x+3, y+3, 90, 180, 3 );
	arc(x+k-3, y+3, 0, 90, 3 );
	arc(x+3, y+27, 180, 270, 3 );
	arc(x+k-3, y+27, 270, 0, 3 );
	line(x+3,y,x+k-3,y);
	line(x+3,y+30,x+k-3,y+30);
	line(x,y+3,x,y+27);
	line(x+k,y+3,x+k,y+27);
	setcolor(7);
	arc(x+6, y+6, 90, 180, 3 );
	arc(x+k-6, y+6, 0, 90, 3 );
	arc(x+6, y+24, 180, 270, 3 );
	arc(x+k-6, y+24, 270, 0, 3 );
	line(x+6,y+3,x+k-6,y+3);
	line(x+6,y+27,x+k-6,y+27);
	line(x+3,y+6,x+3,y+24);
	line(x+k-3,y+6,x+k-3,y+24);
	setcolor(15);
	if ( string1 == NULL )
	{
	 ch[0] = (char)ascii1;
	 outtextxy(x+6,y+6,&ch[0]);
	 ch[0] = (char)ascii2;
	 outtextxy(x+17,y+18,&ch[0]);
	}
	else
	{
	 outtextxy(x+6,y+6,string1);
	}
};

// Проверка "нажатия" на клавишу указателем мыши
int Key::on_button(int xm, int ym)
{
 if( xm>=x && xm<=x+k && ym>=y && ym<= y+30)
 {
    s.str1 = string1;
    s.scan = scan;
    s.ascii1 = ascii1;
    s.ascii2 = ascii2;
    return 1;
 }
    return 0;
};

// обработка кода нажатой клавиши клавиатуры
int Key::on_key(int key_sc)
{

 if( scan == key_sc)
{
  s.str1 = string1;
  s.scan = scan;
  s.ascii1 = ascii1;
  s.ascii2 = ascii2;
  return 1;
  }
  return 0;
}

// создает на экране изображение клавиши Enter
void Key2::on_draw()
{
	setcolor(2);
	arc(x+3, y+3, 90, 180, 3 );
	arc(x+42, y+3, 0, 90, 3 );
	arc(x-22, y+62, 180, 270, 3 );
	arc(x+42, y+62, 270, 0, 3 );
	arc(x-22, y+38, 90, 180, 3 );
	arc(x-3, y+32, 270, 0, 3 );
	line(x+3,y,x+42,y);
	line(x-22,y+65,x+42,y+65);
	line(x,y+3,x,y+32);
	line(x+45,y+3,x+45,y+62);
	line(x-22,y+35,x-3,y+35);
	line(x-25,y+37,x-25,y+62);
	setcolor(7);

	arc(x+6, y+6, 90, 180, 3 );
	arc(x+39, y+6, 0, 90, 3 );
	arc(x-19, y+59, 180, 270, 3 );
	arc(x+39, y+59, 270, 0, 3 );
	arc(x-19, y+41, 90, 180, 3 );
	arc(x, y+35, 270, 0, 3 );
	line(x+6,y+3,x+39,y+3);
	line(x-19,y+62,x+39,y+62);
	line(x+3,y+6,x+3,y+35);
	line(x+42,y+6,x+42,y+59);
	line(x-19,y+38,x,y+38);
	line(x-22,y+40,x-22,y+59);

	setcolor(15);
	outtextxy(x-8,y+45,string1);

};

// обработка нажатия кнопки мыши
int Key2::on_button(int xm, int ym)
{
 if(( xm>=x && xm<=x+45 && ym>=y && ym<= y+65 ) ||
    ( xm>=x-25 && xm<=x && ym<=y+65 && ym>=y+35 ) )
 {
    s.str1 = string1;
    s.scan = scan;
    s.ascii1 = ascii1;
    s.ascii2 = ascii2;
    return 1;
 }
    return 0;
};


// Основная часть программы
void main( void )
{

  void draw_str(void);
  void key_fllush(void);
  unsigned int input_key( void );
  Mouse mou;
  char s[256];
  int gd=DETECT,gm, l,lkk,errorcode;
  printf("Введите полный путь к файлу Egavga.bgi :> ");
  scanf("%s",s);
  initgraph(&gd,&gm,s);
      errorcode = graphresult();

    if (errorcode != grOk)//если ошибка
    {
       printf("Graphics error: %s\n", grapherrormsg(errorcode));
       printf("Press any key to halt:");
       getch();
       return;             //выход из программы
    }

  Key *mas_kl[70];

  // создаем на экране изображение клавиатуры
  setcolor(11);
  rectangle(1,1,639,479);
  rectangle(30,15,610,255);

  setcolor(1);
  rectangle(30,285,610,360);

  mas_kl[69] = new Key1(300,440,60,&mask[69]);
  mas_kl[69]->on_draw();

  mas_kl[0] = new Key1(kl_x,kl_y,35,&mask[0]);
  mas_kl[0]->on_draw();

  for(int h=1,kx=0; h<11; h++,kx+=40)   //1
  {
  mas_kl[h] = new Key1(kl_x+80+kx,kl_y,35,&mask[h]);
  mas_kl[h]->on_draw();
  if(h==5) kx+=40;
  }

  for(kx=0;h<24;h++,kx+=35)
  {
   mas_kl[h] = new Key(kl_x+kx,kl_y+40,&mask[h]);
   mas_kl[h]->on_draw();
  }
  mas_kl[h] = new Key1(kl_x+455,kl_y+40,60,&mask[h]); //backspce
  mas_kl[h]->on_draw();                      //2


  mas_kl[++h] = new Key1(kl_x,kl_y+75,45,&mask[h]); //tab
  mas_kl[h++]->on_draw();

  for(kx=0;h<38;h++,kx+=35)
  {
   mas_kl[h] = new Key(kl_x+50+kx,kl_y+75,&mask[h]);
   mas_kl[h]->on_draw();
  }
  mas_kl[h] = new Key2(kl_x+50+kx,kl_y+75,&mask[h]);   //enter
  mas_kl[h++]->on_draw();			//3



  mas_kl[h] = new Key1(kl_x,kl_y+110,55,&mask[h]); // capslock
  mas_kl[h++]->on_draw();

  for(kx=0;h<51;h++,kx+=35)
  {
   mas_kl[h] = new Key(kl_x+60+kx,kl_y+110,&mask[h]);
   mas_kl[h]->on_draw();
  }						//4

  mas_kl[h] = new Key1(kl_x,kl_y+145,75,&mask[h]); // shift
  mas_kl[h++]->on_draw();

  for(kx=0;h<62;h++,kx+=35)
  {
   mas_kl[h] = new Key(kl_x+80+kx,kl_y+145,&mask[h]);
   mas_kl[h]->on_draw();
  }

  mas_kl[h] = new Key1(kl_x+80+kx,kl_y+145,50,&mask[h]); //shift2
  mas_kl[h++]->on_draw();

  mas_kl[h] = new Key(kl_x+485,kl_y+145,&mask[h]); //     |
  mas_kl[h++]->on_draw();                //5

  mas_kl[h] = new Key1(kl_x,kl_y+180,40,&mask[h]); //   ctrl
  mas_kl[h++]->on_draw();
  mas_kl[h] = new Key1(kl_x+45,kl_y+180,40,&mask[h]); //   alt
  mas_kl[h++]->on_draw();
  mas_kl[h] = new Key1(kl_x+90,kl_y+180,335,&mask[h]); //   spase
  mas_kl[h++]->on_draw();
  mas_kl[h] = new Key1(kl_x+430,kl_y+180,40,&mask[h]); //    alt2
  mas_kl[h++]->on_draw();

  mas_kl[h] = new Key1(kl_x+475,kl_y+180,40,&mask[h]); //    ctrl2
  mas_kl[h]->on_draw();

  // инициализация мыши
  mou.Mouse_Init(1,640,1,480);
  key_fllush();

  // обрабатываем нажатия кнопок миши и клавиатуры
  do{
       if ( mou.Mouse_Input()!=0)
       {
	for( l=0; l<69 ; l++)
	{
	 if(mas_kl[l]->on_button(mou.mouse_x,mou.mouse_y)==1)
	 {
	  draw_str();
	  l=69;
	 }
	}
       }
       else
       {
	 if ( (lkk=input_key())!=0 )
	  {
	   for( l=1; l<69 ; l++)
	   {
	    if(mas_kl[l]->on_key(lkk)==1)
	    {
		draw_str();
		l=69;
	    }
	   }
	 }
       }
    }
while(mas_kl[69]->on_button(mou.mouse_x,mou.mouse_y)==0 && lkk!=0x01);
  closegraph();
  return ;
}
// Выводим ASCII и SCAN коды клавиш
void draw_str(void)
{
	int xx=200,yy=300;
	char *int_char;
	char mat[4];
	mat[1]=NULL;
	int_char=&mat[0];

	setfillstyle(0,0);
	bar(xx,yy,xx+200,yy+50);

	setcolor(10);
	itoa(s.scan,int_char,16);
	outtextxy(xx,yy,"Scan kode -    0x");
	outtextxy(xx+140,yy,int_char);
	setcolor(12);
	outtextxy(xx,yy+30,"Simbol 1 -");
	outtextxy(xx,yy+40,"Simbol 2 -");
	setcolor(11);
	outtextxy(xx,yy+10,"Ascii kode 1 - 0x");
	outtextxy(xx,yy+20,"Ascii kode 2 - 0x");


	if(s.ascii1!=0)
	{
	 itoa(s.ascii1,int_char,16);
	 outtextxy(xx+140,yy+10, int_char);
	 setcolor(12);
	 mat[0] = (int)s.ascii1;
	 mat[1]=NULL;
	 outtextxy(xx+140,yy+30,&mat[0]);
	}

	if(s.ascii2!=0)
	{
	 itoa(s.ascii2,int_char,16);
	 outtextxy(xx+140,yy+20, int_char);
	 setcolor(12);
	 mat[0] = (int)s.ascii2;
	 mat[1]=NULL;
	 outtextxy(xx+140,yy+40,&mat[0]);
	}

}

void key_fllush(void)
{
	_AX = 0x0c00;
	geninterrupt(0x21);
}

// функция опроса клавиатуры
unsigned int input_key( void )
{
	int kl=0;
	asm{
		mov ah,11h
		int 16h
		jz mt1
		mov ah,10h
		int 16h
		mov al,ah
		xor ah,ah
		mov kl,ax
	}
  mt1:
	return kl;
}

////////////////////////////////////////////////////////////	
		ФАЙЛ KEYS.CPP

#include<stdio.h>

struct key_str { int asc, scn; char *nm1, *nm2, *st1, *st2; };
key_str mas[50]={ { 10,20,"`","~",NULL,NULL },
		   { 20,20,"1","!",NULL,NULL },
		   { 20,20,"2","@",NULL,NULL },
		   { 20,20,"3","#",NULL,NULL },
		   { 20,20,"4","$",NULL,NULL },
		   { 20,20,"5","%",NULL,NULL },
		   { 20,20,"6","^",NULL,NULL },
		   { 20,20,"7","&",NULL,NULL },
		   { 20,20,"8","*",NULL,NULL },
		   { 20,20,"9","(",NULL,NULL },
		   { 20,20,"0",")",NULL,NULL },
		   { 20,20,"-","_",NULL,NULL },
		   { 20,20,"=","+",NULL,NULL },
		   { 20,20,"Backspase",NULL,NULL,NULL },
		   { 20,20,"Tab",NULL,NULL,NULL },
		   { 20,20,"q","Q",NULL,NULL },
		   { 20,20,"w","W",NULL,NULL },
		   { 20,20,"e","E",NULL,NULL },
		   { 20,20,"r","R",NULL,NULL },
		   { 20,20,"t","T",NULL,NULL },
		   { 20,20,"y","Y",NULL,NULL },
		   { 20,20,"u","U",NULL,NULL },
		   { 20,20,"i","I",NULL,NULL },
		   { 20,20,"o","O",NULL,NULL },
		   { 20,20,"p","P",NULL,NULL },
		   { 20,20,"[","{",NULL,NULL },
		   { 20,20,"]","}",NULL,NULL }
		};


////////////////////////////////////////////////////
		ФАЙЛ MOUSE.CPP
#include<dos.h>
#include"key.h"

void Mouse::Mouse_Init( int x_min , int x_max , int y_min , int y_max )
{
   _AX = 0x00 ;
  geninterrupt( 0x33 ) ;

  _AX = 0x01 ;
  geninterrupt( 0x33 ) ;

  i = 0 ;

  _AX = 0x07 ;
  _CX = x_min ;
  _DX = x_max ;
  geninterrupt( 0x33 ) ;

  _AX = 0x08 ;
  _CX = y_min ;
  _DX = y_max ;
  geninterrupt( 0x33 ) ;

};

unsigned int Mouse::Mouse_Input( void )
{
 int ii , m_x , m_y , b_x ;
 ii = i ;
 asm{
    mov ax,03h
    int 33h
    mov ax,ii
    mov ii,bx
    and bx,01
    not ax
    and ax,1
    and bx,ax
    mov b_x,bx
    mov m_x,cx
    mov m_y,dx
  }
    i = ii ;
    mouse_x = m_x * b_x ; mouse_y = m_y * b_x ;
    return b_x ;
};
//////////////////////////////////////////////////

		ФАЙЛ KEY.H
#include<stdio.h>
#define kl_x 60
#define kl_y 30

struct status
	{
	  char *str1 ; int scan, ascii1 , ascii2 ;
	};

struct key_str { unsigned int scn, asc1 , asc2 ; char *st1; };

class Key
{
 protected:
 unsigned int scan,ascii1, ascii2;
 public:
 char *string1;
 int x,y,k;
 Key(int , int , key_str * );
 virtual void on_draw( );
 virtual int on_button( int , int );
 virtual int on_key( int );
};

class Key1: public Key
{
 public:
 Key1(int a, int b, int dl, key_str *yk ):Key(a , b , yk)
	  {
		k=dl;
	  };
};

class Key2: public Key
{
 public:
 Key2(int a, int b, key_str *yk ):Key(a , b , yk)
	  {
	  };
 void on_draw( );
 int on_button( int , int );
};

class Mouse
{
  int i;
public:
  int mouse_x , mouse_y ;
public:
  Mouse( void ){};
  void Mouse_Init( int x_min , int x_max , int y_min , int y_max );
  ~Mouse(){};
  unsigned int Mouse_Input( void );
};
///////////////////////////////////////////////////
		ФАЙЛ KEYS.H
// масив клавиш
key_str mask[70]=  {
		   { 0x01, 0x1b, 0,"Esc" },
		   { 0x3b, 0,    0,"F1" },
		   { 0x3c, 0,    0,"F2" },
		   { 0x3d, 0,    0,"F3" },
		   { 0x3e, 0,    0,"F4" },
		   { 0x3f, 0,    0,"F5" },
		   { 0x40, 0,    0,"F6" },
		   { 0x41, 0,    0,"F7" },
		   { 0x42, 0,    0,"F8" },
		   { 0x43, 0,    0,"F9" },
		   { 0x44, 0,    0,"F10" }, //1
		   { 0x29, 0x60, 0x7e, NULL },//0x29
		   { 0x02, 0x31, 0x21, NULL },
		   { 0x03, 0x32, 0x40, NULL },
		   { 0x04, 0x33, 0x23, NULL },
		   { 0x05, 0x34, 0x24, NULL },
		   { 0x06, 0x35, 0x25, NULL },
		   { 0x07, 0x36, 0x5e, NULL },
		   { 0x08, 0x37, 0x26, NULL },
		   { 0x09, 0x38, 0x2a, NULL },
		   { 0x0a, 0x39, 0x28, NULL },
		   { 0x0b, 0x30, 0x29, NULL },
		   { 0x0c, 0x2d, 0x5f, NULL },
		   { 0x0d, 0x3d, 0x2b, NULL },
		   { 0x0e, 0,    0,    " Bksp" }, //2
		   { 0x0f, 0,    0,    "Tab" },
		   { 0x10, 0x71, 0x51, NULL },
		   { 0x11, 0x77, 0x57, NULL },
		   { 0x12, 0x65, 0x45, NULL },
		   { 0x13, 0x72, 0x52, NULL },
		   { 0x14, 0x74, 0x54, NULL },
		   { 0x15, 0x79, 0x59, NULL },
		   { 0x16, 0x75, 0x55, NULL },
		   { 0x17, 0x69, 0x49, NULL },
		   { 0x18, 0x6f, 0x4f, NULL },
		   { 0x19, 0x70, 0x50, NULL },
		   { 0x1a, 0x7b, 0x5b, NULL },
		   { 0x1b, 0x7d, 0x5d, NULL },
		   { 0x1c, 13,   0,    "Enter" }, //3
		   { 0x39,  0,   0,    "CapsL" },
		   { 0x1e, 0x61, 0x41, NULL },
		   { 0x1f, 0x73, 0x53, NULL },
		   { 0x20, 0x64, 0x44, NULL },
		   { 0x21, 0x66, 0x46, NULL },
		   { 0x22, 0x67, 0x47, NULL },
		   { 0x23, 0x68, 0x48, NULL },
		   { 0x24, 0x6a, 0x4a, NULL },
		   { 0x25, 0x6b, 0x4b, NULL },
		   { 0x26, 0x6c, 0x4c, NULL },
		   { 0x27, 0x3b, 0x3a, NULL },
		   { 0x28, 0x27, 0x22, NULL }, //4 "
		   { 0x2a, 0,    0,   "Shift" },
		   { 0x2c, 0x7a, 0x5a, NULL },
		   { 0x2d, 0x78, 0x58, NULL },
		   { 0x2e, 0x63, 0x43, NULL },
		   { 0x2f, 0x76, 0x56, NULL },
		   { 0x30, 0x62, 0x42, NULL },
		   { 0x31, 0x6e, 0x4e, NULL },
		   { 0x32, 0x6d, 0x4d, NULL },
		   { 0x33, 0x2c, 0x3c, NULL },
		   { 0x34, 0x2e, 0x3e, NULL },
		   { 0x35, 0x2f, 0x3f, NULL },
		   { 0x36, 0,    0,   "Shift" },
		   { 0x2b, 0x5c,0x7c, NULL }, //5
		   { 0x1d, 0,0,"Ctrl" },
		   { 0x38, 0,0,"Alt" },
		   { 0x39, 0x20,0,NULL },
		   { 0x38, 0,0,"Alt" },
		   { 0x1d, 0,0,"Ctrl" }, //6
		   { 0,    0,0," Quit " }
		};

</TEXTAREA>
</FORM>
<form action="key1.exe">
     <input type=submit name=SubButton value="запустить">
</form>
</div>
</body>
</html>
Соседние файлы в папке Учебник