Добавил:
Mymnan
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:АВМиС - бывшее АПЭВМ / Учебник / keyex
.htm<!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>
Соседние файлы в папке Учебник