Загрузка данных
#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;
}