Загрузка данных
#include <windows.h>
#include <iostream>
#include <clocale>
using namespace std;
// Базовый класс Фигура
class Figure
{
protected:
HDC hdc;
public:
Figure(HDC dc = NULL) : hdc(dc)
{
cout << "Constructor Figure" << endl;
}
virtual ~Figure()
{
cout << "Destructor Figure" << endl;
}
};
// Класс Прямоугольник
// Невиртуальное наследование
class RectangleFigure : public Figure
{
protected:
int x1, y1, x2, y2;
public:
RectangleFigure(HDC dc, int a, int b, int c, int d)
: Figure(dc), x1(a), y1(b), x2(c), y2(d)
{
cout << "Constructor RectangleFigure" << endl;
}
void DrawRectangle()
{
::Rectangle(hdc, x1, y1, x2, y2);
}
~RectangleFigure()
{
cout << "Destructor RectangleFigure" << endl;
}
};
// Класс Окружность
// Невиртуальное наследование
class Circle : public Figure
{
protected:
int radius;
public:
Circle(HDC dc, int r)
: Figure(dc), 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 CompositeFigure :
public RectangleFigure,
public Circle
{
private:
int circleX;
int circleY;
int circleSpacing;
public:
CompositeFigure(
HDC dc,
int x1, int y1, int x2, int y2,
int cx, int cy, int r, int spacing
)
: RectangleFigure(dc, x1, y1, x2, y2),
Circle(dc, r),
circleX(cx),
circleY(cy),
circleSpacing(spacing)
{
cout << "Constructor CompositeFigure" << endl;
}
void Draw()
{
// Создаём красное перо толщиной 2 пикселя
HPEN redPen = CreatePen(
PS_SOLID, 2, RGB(255, 0, 0)
);
if (redPen == NULL)
{
cout << "Ошибка создания пера!" << endl;
return;
}
// Сохраняем прежние настройки рисования
HGDIOBJ oldPen = SelectObject(hdc, redPen);
HGDIOBJ oldBrush = SelectObject(
hdc, GetStockObject(HOLLOW_BRUSH)
);
// Рисуем прямоугольник
DrawRectangle();
// Рисуем три соприкасающиеся окружности
int step = 2 * radius + circleSpacing;
DrawCircle(circleX, circleY);
DrawCircle(circleX + step, circleY);
DrawCircle(circleX + 2 * step, circleY);
// Восстанавливаем прежние настройки
SelectObject(hdc, oldBrush);
SelectObject(hdc, oldPen);
// Удаляем созданное перо
DeleteObject(redPen);
}
~CompositeFigure()
{
cout << "Destructor CompositeFigure" << endl;
}
};
int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
setlocale(LC_ALL, "Russian");
// Получаем окно консоли
HWND hwnd = GetConsoleWindow();
if (hwnd == NULL)
{
cout << "Окно не найдено!" << endl;
return 1;
}
// Получаем контекст устройства
HDC hdc = GetDC(hwnd);
if (hdc == NULL)
{
cout << "Ошибка получения HDC!" << endl;
return 1;
}
cout << "=== Создание объекта ===" << endl;
{
CompositeFigure figure(
hdc,
70, 220, 250, 282, // Координаты прямоугольника
100, 250, // Центр первой окружности
30, 0 // Радиус и промежуток
);
figure.Draw();
cout << "Нажмите Enter для завершения..." << endl;
cin.get();
}
ReleaseDC(hwnd, hdc);
return 0;
}