Основы программирования ФИСТ 1 курс Власенко Олег Федосович
Запущенное win32 приложение!
Где в коде рисовать картинки?
Где в коде рисовать картинки? (2)
Точки в Декартовой системе координат
Экранная система координат
Рисуем линии
Рисуем эллипс
Оцифровка точек в координатной сетке
Рисуем много линий
Рисуем много линий
Рисуем много линий
Рисуем много линий
Такое разное перо
Такое разное перо (2)
Цветное перо
Цветное перо
Кисть
Кисть (2)
Кисть (3)
Очерчиваем клиентскую область
struct
Пример struct
struct и typedef
struct и typedef – пример (RECT)
Рисуем много линий из центра
Используем относительные координаты
Ромб
Ромб
Ромб
Относительные координаты
Относительные координаты
Относительные координаты
Относительные координаты
Относительные координаты
Отдельная функция для отрисовки ромба с заданным положением
Рисуем при помощи нашей функции несколько ромбов в ряд
Рисуем при помощи нашей функции несколько ромбов – используем цикл
Рисуем при помощи нашей функции несколько ромбов – при помощи цикла
Рисуем при помощи нашей функции несколько ромбов – при помощи цикла
Рисуем при помощи нашей функции несколько ромбов – при помощи цикла
Трассировка циклического алгоритма
Трассировка циклического алгоритма (2) Установка точки останова
Трассировка циклического алгоритма (3)
Трассировка циклического алгоритма (4)
Трассировка циклического алгоритма (5)
Трассировка циклического алгоритма (6) Запуск трассировки
Трассировка циклического алгоритма (7) (при)остановка в точке остановки
Трассировка циклического алгоритма (8) Пошаговая трассировка
Трассировка циклического алгоритма (9) Шаг сделан (F10)
Трассировка циклического алгоритма (10) Еще шаг сделан (F10)
Трассировка циклического алгоритма (11) Еще шаг сделан (F10)
Трассировка циклического алгоритма (12) Еще шаг сделан
Трассировка циклического алгоритма (13) Еще шаг сделан
Трассировка циклического алгоритма (14) Еще шаг сделан
Трассировка циклического алгоритма (15) Еще шаг сделан
Трассировка циклического алгоритма (16) Возобновить выполнение
Трассировка циклического алгоритма (17) Приложение работает!
Изменяем сразу и X и Y
вложенные циклы
вложенные циклы
Логотип Mercedes-Benz
Вспоминаем тригонометрию
Функция отрисовки упрощенного логотипа МерседесБенц
Тригонометрия и Мерседес-Бенц
Рисуем знак зодиака Мерседес-Бенц
Рисуем ряд знаков Мерседес-Бенц
Рисуем поле знаков Мерседес-Бенц
Вспоминаем тригонометрию
Рисуем окружность из знаков Мерседес-Бенц
Рисуем окружность из знаков Мерседес-Бенц
Рисуем окружность из знаков Мерседес-Бенц
Рисуем спираль из знаков Мерседес-Бенц
Рисуем спираль из знаков Мерседес-Бенц
Рисуем спираль из знаков Мерседес-Бенц
Домашнее задание
Источники информации
1.67M
Category: programmingprogramming

Знакомство с графикой в WinAPI: рисование линий, прямоугольников, эллипсов. Рисование рисунков по вычисленным координатам

1. Основы программирования ФИСТ 1 курс Власенко Олег Федосович

Лекция 2
Знакомство с графикой в WinAPI: рисование линий, прямоугольников,
эллипсов.
Рисование рисунков по вычисленным координатам.
Стили линий, стили заливки. Struct.
Относительные координаты. Функции. Вложенный цикл. Круг. Спираль

2. Запущенное win32 приложение!

3. Где в коде рисовать картинки?

Файл Win32Project1.cpp
Функция WndProc()

4. Где в коде рисовать картинки? (2)

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam,
LPARAM lParam)
{
switch (message)
{

case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
// TODO: Добавьте сюда любой код прорисовки, использующий HDC...
EndPaint(hWnd, &ps);
}
break;

default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}

5. Точки в Декартовой системе координат

6. Экранная система координат

7. Рисуем линии

case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
// Перемещаем "курсор" рисования линии в точку (x = 10, y = 30)
MoveToEx(hdc, 10, 30, NULL);
// Рисуем линию из текущей позиции курсора в точку (x = 10, y = 100)
// "Курсор" после отрисовки находится в новой точке (x = 10, y = 100)
LineTo(hdc, 10, 100);
// Рисуем линию от предыдущей точки (x = 10, y = 100) до точки (x = 150, y = 100)
LineTo(hdc, 150, 100);
// Рисуем линию от предыдущей точки (x = 150, y = 100) до точки (x = 10, y = 30)
LineTo(hdc, 10, 30);
EndPaint(hWnd, &ps);
}

8. Рисуем эллипс

case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
// Рисуем фиксированный прямоугольник
Rectangle(hdc, 10, 20, 120, 160);
// Рисуем эллипс, вписанный в прямоугольник
Ellipse(hdc, 10, 20, 120, 160);
EndPaint(hWnd, &ps);
}

9. Оцифровка точек в координатной сетке

10. Рисуем много линий

case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
int x1 = 10, y1 = 100;
int x2 = 300, y2 = 100;
int i = 0;
do {
MoveToEx(hdc, x1, y1, NULL);
LineTo(hdc, x2, y2);
y1 = y1 - 5;
y2 = y2 + 10;
i++;
} while (i < 16);
EndPaint(hWnd, &ps);
}

11. Рисуем много линий

case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
int x1 = 10, y1 = 100;
int x2 = 300, y2 = 100;
int i = 0;
do {
MoveToEx(hdc, x1, y1, NULL);
LineTo(hdc, x2, y2);
y1 = y1 - 5;
y2 = y2 + 10;
i++;
} while (i < 16);
EndPaint(hWnd, &ps);
}

12. Рисуем много линий

case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
int x1 = 10, y1 = 100;
int x2 = 300, y2 = 100;
int i = 0;
do {
MoveToEx(hdc, x1, y1, NULL);
LineTo(hdc, x2, y2);
y1 = y1 - 5;
y2 = y2 + 10;
i++;
} while (i < 16);
EndPaint(hWnd, &ps);
}

13. Рисуем много линий

case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
int x1 = 10, y1 = 100;
int x2 = 300, y2 = 100;
int i = 0;
do {
MoveToEx(hdc, x1, y1, NULL);
LineTo(hdc, x2, y2);
y1 = y1 - 5;
y2 = y2 + 10;
i++;
} while (i < 16);
EndPaint(hWnd, &ps);
}

14. Такое разное перо

case WM_PAINT: {
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
HPEN hPen;
hPen = CreatePen(PS_SOLID, 2, RGB(255, 0, 0));
SelectObject(hdc, hPen);
MoveToEx(hdc, 10, 10, NULL);
LineTo(hdc, 10, 110);
hPen = CreatePen(PS_SOLID, 5, RGB(255, 128, 0));
SelectObject(hdc, hPen);
LineTo(hdc, 110, 60);
hPen = CreatePen(PS_SOLID, 10, RGB(255, 128, 128));
SelectObject(hdc, hPen);
LineTo(hdc, 10, 10);

15. Такое разное перо (2)

hPen = CreatePen(PS_DASH, 1, RGB(255, 0, 0));
SelectObject(hdc, hPen);
MoveToEx(hdc, 110, 10, NULL);
LineTo(hdc, 110, 110);
hPen = CreatePen(PS_DOT, 1, RGB(0, 255, 0));
SelectObject(hdc, hPen);
LineTo(hdc, 160, 60);
hPen = CreatePen(PS_DASHDOTDOT, 1, RGB(0, 0, 255));
SelectObject(hdc, hPen);
LineTo(hdc, 110, 10);
DeleteObject(hPen);
EndPaint(hWnd, &ps);
}

16. Цветное перо

case WM_PAINT: {
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
HPEN hPen;
int x = 10;
int r = 0;
do {
hPen = CreatePen(PS_SOLID, 1, RGB(r, 0, 0));
SelectObject(hdc, hPen);
MoveToEx(hdc, x, 10, NULL);
LineTo(hdc, x, 110);
DeleteObject(hPen);
x += 1;
r += 2;
} while (x <= 125);
EndPaint(hWnd, &ps);
}

17. Цветное перо

case WM_PAINT: {
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
HPEN hPen;
int x = 10;
int r = 0;
do {
hPen = CreatePen(PS_SOLID, 1, RGB(r, r, r));
SelectObject(hdc, hPen);
MoveToEx(hdc, x, 10, NULL);
LineTo(hdc, x, 110);
DeleteObject(hPen);
x += 1;
r += 2;
} while (x <= 125);
EndPaint(hWnd, &ps);
}

18. Кисть

case WM_PAINT: {
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
HBRUSH hBrush;
hBrush = CreateSolidBrush(RGB(0, 0, 255));
SelectObject(hdc, hBrush);
RECT rect = { 10, 3, 100, 130 };
FillRect(hdc, &rect, hBrush);
// СЛЕДУЮЩИЙ КОД ВСТАВИТЬ СЮДА!!!
EndPaint(hWnd, &ps);
}

19. Кисть (2)

hBrush = CreateHatchBrush(HS_HORIZONTAL, RGB(0, 0, 255));
SelectObject(hdc, hBrush);
RECT rect2 = { 50, 50, 120, 120 };
FillRect(hdc, &rect2, hBrush);

20. Кисть (3)

hBrush = CreateHatchBrush(HS_CROSS, RGB(128, 0, 128));
SelectObject(hdc, hBrush);
HPEN hPen;
hPen = CreatePen(PS_SOLID, 5, RGB(128, 0, 128));
SelectObject(hdc, hPen);
Ellipse( hdc, 70, 10, 170, 100);
DeleteObject(hBrush);

21. Очерчиваем клиентскую область

case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
// RECT - Структура, в которой хранятся параметры прямоугольника
RECT rect;
//Определяем размер клиентской области окна
GetClientRect(hWnd, &rect);
// Рисуем прямоугольник по границам клиентской области окна
Rectangle(hdc, rect.left, rect.top, rect.right, rect.bottom);
EndPaint(hWnd, &ps);
}

22. struct

В языке Си, структура (struct) — композитный тип данных,
инкапсулирующий без сокрытия набор значений различных типов.
(https://ru.wikipedia.org/wiki/%D0%A1%D1%82%D1%80%D1%83%D0%BA%
D1%82%D1%83%D1%80%D0%B0_%28%D1%8F%D0%B7%D1%8B%D0%BA_%
D0%A1%D0%B8%29 )
Структура — это агрегатный тип данных. Она может содержать в себе
разнотипные элементы. (http://cppstudio.com/post/5377/ )
// определение структуры
struct str_name
{
int
member_1;
float
member_2;
char
member_3[256];
};
// объявление переменной-структуры
struct str_name struct0;

23. Пример struct

struct tagRECT // определение структуры tagRECT
{
LONG left; // поле left
LONG top;
LONG right;
LONG bottom;
};
int main()
{
struct tagRECT rect; // объявили переменную-структуру
rect.left = 10; // поле left получило значение «10»
rect.top = 20;
rect.right = 200;
rect.bottom = 300;
}

24. struct и typedef

typedef struct name
{
type atrib1;
type atrib2;
// остальные элементы структуры...
} newStructName structVar1;
struct name structVar3;
newStructName structVar2;

25. struct и typedef – пример (RECT)

// windef.h
typedef struct tagRECT
{
LONG left;
LONG top;
LONG right;
LONG bottom;
} RECT, *PRECT, NEAR *NPRECT, FAR *LPRECT;

// Win32Project1.cpp:
// RECT - Структура, в которой хранятся параметры прямоугольника
RECT rect; // struct tagRECT rect;
//Определяем размер клиентской области окна
GetClientRect(hWnd, &rect);
// Рисуем прямоугольник по границам клиентской области окна
Rectangle(hdc, rect.left, rect.top, rect.right, rect.bottom);

26. Рисуем много линий из центра

case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
RECT rect;
GetClientRect(hWnd, &rect);
int cx = rect.right / 2;
int cy = rect.bottom / 2;
int x = 0;
do {
MoveToEx(hdc, cx, cy, NULL);
LineTo(hdc, x, 5);
x += 20;
} while (x < rect.right);
EndPaint(hWnd, &ps);
}

27. Используем относительные координаты

28. Ромб

// Рисуем ромб
MoveToEx(hdc, 80, 0, NULL);
LineTo(hdc, 50, 50);
LineTo(hdc, 80, 100);
LineTo(hdc, 110, 50);
LineTo(hdc, 80, 0);

29. Ромб

// Рисуем ромб
MoveToEx(hdc, 80, 0, NULL);
LineTo(hdc, 50, 50);
LineTo(hdc, 80, 100);
LineTo(hdc, 110, 50);
LineTo(hdc, 80, 0);

30. Ромб

HPEN hPen;
hPen = CreatePen(PS_SOLID, 3, RGB(0, 0, 0));
SelectObject(hdc, hPen);
// Рисуем ромб
MoveToEx(hdc, 80, 0, NULL);
LineTo(hdc, 50, 50);
LineTo(hdc, 80, 100);
LineTo(hdc, 110, 50);
LineTo(hdc, 80, 0);

31. Относительные координаты

int x = 50;
int y = 0;
MoveToEx(hdc, x + 30, y, NULL);
LineTo(hdc, x, y + 50);
LineTo(hdc, x + 30, y + 100);
LineTo(hdc, x + 60, y + 50);
LineTo(hdc, x + 30, y);

32. Относительные координаты

int x = 50;
int y = 0;
MoveToEx(hdc, x + 30, y, NULL);
LineTo(hdc, x, y + 50);
LineTo(hdc, x + 30, y + 100);
LineTo(hdc, x + 60, y + 50);
LineTo(hdc, x + 30, y);

33. Относительные координаты

int x = 100;
int y = 100;
MoveToEx(hdc, x + 30, y, NULL);
LineTo(hdc, x, y + 50);
LineTo(hdc, x + 30, y + 100);
LineTo(hdc, x + 60, y + 50);
LineTo(hdc, x + 30, y);
int x = 150;
int y = 20;
MoveToEx(hdc, x + 30, y, NULL);
LineTo(hdc, x, y + 50);
LineTo(hdc, x + 30, y + 100);
LineTo(hdc, x + 60, y + 50);
LineTo(hdc, x + 30, y);

34. Относительные координаты

int x = 100;
int y = 100;
MoveToEx(hdc, x + 30, y, NULL);
LineTo(hdc, x, y + 50);
LineTo(hdc, x + 30, y + 100);
LineTo(hdc, x + 60, y + 50);
LineTo(hdc, x + 30, y);
int x = 150;
int y = 20;
MoveToEx(hdc, x + 30, y, NULL);
LineTo(hdc, x, y + 50);
LineTo(hdc, x + 30, y + 100);
LineTo(hdc, x + 60, y + 50);
LineTo(hdc, x + 30, y);

35. Относительные координаты

36. Отдельная функция для отрисовки ромба с заданным положением

void Romb(HDC hdc, int x, int y) {
MoveToEx(hdc, x + 30, y, NULL);
LineTo(hdc, x, y + 50);
LineTo(hdc, x + 30, y + 100);
LineTo(hdc, x + 60, y + 50);
LineTo(hdc, x + 30, y);
}

HDC hdc = BeginPaint(hWnd, &ps);
HPEN hPen;
hPen = CreatePen(PS_SOLID, 3, RGB(0, 0, 0));
SelectObject(hdc, hPen);
Romb(hdc, 50, 0);

37. Рисуем при помощи нашей функции несколько ромбов в ряд


HDC hdc = BeginPaint(hWnd, &ps);
Romb(hdc, 10, 50);
Romb(hdc, 100, 50);
Romb(hdc, 190, 50);
Romb(hdc, 280, 50);

38. Рисуем при помощи нашей функции несколько ромбов – используем цикл


HPEN hPen;
hPen = CreatePen(PS_SOLID, 3, RGB(0, 0, 0));
SelectObject(hdc, hPen);
int x = 10;
int y = 50;
do {
Romb(hdc, x, y);
x += 90;
} while (x <= 280);

39. Рисуем при помощи нашей функции несколько ромбов – при помощи цикла


HPEN hPen;
hPen = CreatePen(PS_SOLID, 3, RGB(0, 0, 0));
SelectObject(hdc, hPen);
int x = 10;
int y = 50;
do {
Romb(hdc, x, y);
x += 10;
} while (x <= 280);

40. Рисуем при помощи нашей функции несколько ромбов – при помощи цикла


HPEN hPen;
hPen = CreatePen(PS_SOLID, 1, RGB(0, 0, 0));
SelectObject(hdc, hPen);
int x = 10;
int y = 50;
do {
Romb(hdc, x, y);
x += 4;
} while (x <= 280);

41. Рисуем при помощи нашей функции несколько ромбов – при помощи цикла


HPEN hPen;
hPen = CreatePen(PS_SOLID, 1, RGB(0, 0, 0));
SelectObject(hdc, hPen);
int x = 10;
int y = 50;
do {
Romb(hdc, x, y);
x += 1;
} while (x <= 280);…

42. Трассировка циклического алгоритма


HPEN hPen;
hPen = CreatePen(PS_SOLID, 3, RGB(0, 128, 0));
SelectObject(hdc, hPen);
int x = 10;
int y = 10;
do {
Romb(hdc, x, y);
y += 20;
} while (y <= 120);

43. Трассировка циклического алгоритма (2) Установка точки останова

44. Трассировка циклического алгоритма (3)

45. Трассировка циклического алгоритма (4)

46. Трассировка циклического алгоритма (5)

47. Трассировка циклического алгоритма (6) Запуск трассировки

48. Трассировка циклического алгоритма (7) (при)остановка в точке остановки

49. Трассировка циклического алгоритма (8) Пошаговая трассировка

50. Трассировка циклического алгоритма (9) Шаг сделан (F10)

51. Трассировка циклического алгоритма (10) Еще шаг сделан (F10)

52. Трассировка циклического алгоритма (11) Еще шаг сделан (F10)

53. Трассировка циклического алгоритма (12) Еще шаг сделан

54. Трассировка циклического алгоритма (13) Еще шаг сделан

55. Трассировка циклического алгоритма (14) Еще шаг сделан

56. Трассировка циклического алгоритма (15) Еще шаг сделан

57. Трассировка циклического алгоритма (16) Возобновить выполнение

58. Трассировка циклического алгоритма (17) Приложение работает!

59. Изменяем сразу и X и Y


int x = 10;
int y = 50;
do {
Romb(hdc, x, y);
x += 25;
y += 10;
} while (x <= 280);

60. вложенные циклы


int y = 50;
do {
int x = 10;
do {
Romb(hdc, x, y);
x += 25;
} while (x <= 280);
y += 110;
} while (y <= 280);

61. вложенные циклы


int y = 50;
do {
int x = 10;
do {
Romb(hdc, x, y);
x += 20;
} while (x <= 280);
y += 20;
} while (y <= 280);

62. Логотип Mercedes-Benz

63. Вспоминаем тригонометрию

Численные значения тригонометрических функций угла в
тригонометрической окружности с радиусом, равным
единице

64. Функция отрисовки упрощенного логотипа МерседесБенц

void MercedesBenz(HDC hdc, int x, int y) {
Ellipse(hdc, x, y, x + 50, y + 50);
MoveToEx(hdc, x + 25, y + 25, NULL);
LineTo(hdc, x + 25, y);
// R = 25
// sin 30 = 0,5
// cos 30 = 0,87
// R * sin 30 = 25 * 0,5 = 12
// R * cos 30 = 25 * 0,87 = 22
MoveToEx(hdc, x + 25, y + 25, NULL);
LineTo(hdc, x + 25 - 22, y + 25 + 12);
MoveToEx(hdc, x + 25, y + 25, NULL);
LineTo(hdc, x + 25 + 22, y + 25 + 12);
}

65. Тригонометрия и Мерседес-Бенц

66. Рисуем знак зодиака Мерседес-Бенц

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam,
LPARAM lParam)
{
switch (message)
{
...
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
MercedesBenz(hdc, 10, 20);
EndPaint(hWnd, &ps);
}
break;
...
}
}

67. Рисуем ряд знаков Мерседес-Бенц


int x = 10;
do {
MercedesBenz(hdc, x, 20);
x += 52;
} while (x <= 280);

68. Рисуем поле знаков Мерседес-Бенц

int y = 10;
do {
int x = 10;
do {
MercedesBenz(hdc, x, y);
x += 52;
} while (x <= 280);
y += 52;
} while (y <= 270);

69. Вспоминаем тригонометрию

Численные значения тригонометрических функций угла в
тригонометрической окружности с радиусом, равным
единице

70. Рисуем окружность из знаков Мерседес-Бенц


#define _USE_MATH_DEFINES
#include <math.h>

double alpha = 0;
int R = 100;
int cx = 120;
int cy = 100;
do {
int x = cx + R * cos(alpha);
int y = cy + R * sin(alpha);
MercedesBenz(hdc, x, y);
alpha += M_PI / 6;
} while (alpha <= M_PI / 2);

71. Рисуем окружность из знаков Мерседес-Бенц


#define _USE_MATH_DEFINES
#include <math.h>

double alpha = 0;
int R = 100;
int cx = 120;
int cy = 100;
do {
int x = cx + R * cos(alpha);
int y = cy + R * sin(alpha);
MercedesBenz(hdc, x, y);
alpha += M_PI / 6;
} while (alpha <= 2 * M_PI);

72. Рисуем окружность из знаков Мерседес-Бенц


#define _USE_MATH_DEFINES
#include <math.h>

double alpha = 0;
int R = 100;
int cx = 120;
int cy = 100;
do {
int x = cx + R * cos(alpha);
int y = cy + R * sin(alpha);
MercedesBenz(hdc, x, y);
alpha += M_PI / 16;
} while (alpha <= 2 * M_PI);

73. Рисуем спираль из знаков Мерседес-Бенц


double alpha = 0;
int R = 0;
int cx = 120;
int cy = 100;
do {
int x = cx + R * cos(alpha);
int y = cy + R * sin(alpha);
MercedesBenz(hdc, x, y);
alpha += M_PI / 16;
R += 4;
} while (alpha <= 2 * M_PI);

74. Рисуем спираль из знаков Мерседес-Бенц


double alpha = 0;
int R = 0;
int cx = 120;
int cy = 100;
do {
int x = cx + R * cos(alpha);
int y = cy + R * sin(alpha);
MercedesBenz(hdc, x, y);
alpha += M_PI / 16;
R += 4;
} while (alpha <= 2.5 * M_PI);

75. Рисуем спираль из знаков Мерседес-Бенц

76. Домашнее задание

1. Нарисовать логотип любимой марки
автомобиля (не Мерседес!)
2. Создать функцию для отрисовки логотипа
любимой марки автомобиля
3. Логотипами автомобиля нарисовать
спираль (по аналогии с лекцией и знаком
мерседеса)

77. Источники информации

• КАК рисовать в Win32 API? http://radiofront.narod.ru/htm/prog/htm/win
da/api/paint.html
English     Русский Rules