#include <windows.h>
#include <iostream>
using namespace std;
// Базовый класс Фигура
class Figure
{
protected:
HDC hdc;
int x, y;
public:
Figure(HDC dc = NULL, int x0 = 0, int y0 = 0)
: hdc(dc), x(x0), y(y0)
{
cout << "Constructor Figure" << endl;
}
virtual ~Figure()
{
cout << "Destructor Figure" << endl;
}
};
// Класс Прямоугольник
class RectFigure : virtual public Figure
{
public:
RectFigure(HDC dc, int x0, int y0)
: Figure(dc, x0, y0)
{
cout << "Constructor RectFigure" << endl;
}
void DrawRectangle()
{
::Rectangle(hdc, x, y, x + 100, y + 60);
}
~RectFigure()
{
cout << "Destructor RectFigure" << endl;
}
};
// Класс Окружность
class Circle : virtual public Figure
{
protected:
int radius;
public:
Circle(HDC dc, int x0, int y0, int r)
: Figure(dc, x0, y0), radius(r)
{
cout << "Constructor Circle" << endl;
}
void DrawCircle(int cx, int cy)
{
::Ellipse(hdc, cx - radius, cy - radius,
cx + radius, cy + radius);
}
~Circle()
{
cout << "Destructor Circle" << endl;
}
};
// Составная фигура
class TouchingCircles : public RectFigure, public Circle
{
public:
TouchingCircles(HDC dc, int x0, int y0)
: Figure(dc, x0, y0),
RectFigure(dc, x0, y0),
Circle(dc, x0, y0, 30)
{
cout << "Constructor TouchingCircles" << endl;
}
void Draw()
{
// Рисуем прямоугольник
DrawRectangle();
// Рисуем три соприкасающиеся окружности
DrawCircle(x + 30, y + 100);
DrawCircle(x + 90, y + 100);
DrawCircle(x + 150, y + 100);
}
~TouchingCircles()
{
cout << "Destructor TouchingCircles" << endl;
}
};
int main()
{
// Получаем контекст существующего консольного окна
HWND hwnd = GetConsoleWindow();
HDC hdc = GetDC(hwnd);
if (hdc == NULL)
{
cout << "Ошибка получения HDC" << endl;
return 1;
}
{
// Создаем объект составной фигуры
TouchingCircles figure(hdc, 50, 50);
// Рисуем фигуры
figure.Draw();
cout << "Нажмите Enter для завершения..." << endl;
cin.get();
}
// Освобождаем контекст устройства
ReleaseDC(hwnd, hdc);
return 0;
}