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


#include <iostream>
#include <Windows.h>
#include <windowsx.h>
#include <tchar.h>

using namespace std;

// Базовый класс ФИГУРА
class Figure
{
protected:
    HWND hWnd;
    HDC hDC;
    COLORREF Color;
    int CenterX;
    int CenterY;

public:
    Figure(HWND _hWnd, int iCenterX, int iCenterY)
    {
        hWnd = _hWnd;
        hDC = GetDC(hWnd);

        Color = RGB(255, 0, 0);
        CenterX = iCenterX;
        CenterY = iCenterY;
    }

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

    virtual void Show() = 0;

    virtual void Hide()
    {
        COLORREF prev_col = Color;
        Color = RGB(255, 255, 255);
        Show();
        Color = prev_col;
    }
};

// Класс СОПРИКАСАЮЩИЕСЯ ОКРУЖНОСТИ
class TouchingCircles : public Figure
{
private:
    int Radius;

public:
    TouchingCircles(HWND _hWnd, int iCenterX, int iCenterY, int iRadius)
        : Figure(_hWnd, iCenterX, iCenterY)
    {
        Radius = iRadius;
    }

    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,
            CenterY - Radius,
            CenterX + 3 * Radius,
            CenterY + Radius
        );

        SelectObject(hDC, oldBrush);
        SelectObject(hDC, oldPen);

        DeleteObject(hPen);
    }
};

// Глобальный указатель на базовый класс
Figure* figure = nullptr;

// Процедура обработки сообщений окна
LRESULT CALLBACK WindowProc(
    HWND hWnd,
    UINT message,
    WPARAM wParam,
    LPARAM lParam
)
{
    switch (message)
    {
    case WM_PAINT:
    {
        PAINTSTRUCT ps;
        HDC hDC = BeginPaint(hWnd, &ps);

        if (figure != nullptr)
        {
            // Рисование фигуры через указатель базового класса
            figure->Show();
        }

        EndPaint(hWnd, &ps);
        return 0;
    }

    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }

    return DefWindowProc(hWnd, message, wParam, lParam);
}

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;
    }

    // Регистрация класса окна
    const wchar_t CLASS_NAME[] = L"FigureWindow";

    WNDCLASSW wc = {};
    wc.lpfnWndProc = WindowProc;
    wc.hInstance = GetModuleHandle(nullptr);
    wc.lpszClassName = CLASS_NAME;
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    wc.hCursor = LoadCursor(nullptr, IDC_ARROW);

    if (!RegisterClassW(&wc))
    {
        cout << "Ошибка регистрации окна." << endl;
        return 1;
    }

    // Создание окна
    HWND hWnd = CreateWindowExW(
        0,
        CLASS_NAME,
        L"Соприкасающиеся окружности",
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        800,
        600,
        nullptr,
        nullptr,
        GetModuleHandle(nullptr),
        nullptr
    );

    if (hWnd == nullptr)
    {
        cout << "Ошибка создания окна." << endl;
        return 1;
    }

    // Создание объекта производного класса через Figure*
    figure = new TouchingCircles(hWnd, x, y, radius);

    ShowWindow(hWnd, SW_SHOW);
    UpdateWindow(hWnd);

    // Цикл обработки сообщений Windows
    MSG msg = {};

    while (GetMessage(&msg, nullptr, 0, 0) > 0)
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    delete figure;
    figure = nullptr;

    return 0;
}