Untitled
unknown
c_cpp
a year ago
14 kB
1
Indexable
Never
#include <windows.h> #include <windowsx.h> #include "menu.h" HFONT hFont1, hFont2, hFont3, hFont4;//Четыре фонта HBRUSH hBlueBrush, hGreenBrush, hNizBrush, hBlackBrush, hGrayBrush, hRightBrush, hFlagBrush, hIlumBrush, hSeaBrush, hOblakaBrush, hSunBrush, hBrush, hSkyBrush; HPEN hBlackPen, hPticiPen, hSeaPen, hOblakaPen, hSunPen, hGrayPen, hDarkPen;//Дескриптор новых перьев int sw; /*Главная функция WinMain */ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int) { char szClassName[] = "MainWindow"; char szTitle[] = "Программа 2"; MSG Msg; WNDCLASS wc; /* Регистрация класса главного окна */ ZeroMemory(&wc, sizeof(wc)); wc.lpfnWndProc = WndProc; wc.hInstance = hInst; wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = GetStockBrush(WHITE_BRUSH); wc.lpszMenuName = "Main"; wc.lpszClassName = szClassName; RegisterClass(&wc); /* Создание главного окна и отображение его на экране */ HWND hwnd = CreateWindow(szClassName, szTitle, WS_OVERLAPPEDWINDOW, 100, 100, 600, 500, HWND_DESKTOP, NULL, hInst, NULL); ShowWindow(hwnd, SW_SHOWNORMAL); /* Организация цикла обнаружения сообщений */ while (GetMessage(&Msg, NULL, 0, 0)) DispatchMessage(&Msg); return 0; } /* Оконная функция WndProc главного окна */ LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { HANDLE_MSG(hwnd, WM_COMMAND, OnCommand); HANDLE_MSG(hwnd, WM_CREATE, OnCreate); HANDLE_MSG(hwnd, WM_PAINT, OnPaint);//Обработка сообщения WM_PAINT HANDLE_MSG(hwnd, WM_DESTROY, OnDestroy);//Обработка сообщения WM_DESTROY default: return(DefWindowProc(hwnd, msg, wParam, lParam)); } } BOOL OnCreate(HWND, LPCREATESTRUCT) { hBlueBrush = CreateSolidBrush(RGB(100, 100, 255)); hGreenBrush = CreateSolidBrush(RGB(100, 255, 100)); //Создадим новые перья hBlackPen = CreatePen(PS_SOLID, 3, RGB(0, 0, 0)); hSeaPen = CreatePen(PS_SOLID, 3, RGB(30, 144, 255)); hOblakaPen = CreatePen(PS_SOLID, 3, RGB(255, 255, 255)); hSunPen = CreatePen(PS_SOLID, 3, RGB(255, 255, 0)); hGrayPen = CreatePen(PS_SOLID, 3, RGB(180, 180, 180)); hDarkPen = CreatePen(PS_SOLID, 3, RGB(120, 120, 120)); //Создадим новые кисти hNizBrush = CreateSolidBrush(RGB(255, 222, 183)); hBlackBrush = CreateSolidBrush(RGB(0, 0, 0)); hGrayBrush = CreateSolidBrush(RGB(180, 180, 180)); hRightBrush = CreateSolidBrush(RGB(255, 0, 0)); hFlagBrush = CreateSolidBrush(RGB(0, 255, 127)); hIlumBrush = CreateSolidBrush(RGB(70, 130, 180)); hSeaBrush = CreateSolidBrush(RGB(30, 144, 255)); hOblakaBrush = CreateSolidBrush(RGB(255, 255, 255)); hSunBrush = CreateSolidBrush(RGB(255, 255, 0)); hSkyBrush = CreateSolidBrush(RGB(135, 206, 250)); // char lpszFace1[] = "Courier New Cyr";//Имя Windows для шрифта char lpszFace2[] = "Times New Roman Cyr";//Имя Windows для шрифта char lpszFace3[] = "Arial Cyr";//Имя Windows для шрифта LOGFONT lf;//Структура LOGFONT для создания шрифтов ZeroMemory(&lf, sizeof(lf));//Обнуление структуры (обязательно) /*Создадим шрифт 1 (для заголовка)*/ lf.lfHeight = 30;//Размер lf.lfUnderline = 1;//Подчеркивание strcpy_s(lf.lfFaceName, lpszFace1);//Копируем имя шрифта hFont1 = CreateFontIndirect(&lf);//Создание шрифта /*Создадим шрифт 2 (для подзаголовка и цифр лет)*/ lf.lfHeight = 16;//Размер lf.lfUnderline = 0;//Подчеркивание lf.lfItalic = 0;//Курсив strcpy_s(lf.lfFaceName, lpszFace2);//Копируем имя шрифта hFont2 = CreateFontIndirect(&lf);//Создание шрифта /*Создадим шрифт 3 (для оси y)*/ lf.lfHeight = 18;//Размер lf.lfItalic = 0;//Отмена курсива lf.lfEscapement = 900;//Угол наклона 90 градусов strcpy_s(lf.lfFaceName, lpszFace3);//Копируем имя шрифта hFont3 = CreateFontIndirect(&lf);//Создание шрифта /*Создадим шрифт 4 (для шкалы)*/ lf.lfHeight = 16;//Размер lf.lfEscapement = 0;//Отмена угла наклона hFont4 = CreateFontIndirect(&lf);//Создание шрифта /*Создадим Розовый "Пощекочи меня" кисть*/ hBrush = CreateSolidBrush(RGB(252, 137, 172)); return TRUE; } void OnCommand(HWND hwnd, int id, HWND, UINT) { switch (id) { case MI_BLUE: sw = 1; InvalidateRect(hwnd, NULL, TRUE); break; case MI_GREEN: sw = 2; InvalidateRect(hwnd, NULL, TRUE); break; case MI_EXIT: DestroyWindow(hwnd); } } /*Функция обработки сообщения WM_PAINT*/ void OnDestroy(HWND) { PostQuitMessage(0); } /*Функция обработки события WM_PAINT*/ void OnPaint(HWND hwnd) { PAINTSTRUCT ps;//Структура, требуемая для рисования в рабочей области HDC hdc = BeginPaint(hwnd, &ps);//Получение контекста устройства if (sw == 1) { ///////// SelectPen(hdc, hBlackPen); //Небо SelectBrush(hdc, hSkyBrush); Rectangle(hdc, -25, -25, 650, 500); //Море SelectPen(hdc, hSeaPen); SelectBrush(hdc, hSeaBrush); Ellipse(hdc, -120, 120, 80, 200); Ellipse(hdc, -20, 120, 200, 200); Ellipse(hdc, 100, 120, 300, 200); Ellipse(hdc, 220, 120, 400, 200); Ellipse(hdc, 340, 120, 500, 200); Ellipse(hdc, 440, 120, 600, 200); Ellipse(hdc, 550, 120, 700, 200); Rectangle(hdc, 0, 140, 650, 900); //Подлодка SelectPen(hdc, hGrayPen); SelectBrush(hdc, hGrayBrush); //Хвост POINT vertices[] = { {150, 305}, {60, 280}, {60, 330} }; Polygon(hdc, vertices, sizeof(vertices) / sizeof(vertices[0])); //люк Rectangle(hdc, 320, 250, 280, 200); //перископ Rectangle(hdc, 300, 210, 350, 220); //борт Ellipse(hdc, 500, 250, 100, 350); //Илюминаторы SelectBrush(hdc, hIlumBrush); SelectPen(hdc, hDarkPen); Ellipse(hdc, 150, 270, 225, 320); //Ellipse(hdc, 275, 260, 205, 310); Ellipse(hdc, 250, 270, 300, 320); Ellipse(hdc, 310, 270, 360, 320); Ellipse(hdc, 370, 270, 420, 320); //Облака SelectPen(hdc, hOblakaPen); SelectBrush(hdc, hOblakaBrush); Ellipse(hdc, 70, 25, 130, 70); Ellipse(hdc, 90, 25, 150, 85); Ellipse(hdc, 130, 45, 190, 90); Ellipse(hdc, 170, 25, 230, 70); Ellipse(hdc, 370, 25, 430, 70); Ellipse(hdc, 390, 25, 450, 85); Ellipse(hdc, 430, 45, 490, 90); //Солнце SelectPen(hdc, hSunPen); SelectBrush(hdc, hSunBrush); Ellipse(hdc, 555, -20, 645, 60); ///////// }; { if (sw == 2) { /////////// RECT r; //Прямоугольник для надписей PAINTSTRUCT ps;//Структура, требуемая для рисования в рабочей области TEXTMETRIC tm; //Для получения характеристик шрифтов char szMainTitle[] = "Подводная лодка";//Заголовок char one[] = "Подводная лодка (ПЛ) (подлодка, субмарина) — класс кораблей, способных погружаться и "; char two[] = "длительное время действовать в подводном положении. В отличие от надводного судна, ПЛ"; char three[] = "обладает способностью преднамеренно изменять свою осадку вплоть до полного погружения"; char four[] = "в воду и ухода на глубину за счёт заполнения забортной водой цистерн главного балласта."; char five[] = "Обычно, подлодки используются в военных целях. Эта подлодка возвращается с экспедиции."; char six[] = "На ее борту ученые везут новые артефакты, найденные на одном из необитаемых островов."; char seven[] = "Самые известные подлодки:"; char eight[] = "094 «Цзинь», 094 «Цзинь», S119 «Astute», «Вирджиния», «Seawolf», «Seawolf»,«Ясень»"; /*Выведем строку заголовка*/ HFONT hOldFont = SelectFont(hdc, hFont1);//Выберем в контекст шрифт 1 SetTextColor(hdc, RGB(0, 0, 0));//Установим черный цвет GetTextMetrics(hdc, &tm);//Получим метрики текста r.left = 0;//Задание координат прямоугольника, в который r.top = 5;//будет выводиться текст заголовка r.right = 600; r.bottom = r.top + tm.tmHeight;//Высоту прямоугольника выберем по высоте шрифта DrawText(hdc, szMainTitle, strlen(szMainTitle), &r, DT_CENTER);//Выведен текст SelectFont(hdc, hFont2);//Выберем шрифт 2 GetTextMetrics(hdc, &tm);//Получим метрики текста SetTextColor(hdc, RGB(141, 2, 31));//Установим бардовый цвет r.left = 0;//Задание координат прямоугольника, в который r.top = 30;//будет выводиться текст заголовка r.right = 600; r.bottom = r.top + tm.tmHeight; DrawText(hdc, one, strlen(one), &r, DT_CENTER);//Выведен текст GetTextMetrics(hdc, &tm); r.left = 0;//Задание координат прямоугольника, в который r.top = 50;//будет выводиться текст заголовка r.right = 600; r.bottom = r.top + tm.tmHeight; DrawText(hdc, two, strlen(two), &r, DT_CENTER);//Выведен текст GetTextMetrics(hdc, &tm); r.left = 0;//Задание координат прямоугольника, в который r.top = 70;//будет выводиться текст заголовка r.right = 600; r.bottom = r.top + tm.tmHeight; DrawText(hdc, three, strlen(three), &r, DT_CENTER);//Выведен текст GetTextMetrics(hdc, &tm); r.left = 0;//Задание координат прямоугольника, в который r.top = 90;//будет выводиться текст заголовка r.right = 600; r.bottom = r.top + tm.tmHeight; DrawText(hdc, four, strlen(four), &r, DT_CENTER);//Выведен текст GetTextMetrics(hdc, &tm); r.left = 0;//Задание координат прямоугольника, в который r.top = 150;//будет выводиться текст заголовка r.right = 600; r.bottom = r.top + tm.tmHeight; DrawText(hdc, five, strlen(five), &r, DT_CENTER); GetTextMetrics(hdc, &tm); r.left = 0;//Задание координат прямоугольника, в который r.top = 170;//будет выводиться текст заголовка r.right = 600; r.bottom = r.top + tm.tmHeight; DrawText(hdc, six, strlen(six), &r, DT_CENTER); SelectFont(hdc, hFont1);//Выберем шрифт 1 SetTextColor(hdc, RGB(0, 0, 0));//Установим черный цвет GetTextMetrics(hdc, &tm); r.left = 0;//Задание координат прямоугольника, в который r.top = 210;//будет выводиться текст заголовка r.right = 600; r.bottom = r.top + tm.tmHeight; DrawText(hdc, seven, strlen(seven), &r, DT_CENTER); SetTextColor(hdc, RGB(141, 2, 31));//Установим бардовый цвет GetTextMetrics(hdc, &tm); SelectFont(hdc, hFont2);//Выберем шрифт 2 r.left = 0;//Задание координат прямоугольника, в который r.top = 240;//будет выводиться текст заголовка r.right = 600; r.bottom = r.top + tm.tmHeight; DrawText(hdc, eight, strlen(eight), &r, DT_CENTER); } } EndPaint(hwnd, &ps);//Освобождение контекста устройства }