Лабораторная работа № 2
Работа с графикой
Задание: Написать программу для вывода на экран рисунка по варианту.
Теоретический материал
Для вывода рисунка на экран необходимо создать особый проект.
«Проект Win32». В не автоматически сгенерируется код и подключаться библиотеки, необходимые для вывода элементов графики на экран.
Код большой, но в нем нудно найти функцию
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
И в ней один из кейсов метода switch:
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: добавьте любой код отрисовки...
EndPaint(hWnd, &ps);
break;
Вот между строками hdc = BeginPaint(hWnd, &ps) и EndPaint(hWnd, &ps); будем писать код прорисовки изображения
Пример выполнения лабораторной работы
Первый шаг, создадим кисть, зазадим ей цвет и выберем ее для рисования.
HBRUSH hBrush; //создаём кисть
hBrush = CreateSolidBrush(RGB(0, 0, 0));
SelectObject(hdc, hBrush);
Зададим фон
RECT rect;
GetClientRect(hWnd, &rect);
FillRect(hdc, &rect, hBrush);
В результате имеем такой код:
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
HBRUSH hBrush; //создаём кисть
hBrush = CreateSolidBrush(RGB(0, 0, 0));
SelectObject(hdc, hBrush);
RECT rect;
GetClientRect(hWnd, &rect);
FillRect(hdc, &rect, hBrush);
EndPaint(hWnd, &ps);
break;
И такую картинку при запуске:
Поиграясь со параметрами цветов в функции, задающей цвет кисти, получаем другую заливку
hBrush = CreateSolidBrush(RGB(5, 150, 20));
При описанных выше параметрах, получим следующий фон:
Теперь изучим другой способ рисования, без заливки, используя карандаш.
HPEN blackpen;
blackpen = CreatePen(PS_SOLID, 2, RGB(0, 0, 0)); //Задаем перо толщиной 2 пикселя
SelectObject(hdc, blackpen); //Выбираем перо
Задали карандаш, теперь отрисуем им прямоугольник.
Rectangle(hdc, 100, 100, 250, 170);
Здесь первые 2 числа – левый верхний угол, вторые два – правый нижний.
Выбрав кисть и вызвав функцию отриосвки прямоугольника, получим закрашенный прямоугольник
hBrush = CreateSolidBrush(RGB(120, 120, 120));
SelectObject(hdc, hBrush);
Rectangle(hdc, 100, 100, 310, 170);
И еще немного прямоугольников
SelectObject(hdc, blackpen);
Rectangle(hdc, 120, 120, 190, 170);
Rectangle(hdc, 220, 120, 290, 170);
SelectObject(hdc, hBrush);
Rectangle(hdc, 70, 170, 340, 230);
hBrush = CreateSolidBrush(RGB(0, 0, 0));
SelectObject(hdc, hBrush);
Rectangle(hdc, 85, 185, 325, 215);
Теперь как рисовать окружности
blackpen = CreatePen(PS_SOLID, 5, RGB(0, 0, 0));
SelectObject(hdc, blackpen);
Ellipse(hdc, 130, 130, 180, 170);
Получится окружность. Если нам нужна закрашенная, то выбираем кисть
HBRUSH colorBrush;
colorBrush = CreateSolidBrush(RGB(255, 0, 0));
SelectObject(hdc, colorBrush);
Ellipse(hdc, 130, 130, 180, 170);
И еще окружности:
colorBrush = CreateSolidBrush(RGB(255, 240, 0));
SelectObject(hdc, colorBrush);
Ellipse(hdc, 220, 120, 290, 170);
blackpen = CreatePen(PS_SOLID, 10, RGB(0, 0, 0));
SelectObject(hdc, blackpen);
Ellipse(hdc, 153, 148, 158, 153);
Ellipse(hdc, 250, 142, 258, 150);
blackpen = CreatePen(PS_SOLID, 5, RGB(0, 0, 0));
SelectObject(hdc, blackpen);
Ellipse(hdc, 130, 20, 180, 100);
Ellipse(hdc, 230, 20, 280, 100);
И последнее, отрисовка линий:
MoveToEx(hdc, 145, 40, 0);
LineTo(hdc, 165, 40);
Перемещаемся в точку (функция MoveToEx, первое и второе число) и рисуем линию до другой точки (LineTo).
Еще линии
MoveToEx(hdc, 245, 40, 0);
LineTo(hdc, 265, 40);
MoveToEx(hdc, 155, 40, 0);
LineTo(hdc, 155, 80);
MoveToEx(hdc, 255, 40, 0);
LineTo(hdc, 255, 80);
MoveToEx(hdc, 165, 110, 0);
LineTo(hdc, 205, 130);
MoveToEx(hdc, 245, 110, 0);
LineTo(hdc, 205, 130);
MoveToEx(hdc, 205, 110, 0);
LineTo(hdc, 205, 130);
Почти получился рисунок, остались последние штрихи:
blackpen = CreatePen(PS_SOLID, 2, RGB(0, 0, 0));
SelectObject(hdc, blackpen);
HBRUSH whiteBrush, blackBrush;
whiteBrush = CreateSolidBrush(RGB(255, 255, 255));
SelectObject(hdc, whiteBrush);
Rectangle(hdc, 175, 185, 195, 205);
Rectangle(hdc, 215, 185, 235, 205);
blackBrush = CreateSolidBrush(RGB(0, 0, 0));
SelectObject(hdc, blackBrush);
Ellipse(hdc, 190, 160, 220, 180);
В результате получаем «симпатичного» зайца-робота из «Ну, погоди!»
Полный код:
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
HBRUSH hBrush; //создаём кисть
hBrush = CreateSolidBrush(RGB(5, 150, 20));
SelectObject(hdc, hBrush);
RECT rect;
GetClientRect(hWnd, &rect);
FillRect(hdc, &rect, hBrush);
HPEN blackpen;
blackpen = CreatePen(PS_SOLID, 2, RGB(0, 0, 0)); //Задаем перо толщиной 2 пикселя
SelectObject(hdc, blackpen); //Выбираем перо
Rectangle(hdc, 100, 100, 250, 170);
hBrush = CreateSolidBrush(RGB(120, 120, 120));
SelectObject(hdc, hBrush);
Rectangle(hdc, 100, 100, 310, 170);
SelectObject(hdc, blackpen);
Rectangle(hdc, 120, 120, 190, 170);
Rectangle(hdc, 220, 120, 290, 170);
SelectObject(hdc, hBrush);
Rectangle(hdc, 70, 170, 340, 230);
hBrush = CreateSolidBrush(RGB(0, 0, 0));
SelectObject(hdc, hBrush);
Rectangle(hdc, 85, 185, 325, 215);
blackpen = CreatePen(PS_SOLID, 5, RGB(0, 0, 0));
SelectObject(hdc, blackpen);
Ellipse(hdc, 130, 130, 180, 170);
HBRUSH colorBrush;
colorBrush = CreateSolidBrush(RGB(255, 0, 0));
SelectObject(hdc, colorBrush);
Ellipse(hdc, 130, 130, 180, 170);
blackpen = CreatePen(PS_SOLID, 5, RGB(0, 0, 0));
SelectObject(hdc, blackpen);
Ellipse(hdc, 220, 120, 290, 170);
colorBrush = CreateSolidBrush(RGB(255, 240, 0));
SelectObject(hdc, colorBrush);
Ellipse(hdc, 220, 120, 290, 170);
blackpen = CreatePen(PS_SOLID, 10, RGB(0, 0, 0));
SelectObject(hdc, blackpen);
Ellipse(hdc, 153, 148, 158, 153);
Ellipse(hdc, 250, 142, 258, 150);
blackpen = CreatePen(PS_SOLID, 5, RGB(0, 0, 0));
SelectObject(hdc, blackpen);
Ellipse(hdc, 130, 20, 180, 100);
Ellipse(hdc, 230, 20, 280, 100);
MoveToEx(hdc, 145, 40, 0);
LineTo(hdc, 165, 40);
MoveToEx(hdc, 245, 40, 0);
LineTo(hdc, 265, 40);
MoveToEx(hdc, 155, 40, 0);
LineTo(hdc, 155, 80);
MoveToEx(hdc, 255, 40, 0);
LineTo(hdc, 255, 80);
MoveToEx(hdc, 165, 110, 0);
LineTo(hdc, 205, 130);
MoveToEx(hdc, 245, 110, 0);
LineTo(hdc, 205, 130);
MoveToEx(hdc, 205, 110, 0);
LineTo(hdc, 205, 130);
blackpen = CreatePen(PS_SOLID, 2, RGB(0, 0, 0));
SelectObject(hdc, blackpen);
HBRUSH whiteBrush, blackBrush;
whiteBrush = CreateSolidBrush(RGB(255, 255, 255));
SelectObject(hdc, whiteBrush);
Rectangle(hdc, 175, 185, 195, 205);
Rectangle(hdc, 215, 185, 235, 205);
blackBrush = CreateSolidBrush(RGB(0, 0, 0));
SelectObject(hdc, blackBrush);
Ellipse(hdc, 190, 160, 220, 180);
EndPaint(hWnd, &ps);
break;
Разбиение задач по вариантам
Вариант | Задание рисунок | Задание эмблема |
Варианты заданий на рисунок
Номер варианта | Рисунок | Номер варианта | Рисунок |
![]() | ![]() | ||
![]() | ![]() | ||
![]() | ![]() | ||
![]() | ![]() | ||
![]() | ![]() |
Варианты заданий на эмблемы
Обязательно с подписью
Номер варианта | Логотип по варианту | Номер варианта | Логотип по варианту |
![]() | ![]() | ||
![]() | ![]() | ||
![]() | ![]() | ||
![]() | ![]() | ||
![]() | ![]() |