diff --git a/Лаб 6..cpp b/Лаб 6..cpp new file mode 100644 index 0000000..771140f --- /dev/null +++ b/Лаб 6..cpp @@ -0,0 +1,272 @@ +// WindowsProject24.cpp : Определяет точку входа для приложения. +// + +#include "framework.h" +#include "WindowsProject24.h" + +#define MAX_LOADSTRING 100 + +// Глобальные переменные: +HINSTANCE hInst; // текущий экземпляр +WCHAR szTitle[MAX_LOADSTRING]; // Текст строки заголовка +WCHAR szWindowClass[MAX_LOADSTRING]; // имя класса главного окна + +// Отправить объявления функций, включенных в этот модуль кода: +ATOM MyRegisterClass(HINSTANCE hInstance); +BOOL InitInstance(HINSTANCE, int); +LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); +INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM); + +int APIENTRY wWinMain(_In_ HINSTANCE hInstance, + _In_opt_ HINSTANCE hPrevInstance, + _In_ LPWSTR lpCmdLine, + _In_ int nCmdShow) +{ + UNREFERENCED_PARAMETER(hPrevInstance); + UNREFERENCED_PARAMETER(lpCmdLine); + + // TODO: Разместите код здесь. + + // Инициализация глобальных строк + LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); + LoadStringW(hInstance, IDC_WINDOWSPROJECT24, szWindowClass, MAX_LOADSTRING); + MyRegisterClass(hInstance); + + // Выполнить инициализацию приложения: + if (!InitInstance (hInstance, nCmdShow)) + { + return FALSE; + } + + HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDOWSPROJECT24)); + + MSG msg; + + // Цикл основного сообщения: + while (GetMessage(&msg, nullptr, 0, 0)) + { + if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } + + return (int) msg.wParam; +} + + + +// +// ФУНКЦИЯ: MyRegisterClass() +// +// ЦЕЛЬ: Регистрирует класс окна. +// +ATOM MyRegisterClass(HINSTANCE hInstance) +{ + WNDCLASSEXW wcex; + + wcex.cbSize = sizeof(WNDCLASSEX); + + wcex.style = CS_HREDRAW | CS_VREDRAW; + wcex.lpfnWndProc = WndProc; + wcex.cbClsExtra = 0; + wcex.cbWndExtra = 0; + wcex.hInstance = hInstance; + wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSPROJECT24)); + wcex.hCursor = LoadCursor(nullptr, IDC_ARROW); + wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); + wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WINDOWSPROJECT24); + wcex.lpszClassName = szWindowClass; + wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); + + return RegisterClassExW(&wcex); +} + +// +// ФУНКЦИЯ: InitInstance(HINSTANCE, int) +// +// ЦЕЛЬ: Сохраняет маркер экземпляра и создает главное окно +// +// КОММЕНТАРИИ: +// +// В этой функции маркер экземпляра сохраняется в глобальной переменной, а также +// создается и выводится главное окно программы. +// +BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) +{ + hInst = hInstance; // Сохранить маркер экземпляра в глобальной переменной + + HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, + CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr); + + if (!hWnd) + { + return FALSE; + } + + ShowWindow(hWnd, nCmdShow); + UpdateWindow(hWnd); + + return TRUE; +} + +// +// ФУНКЦИЯ: WndProc(HWND, UINT, WPARAM, LPARAM) +// +// ЦЕЛЬ: Обрабатывает сообщения в главном окне. +// +// WM_COMMAND - обработать меню приложения +// WM_PAINT - Отрисовка главного окна +// WM_DESTROY - отправить сообщение о выходе и вернуться +// +// +LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) + { + case WM_COMMAND: + { + int wmId = LOWORD(wParam); + // Разобрать выбор в меню: + switch (wmId) + { + case IDM_ABOUT: + DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); + break; + case IDM_EXIT: + DestroyWindow(hWnd); + break; + default: + return DefWindowProc(hWnd, message, wParam, lParam); + } + } + break; + case WM_PAINT: + { + PAINTSTRUCT ps; + HDC hdc = BeginPaint(hWnd, &ps); + // TODO: Добавьте сюда любой код прорисовки, использующий HDC... + + HPEN hPen = CreatePen(PS_SOLID, 3, RGB(8, 19, 225)); + SelectObject(hdc, hPen); + + HBRUSH hBrush; + hBrush = CreateSolidBrush(RGB(181, 199, 35)); + SelectObject(hdc, hBrush); + + //Крыша + MoveToEx(hdc, 450, 200, NULL); + LineTo(hdc, 300, 350); + LineTo(hdc, 600, 350); + LineTo(hdc, 450, 200); + + //Дом + MoveToEx(hdc, 300, 350, NULL); + LineTo(hdc, 300, 650); + LineTo(hdc, 600, 650); + LineTo(hdc, 600, 350); + + //Окно + MoveToEx(hdc, 350, 400, NULL); + LineTo(hdc, 350, 500); + LineTo(hdc, 450, 500); + LineTo(hdc, 450, 400); + LineTo(hdc, 350, 400); + + //Дверь + MoveToEx(hdc, 500, 650, NULL); + LineTo(hdc, 500, 450); + LineTo(hdc, 600, 450); + + //Ручка + MoveToEx(hdc, 525, 525, NULL); + LineTo(hdc, 525, 575); + + hPen = CreatePen(PS_SOLID, 5, RGB(55, 122, 48)); + SelectObject(hdc, hPen); + int x1 = 0, y1 = 550; + int x2 = 100, y2 = 650; + do { + MoveToEx(hdc, x1, y1, NULL); + LineTo(hdc, x2, y2); + DeleteObject(hPen); + x1 += 10; + } while (x1 <= 270); + + hPen = CreatePen(PS_SOLID, 2, RGB(0, 255, 255)); + SelectObject(hdc, hPen); + int x5 = 150, y5 = 250; + int x6 = 250, y6 = 250; + do { + MoveToEx(hdc, x5, y5, NULL); + LineTo(hdc, x6, y6); + x5 += 25; + y5 -= 50; + } while (x5 <= 100); + + x5 = 250; + y5 = 100; + do { + MoveToEx(hdc, x5, y5, NULL); + LineTo(hdc, x6, y6); + DeleteObject(hPen); + x5 += 25; + y5 += 50; + } while (x5 <= 200); + + + hPen = CreatePen(PS_SOLID, 5, RGB(255, 0, 0)); + SelectObject(hdc, hPen); + int x9 = 800, y9 = 0; + int x10 = 800, y10 = 150; + do { + MoveToEx(hdc, x9, y9, NULL); + LineTo(hdc, x10, y10); + DeleteObject(hPen); + x9 += 40; + x10 += 40; + } while (x9 <= 250); + + hPen = CreatePen(PS_SOLID, 1, RGB(0, 255, 0)); + SelectObject(hdc, hPen); + int x11 = 625, y11 = 625; + int x12 = 625, y12 = 650; + do { + MoveToEx(hdc, x11, y11, NULL); + LineTo(hdc, x12, y12); + DeleteObject(hPen); + x11 += 15; + } while (x11 <= 20); + + EndPaint(hWnd, &ps); + } + break; + case WM_DESTROY: + PostQuitMessage(0); + break; + default: + return DefWindowProc(hWnd, message, wParam, lParam); + } + return 0; +} + +// Обработчик сообщений для окна "О программе". +INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + UNREFERENCED_PARAMETER(lParam); + switch (message) + { + case WM_INITDIALOG: + return (INT_PTR)TRUE; + + case WM_COMMAND: + if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) + { + EndDialog(hDlg, LOWORD(wParam)); + return (INT_PTR)TRUE; + } + break; + } + return (INT_PTR)FALSE; +}