Если не использовать виртуальный метод, то потомки при вызове методов Show() и Hide() будут вызывать родительский метод Draw(), а не свой. Для отрисовки данных в задании графических объектов создали три объекта TGraphObj1, TGraphObj2, TGraphObj3. Все они наследованы от базового объекта TGraphObj и отличаются друг от друга только реализацией метода Draw().
Во время создания главной формы, мы создаем экземпляр объекта TGraphObj, инициализируем его и отображаем на экране. Для управления движением нашего графического объекта посредством манипулятора “мышь”, обрабатываем событие главной формы OnMouseMove, вызываем GraphObj->Move(X, Y). Для выбора нужного графического объекта мы используем компонент TRadioButton, обрабатываем событие OnClick, в нем сперва прячем старый графический объект, затем удаляем из памяти сам объект, создаем новый экземпляр, инициализируем его и отображаем на форме. Для объединения наших всех RadioButton используем компонент TRadioGroup. Чтобы наш графический объект не затирался при перемещении главной формы за границы экрана, обрабатываем событие OnPaint главной формы, перерисовываем наш объект, если он виден в данный момент.
В процессе разработки объектно-ориентированной программы мы получили следующие файлы: Project1.bpr – файл настроек проекта, Project1.cpp – исходный код проекта, Project1.exe – исполняемый файл программы, Project1.res – файл ресурсов проекта, Unit1.cpp – исходный текст главной формы, Unit1.dfm – файл описания свойств главной формы, Unit1.h – заголовочный файл главной формы.
Результат работы программы
//--------------------------------------------------------------------------#include <vcl.h>
#pragma hdrstop
USERES("Project1.res");
USEFORM("Unit1.cpp", Form1);
//--------------------------------------------------------------------------WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
return 0;
}
//---------------------------------------------------------------------------
//--------------------------------------------------------------------------#ifndef Unit1H
#define Unit1H
//--------------------------------------------------------------------------#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
//--------------------------------------------------------------------------class TForm1 : public TForm
{
__published: // IDE-managed Components
TRadioGroup *RadioGroup;
TRadioButton *RadioButton1;
TRadioButton *RadioButton2;
TRadioButton *RadioButton3;
void __fastcall FormCreate(TObject *Sender);
void __fastcall FormMouseMove(TObject *Sender, TShiftState Shift,
int X, int Y);
void __fastcall FormPaint(TObject *Sender);
void __fastcall RadioButton1Click(TObject *Sender);
void __fastcall RadioButton2Click(TObject *Sender);
void __fastcall RadioButton3Click(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
class TGraphObj // базовый объект
{
public:
int X,Y;
bool Visible;
void Show();
void Hide();
virtual void Draw() = 0; // пустая виртуальная функция
void Move(int NewX, int NewY);
void Init(int x, int y);
};
class TGraphObj1 : public TGraphObj // наследован от базового
{
void Draw();
};
class TGraphObj2 : public TGraphObj // наследован от базового
{
void Draw();
};
class TGraphObj3 : public TGraphObj // наследован от базового
{
void Draw();
};
//---------------------------------------------------------------------------;
extern PACKAGE TForm1 *Form1;
//--------------------------------------------------------------------------#endif
//--------------------------------------------------------------------------#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//--------------------------------------------------------------------------#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
TGraphObj *GraphObj;
//--------------------------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//--------------------------------------------------------------------------void TGraphObj::Init(int x, int y)
{
X = x;
Y = y;
}
void TGraphObj::Show()
{
Form1->Canvas->Pen->Color = clBlack;
Form1->Canvas->Brush->Color = Form1->Color;
Draw();
Visible = TRUE;
}
void TGraphObj::Hide()
{
Form1->Canvas->Pen->Color = Form1->Color;
Form1->Canvas->Brush->Color = Form1->Color;
Draw();
Visible = FALSE;
}
void TGraphObj::Move(int NewX, int NewY)
{
Hide();
X = NewX;
Y = NewY;
Show();
}
void TGraphObj1::Draw()
{
Windows::TPoint points[4];
points[0] = Point(X-29,Y-10); points[1] = Point(X+29,Y-10);
points[2] = Point(X+7,Y+12); points[3] = Point(X-7,Y+12);
Form1->Canvas->Polygon(points, 3);
Form1->Canvas->Ellipse(X-7, Y-7, X+7, Y+7);
Form1->Canvas->MoveTo(X, Y+12); Form1->Canvas->LineTo(X, Y+35);
Form1->Canvas->MoveTo(X-15, Y+35); Form1->Canvas->LineTo(X+15, Y+35);
}
void TGraphObj2::Draw()
{
Form1->Canvas->MoveTo(X-20, Y); Form1->Canvas->LineTo(X+20, Y);
Form1->Canvas->Ellipse(X-24, Y-4, X-16, Y+4);
Form1->Canvas->Ellipse(X+20, Y-4, X+28, Y+4);
Form1->Canvas->MoveTo(X-10, Y); Form1->Canvas->LineTo(X-10, Y+30);
Form1->Canvas->MoveTo(X+10, Y); Form1->Canvas->LineTo(X+10, Y+30);
Form1->Canvas->MoveTo(X-10, Y+30); Form1->Canvas->LineTo(X-17, Y+30);
Form1->Canvas->MoveTo(X+10, Y+30); Form1->Canvas->LineTo(X+17, Y+30);
Form1->Canvas->MoveTo(X, Y); Form1->Canvas->LineTo(X, Y-30);
Form1->Canvas->MoveTo(X-10, Y-15); Form1->Canvas->LineTo(X+10, Y-15);
Form1->Canvas->Ellipse(X-4, Y-28, X+4, Y-36);
}
void TGraphObj3::Draw()
{
Form1->Canvas->MoveTo(X-25, Y); Form1->Canvas->LineTo(X+25, Y);
Form1->Canvas->MoveTo(X, Y-25); Form1->Canvas->LineTo(X, Y+25);
Form1->Canvas->Ellipse(X-33, Y-4, X-25, Y+4);
Form1->Canvas->Ellipse(X+33, Y-4, X+25, Y+4);
Form1->Canvas->Ellipse(X-4, Y-25, X+4, Y-33);
Form1->Canvas->Ellipse(X-4, Y+25, X+4, Y+33);
Form1->Canvas->Ellipse(X-12, Y-12, X-18, Y-18);
Form1->Canvas->Ellipse(X+12, Y+12, X+18, Y+18);
Form1->Canvas->Ellipse(X-12, Y+12, X-18, Y+18);
Form1->Canvas->Ellipse(X+12, Y-12, X+18, Y-18);
}
void __fastcall TForm1::FormCreate(TObject *Sender)
{
GraphObj = new TGraphObj1;
GraphObj->Init(320, 100);
GraphObj->Show();
}
//--------------------------------------------------------------------------void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift,
int X, int Y) // обрабатываем перемещение мыши
{
GraphObj->Move(X, Y);
}
//--------------------------------------------------------------------------//--------------------------------------------------------------------------void __fastcall TForm1::FormPaint(TObject *Sender)
// Перерисовываем наш графический объект, если форму перемещали за границу экрана
{
if (GraphObj->Visible) GraphObj->Show();
}
//--------------------------------------------------------------------------void __fastcall TForm1::RadioButton1Click(TObject *Sender)
{
if (GraphObj->Visible) GraphObj->Hide(); // прячем старую фигуру, если она видна
delete GraphObj; // удаляем старый экземпляр объекта
GraphObj = new TGraphObj1; // создаем новый экземпляр объекта
GraphObj->Init(320, 100); // инициализируем новый экземпляр объекта с координатами (320,100)
GraphObj->Show(); // отображаем графический объект
}
//--------------------------------------------------------------------------void __fastcall TForm1::RadioButton2Click(TObject *Sender)
{
if (GraphObj->Visible) GraphObj->Hide();
delete GraphObj;
GraphObj = new TGraphObj2;
GraphObj->Init(320, 100);
GraphObj->Show();
}
//--------------------------------------------------------------------------void __fastcall TForm1::RadioButton3Click(TObject *Sender)
{
if (GraphObj->Visible) GraphObj->Hide();
delete GraphObj;
GraphObj = new TGraphObj3;
GraphObj->Init(320, 100);
GraphObj->Show();
}
//---------------------------------------------------------------------------
object Form1: TForm1
Left = 307
Top = 151
Width = 640
Height = 480
Caption = 'Разработка ООП обеспечения для работы с графическими объектами'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
Position = poDesktopCenter
OnCreate = FormCreate
OnMouseMove = FormMouseMove
OnPaint = FormPaint
PixelsPerInch = 96
TextHeight = 13
object RadioGroup: TRadioGroup
Left = 0
Top = 0
Width = 632
Height = 39
Align = alTop
Caption = ' Выбирите графический объект '
TabOrder = 0
end
object RadioButton1: TRadioButton
Left = 14
Top = 15
Width = 227
Height = 17
Caption = '1)'
Checked = True
TabOrder = 1
TabStop = True
OnClick = RadioButton1Click
end
object RadioButton2: TRadioButton
Left = 259
Top = 15
Width = 230
Height = 17
Caption = '2)'
TabOrder = 2
OnClick = RadioButton2Click
end
object RadioButton3: TRadioButton
Left = 510
Top = 15
Width = 113
Height = 17
Caption = '3)'
TabOrder = 3
OnClick = RadioButton3Click
end
end
В ходе выполненной работы мы узнали что такое объектно-ориентированное программирование и научились применять его на практике. Так же познакомились со средой программирования Borland C++ Builder. Научились использовать графические функции, а также пользоваться
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.