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


#include <windows.h>
#include <iostream>
#include <limits>

using namespace std;

// Базовый класс графической фигуры
class Figure
{
protected:
    HWND hWnd;
    HDC hDC;
    COLORREF Color;
    int CenterX;
    int CenterY;

public:
    Figure(HWND window, int x, int y)
    {
        hWnd = window;
        hDC = GetDC(hWnd);
        Color = RGB(255, 0, 0);
        CenterX = x;
        CenterY = y;
    }

    virtual ~Figure()
    {
        ReleaseDC(hWnd, hDC);
    }

    virtual void Show() = 0;

    virtual void Hide()
    {
        InvalidateRect(hWnd, nullptr, TRUE);
        UpdateWindow(hWnd);
    }
};

// Класс "Соприкасающиеся окружности"
class TouchingCircles : public Figure
{
private:
    int Radius;

public:
    TouchingCircles(HWND window, int x, int y, int radius)
        : Figure(window, x, y)
    {
        Radius = radius;
    }

    void Show() override
    {
        HPEN hPen = CreatePen(PS_SOLID, 2, Color);
        HGDIOBJ oldPen = SelectObject(hDC, hPen);
        HGDIOBJ oldBrush = SelectObject(
            hDC, GetStockObject(NULL_BRUSH)
        );

        // Первая окружность
        Ellipse(
            hDC,
            CenterX - Radius,
            CenterY - Radius,
            CenterX + Radius,
            CenterY + Radius
        );

        // Вторая окружность.
        // Центры находятся на расстоянии двух радиусов.
        Ellipse(
            hDC,
            CenterX + Radius - Radius,
            CenterY - Radius,
            CenterX + Radius + Radius,
            CenterY + Radius
        );

        SelectObject(hDC, oldBrush);
        SelectObject(hDC, oldPen);
        DeleteObject(hPen);
    }
};

int main()
{
    setlocale(LC_ALL, "Russian");

    int x, y, radius;

    cout << "Лабораторная работа №3" << endl;
    cout << "Вариант 1.4 — соприкасающиеся окружности" << endl;

    cout << "Введите координату X центра первой окружности: ";
    cin >> x;

    cout << "Введите координату Y центра окружностей: ";
    cin >> y;

    cout << "Введите радиус окружностей: ";
    cin >> radius;

    if (!cin || radius <= 0)
    {
        cout << "Ошибка: радиус должен быть положительным числом."
             << endl;
        return 1;
    }

    // Создаём окно для рисования
    HWND hWnd = GetConsoleWindow();

    // Указатель на базовый класс
    Figure* figure = new TouchingCircles(hWnd, x, y, radius);

    // Полиморфный вызов метода
    figure->Show();

    cout << endl;
    cout << "Окружности нарисованы." << endl;
    cout << "Нажмите Enter для завершения программы...";

    cin.ignore(numeric_limits<streamsize>::max(), '\n');
    cin.get();

    delete figure;

    return 0;
}