Загрузка данных


#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()
    {
        // Используем HDC класса RectangleFigure,
        // чтобы избежать неоднозначности
        HDC dc = RectangleFigure::hdc;

        // Создаём красное перо толщиной 2 пикселя
        HPEN redPen = CreatePen(
            PS_SOLID, 2, RGB(255, 0, 0)
        );

        if (redPen == NULL)
        {
            cout << "Ошибка создания пера!" << endl;
            return;
        }

        // Сохраняем прежние настройки рисования
        HGDIOBJ oldPen = SelectObject(dc, redPen);
        HGDIOBJ oldBrush = SelectObject(
            dc, GetStockObject(HOLLOW_BRUSH)
        );

        // Рисуем прямоугольник
        DrawRectangle();

        // Рисуем три соприкасающиеся окружности
        int step = 2 * radius + circleSpacing;

        DrawCircle(circleX, circleY);
        DrawCircle(circleX + step, circleY);
        DrawCircle(circleX + 2 * step, circleY);

        // Восстанавливаем прежние настройки
        SelectObject(dc, oldBrush);
        SelectObject(dc, 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 << "Фигуры нарисованы!" << endl;
        cout << "Нажмите Enter для завершения..." << endl;

        cin.get();
    }

    // Освобождаем контекст устройства
    ReleaseDC(hwnd, hdc);

    return 0;
}