Лабораторная работа №7
Перегрузка функций
Цель работы: Изучить принципы перегрузки функций
Задание: Написать объектно-ориентированную программу, перемещающую на экране любое графическое изображение при помощи манипулятора мышь, задействовать хотя бы одну кнопку мыши, применив перегрузку конструкторов.
Листинг программы:
#include <process.h>
#include <stdio.h>
#include <graphics.h>
#include <dos.h>
#include <conio.h>
#include <bios.h>
#include <iostream.h>
class gfx {
public:
void window (int,int,int,int,char *,int,int);
void c(void);
gfx (void);
gfx (int);
gfx (char *);
} g1;
#define c_on(); _AX=1; geninterrupt (0x33);
#define c_off(); _AX=2; geninterrupt (0x33);
#define b ms_current.btn
#define x ms_current.h
#define y ms_current.v
class mice {
public:
void c_lim (int,int,int,int);
void c_set (int,int);
void c_sense (int,int);
void c_state (void);
void is_mouse (void);
void click_but (int,int);
} m1;
int take=0,yy1,yy2,n;
char *str;
struct ms_state {char btn;int h;int v;} ms_current;
void main (void)
{
int ch;
int i1=190,i2=70,i3=290,i4=190;
cout<<"введите режим работы 1-ничего 2-int 3-char ";
cin>>n;
switch (n)
{case 1: g1=gfx(); break;
case 2: g1=gfx(1); break;
case 3: {
cout<<"введите заголовок ";
cin>> str;
g1=gfx(str); break;
}
}
g1.window (i1,i2,i3,i4,"Example",BLACK,0);
do
{
take=0;
m1.c_state();
switch (b)
{
case 0x01:
{
m1.click_but (i1+3,i2+3);
if (take)
{c_off();
while (b==0x01)
{
m1.c_state();
i1=x-50; i2=y-8;
if (i1<10) i1=10;
if (i2<20) i2=20;
i3=i1+100;i4=i2+120;
if (i3>630) i3=630;
if (i4>450) i4=450;
i1=i3-100; i2=i4-120;
clearviewport();
g1.window (i1,i2,i3,i4,"Example",BLACK,1);
delay(30);
}
g1.window (i1,i2,i3,i4,"Example",BLACK,0);
c_on();
}; break;}
case 0x02:
{
m1.click_but (i1+3,i2+3);
if (take)
{c_off();
while (b==0x02)
{
m1.c_state();
clearviewport();
yy1=i2;yy2=i4;
g1.c();
i2=yy1;i4=yy2;
g1.window (i1,i2,i3,i4,"Example",BLACK,0);
delay(20);
}
c_on();
break;
}
}}
}while (!bioskey(1));
}
void gfx::window (int x1,int y1,int x2,int y2,char *tittle,int color,int ramka)
{
setviewport (x1,y1,x2,y2,1);
setcolor (WHITE);
line (0,0,0,y2-y1);
line (0,0,x2-x1,0);
line (x2-x1-2,y2-y1-2,x2-x1-2,2);
line (x2-x1-2,y2-y1-2,2,y2-y1-2);
if (!ramka){
rectangle (2,3,x2-x1-2,14);
setcolor (LIGHTGRAY);
line (x2-x1,y2-y1,x2-x1,0);
line (x2-x1,y2-y1,0,y2-y1);
line (2,16,2,y2-y1-2);
line (2,2,x2-x1-2,2);
line (3,16,x2-x1-3,16);
setcolor (LIGHTBLUE);
rectangle (1,1,x2-x1-1,y2-y1-1);
line (3,15,x2-x1-3,15);
setfillstyle (SOLID_FILL,LIGHTBLUE);
floodfill (5,5,WHITE);
setcolor (WHITE);
outtextxy (5,5,tittle);
setcolor (color);
rectangle (3,17,x2-x1-3,y2-y1-3);
setfillstyle (SOLID_FILL,color);
floodfill (10,20,color);}
}
void mice::is_mouse (void)
{
_AX=0;
geninterrupt (0x33);
if (_AX==0)
{
puts ("no mouse");
delay (2000);
exit (-1);
}
}
void mice::c_set (int h_row,int h_column)
{
static unsigned c_mask[]={
0x7fff,0x3fff,0x1fff,0x0fff,
0x07ff,0x03ff,0x79ff,0x10ff,
0x207f,0x783f,0x001f,0x0fff,
0x1fff,0x3fff,0x7fff,0xffff,
0x8000,0xc000,0xe000,0xf000,
0xf800,0xfc00,0x8600,0xef00,
0xdf80,0x87c0,0xffe0,0xf000,
0xe000,0xc000,0x8000,0x0000,};
struct REGPACK r;
r.r_ax=9;
r.r_bx=h_column;
r.r_cx=h_row;
r.r_es=FP_SEG (c_mask);
r.r_dx=FP_OFF (c_mask);
intr (0x33,&r);
}
void mice::c_lim (int h_st,int h_end,int v_st,int v_end)
{
_AX=7;
_CX=h_st;
_DX=h_end;
geninterrupt (0x33);
_AX=8;
_CX=v_st;
_DX=v_end;
geninterrupt (0x33);
}
void mice::c_sense (int h,int v)
{
_AX=0x000f;
_CX=h;
_DX=v;
geninterrupt (0x33);
}
void mice::c_state ()
{
struct REGPACK r;
r.r_ax=3;
intr (0x33,&r);
ms_current.btn=r.r_bx;
ms_current.h=r.r_cx;
ms_current.v=r.r_dx;
}
void mice::click_but (int bx,int by)
{
if ((x>bx)&&(x<bx+100))
if ((y>by)&&(y<by+15))
{
take=1;
}
}
gfx::gfx (void)
{
int gd=VGA,gm=VGAHI,i,j;
initgraph (&gd,&gm,"");
g1.window (0,0,639,479,"Graph Painter (c) 2001 Z-soft ",BLACK,0);
setcolor (DARKGRAY);
outtextxy (50,465,"Z-soft is a registered trade mark of Zobov Software Corporation");
m1.is_mouse();
m1.c_set (0,0);
m1.c_lim (0,639,0,479);
m1.c_sense (10,10);
c_on();
}
gfx::gfx (int)
{
cout<<"введите режим работы (2-VGAHI,0-VGALO,1-VGAMED) ";
cin>>n;
int gd=VGA,gm=n,i,j;
initgraph (&gd,&gm,"");
g1.window (0,0,639,479,"Graph Painter (c) 2001 Z-soft ",BLACK,0);
setcolor (DARKGRAY);
outtextxy (50,465,"Z-soft is a registered trade mark of Zobov Software Corporation");
m1.is_mouse();
m1.c_set (0,0);
m1.c_lim (0,639,0,479);
m1.c_sense (10,10);
c_on();
}
gfx::gfx (char *tittle)
{
int gd=VGA,gm=VGAHI,i,j;
initgraph (&gd,&gm,"");
g1.window (0,0,639,479,tittle,BLACK,0);
setcolor (DARKGRAY);
outtextxy (50,465,"Z-soft is a registered trade mark of Zobov Software Corporation");
m1.is_mouse();
m1.c_set (0,0);
m1.c_lim (0,639,0,479);
m1.c_sense (10,10);
c_on();
}
void gfx::c (void)
{yy2--;
if (yy2-yy1<=30) yy2=yy1+90;
}
Вывод: В ходе данной лабораторной работы были изучены основные возможности языка Си++ по управлению с помощью манипулятора «мышь». Представленная программа выводит на экран объект, передвигаемый при помощи мыши, при захвате нажатием левой клавиши мыши, выход - esc. В программе применены классы и созданные с их помощью объекты, производится перегрузка конструкторов.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.