Результаты работы программы
При запуске программы открывается окно:
Справа видны три кнопки, при нажатии на которые будут отображаться указанные на кнопках рисунки.
Для передвижения рисунка следует щелкнуть левой кнопкой мыши в том месте, где необходимо отобразить рисунок. Рисунок появится в указанном месте и будет следовать за указателем мыши. Для остановки рисунка в нужном месте необходимо ещё раз щёлкнуть левой кнопкой мыши, указывая место остановки.
Листинг программы
Unit.h
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
#include <Graphics.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TPanel *Panel1;
TPanel *Panel2;
TImage *Image1;
TButton *Button1;
TButton *Button2;
TButton *Button3;
TImage *Image2;
void __fastcall Button1Click(TObject *Sender);
void __fastcall Button2Click(TObject *Sender);
void __fastcall Button3Click(TObject *Sender);
void __fastcall Image1MouseMove(TObject *Sender, TShiftState Shift,
int X, int Y);
void __fastcall Image1Click(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
class TRis
{
public:
TRis();
void Clear(TForm1 *form);
virtual void Risuet(TForm1 *form,int x, int y);
};
class TStrela : public TRis
{
public:
__fastcall TStrela();
virtual void Risuet(TForm1 *form,int x, int y);
};
class TLuna : public TRis
{
public:
__fastcall TLuna();
virtual void Risuet(TForm1 *form,int x, int y);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
Unit.cpp
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int i=0;
TRis * ris;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{ //выбрана кнопка Смайл
i=0; //чтоб сначала рисунок не мог двигаться
ris=new TRis();
ris->Risuet(Form1,100,100);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{ //выбрана кнопка Стрелка
i=0; //чтоб сначала рисунок не мог двигаться
ris=new TStrela();
ris->Risuet(Form1,50,50);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{ //выбрана кнопка Месяц
i=0; //чтоб сначала рисунок не мог двигаться
ris=new TLuna();
ris->Risuet(Form1,80,50);
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
TRis::TRis()
{
delete ris; ris=NULL;
}
//**********************************************************
__fastcall TStrela::TStrela() : TRis()
{
}
//**********************************************************
__fastcall TLuna::TLuna() : TRis()
{
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void TRis::Clear(TForm1 *form)
{//почистить экран
form->Image2->Visible=false;
form->Image1->Canvas->Pen->Color=clWhite;
form->Image1->Canvas->Brush->Color=clWhite;
form->Image1->Canvas->Rectangle(0,0,form->Image1->Width,form->Image1->Height);
}
//---------------------------------------------------------------------------
void TRis::Risuet(TForm1 *form,int x, int y)
{//рисовать Смайл
Clear(form); //чистим экран
//подготовить инструменты для рисования
form->Image1->Canvas->Pen->Color=clBlack; //этим рисуем
form->Image1->Canvas->Pen->Width=10;
form->Image1->Canvas->Brush->Color=clWhite; //этим заливаем
form->Image1->Canvas->Ellipse(x-80,y-40,x,y+40);
form->Image1->Canvas->Ellipse(x-60,y-20,x-50,y-10);
form->Image1->Canvas->Ellipse(x-30,y-20,x-20,y-10);
form->Image1->Canvas->Arc(x-60,y,x-20,y+40,x-20,y+20,x-60,y+20);
}
void TStrela::Risuet(TForm1 *form,int x, int y)
{//рисовать Стрелку
Clear(form); //чистим экран
form->Image2->Left=x-20;
form->Image2->Top=y-20;
form->Image2->Picture->Bitmap->LoadFromFile("strelka.bmp");
form->Image2->Visible=true;
}
void TLuna::Risuet(TForm1 *form,int x, int y)
{//нарисовать Месяц
Clear(form); //чистим экран
form->Image2->Left=x-20;
form->Image2->Top=y-20;
form->Image2->Picture->Bitmap->LoadFromFile("luna.bmp");
form->Image2->Visible=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift,
int X, int Y)
{
if (i==0) return; //не двигать, выйти
ris->Risuet(Form1,X,Y); //перерисовать рисунок с новыми координатами
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1Click(TObject *Sender)
{
if (i==1) i=0; //установить флаг "не двигать"
else i=1; //установить флаг " двигать"
}
