OAIP/window/window.cpp

317 lines
9.7 KiB
C++
Raw Permalink Normal View History

// window.cpp : Определяет точку входа для приложения.
//
#include "framework.h"
#include "window.h"
#define _USE_MATH_DEFINES
//#define DEBUG_GAME
#include <math.h>
#include <stdbool.h>
//#define TEST
//#define FIRST
#define SEVEN
#include "Paint.h"
#include "L8.h"
#define MAX_LOADSTRING 100
#define Draw 1023
// Глобальные переменные:
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 sost = 1;
int MyX = 0, MyY = 0, MyAng = 0;
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_WINDOW, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);
// Выполнить инициализацию приложения:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDOW));
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_WINDOW));
wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WINDOW);
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,
20, 20, 800, 800, 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 WRITE_HOME:
sost = 1;
RedrawWindow(hWnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE);
break;
case WRITE_FIGURE:
sost = 2;
RedrawWindow(hWnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE);
break;
case CLEAR_WINDOW:
sost = 0;
RedrawWindow(hWnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
//case Draw:
// sost = 1;
// RedrawWindow(hWnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE);
// break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
}
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
// TODO: Добавьте сюда любой код прорисовки, использующий HDC...
//paint_figures(hdc);
#ifdef FIRST
#ifndef SEVEN
if (abs(sost) % 3 == 1) {
house(hdc, 150, 75);
car(hdc, 150, 445, RGB(0, 0, 255));
car(hdc, 150, 600, RGB(0, 0, 0));
christmasTree(hdc, 450, 350);
tree(hdc, 50, 350);
bush1(hdc, 125, 125, RGB(0, 225, 0));
bush2(hdc, 650, 650, RGB(127, 127, 127));
sun(hdc, 780, 0);
}
else if (abs(sost) % 3 == 2) {
paint_figures(hdc);
}
else {
//HWND Draw_BTN = CreateWindow(L"button", // Predefined class; Unicode assumed
// L"aSd", // Button text
// WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, // Styles
// 10, // x position
// 10, // y position
// 100, // Button width
// 100, // Button height
// hWnd, // Parent window
// (HMENU) Draw, // No menu.
// NULL,
// NULL);
}
#endif
#ifdef SEVEN
switch (abs(sost)%7) {
case 0:
house(hdc, 150, 75);
break;
case 1:
car(hdc, 150, 445, RGB(0, 0, 255));
break;
case 2:
christmasTree(hdc, 450, 350);
break;
case 3:
tree(hdc, 50, 350);
break;
case 4:
bush1(hdc, 125, 125, RGB(0, 225, 0));
break;
case 5:
bush2(hdc, 650, 650, RGB(127, 127, 127));
break;
case 6:
paint_figures(hdc);
break;
}
#endif
test(hdc, MyX + 400, MyY + 400, 50, 100, MyAng);
#endif
#ifndef FIRST
void (*f)(HDC, int, int) = L8_logo;
switch (abs(sost) % 4){
case 0:
pattern1(hdc, (*f));
break;
case 1:
pattern2(hdc, (*f));
break;
case 2:
pattern3(hdc, (*f));
break;
case 3:
pattern4(hdc, (*f));
break;
default:
break;
}
#endif
EndPaint(hWnd, &ps);
}
break;
case WM_CHAR:
switch (wParam) {
case 'a':
MyX -= 1;
break;
case 'd':
MyX += 1;
break;
case 'w':
MyY -= 1;
break;
case 's':
MyY += 1;
break;
case 'e':
MyAng += 1;
break;
case 'q':
MyAng -= 1;
break;
}
InvalidateRect(hWnd, NULL, TRUE);
break;
case WM_KEYDOWN:
switch (wParam) {
case VK_RIGHT:
sost += 1;
break;
case VK_LEFT:
sost -= 1;
break;
default:
break;
}
RedrawWindow(hWnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}