Windows приложение. Как работает? Обработка событий – клавиатура, мышь, таймер. Random. Лекция 8

Содержание

Слайд 2

Лабораторная работа №14 Работа с клавиатурой и мышью

Лабораторная работа №14

Работа с клавиатурой и мышью

Слайд 3

Задача 1. Управление через клавиатуру (0) Нужно создать новый проект Windows

Задача 1. Управление через клавиатуру (0)

Нужно создать новый проект Windows
Добавить

глобальные переменные image1_x и image1_y
Добавить отрисовку прямоугольника вокруг точки с координатами image1_x и image1_y
Добавить обработку события WM_KEYDOWN. В ней реализовать изменение image1_x при помощи клавиш VK_LEFT и VK_RIGHT, и изменение image1_y при помощи клавиш VK_DOWN и VK_UP.
Слайд 4

Задача 1. Управление через клавиатуру (1) Нужно создать новый проект Windows

Задача 1. Управление через клавиатуру (1)

Нужно создать новый проект Windows
Добавить глобальные

переменные image1_x и image1_y
Добавить отрисовку прямоугольника вокруг точки с координатами image1_x и image1_y
Добавить обработку события WM_KEYDOWN. В ней реализовать изменение image1_x при помощи клавиш VK_LEFT и VK_RIGHT, и изменение image1_y при помощи клавиш VK_DOWN и VK_UP.
Слайд 5

Задача 1. Управление через клавиатуру (2) Нужно создать новый проект Windows

Задача 1. Управление через клавиатуру (2)

Нужно создать новый проект Windows
Добавить глобальные

переменные image1_x и image1_y
Добавить отрисовку прямоугольника вокруг точки с координатами image1_x и image1_y
Добавить обработку события WM_KEYDOWN. В ней реализовать изменение image1_x при помощи клавиш VK_LEFT и VK_RIGHT, и изменение image1_y при помощи клавиш VK_DOWN и VK_UP.
Слайд 6

Задача 1. Управление через клавиатуру (2) Нужно создать новый проект Windows

Задача 1. Управление через клавиатуру (2)

Нужно создать новый проект Windows
Добавить глобальные

переменные image1_x и image1_y
Добавить отрисовку прямоугольника вокруг точки с координатами image1_x и image1_y
Добавить обработку события WM_KEYDOWN. В ней реализовать изменение image1_x при помощи клавиш VK_LEFT и VK_RIGHT, и изменение image1_y при помощи клавиш VK_DOWN и VK_UP.
Слайд 7

Задача 1. Управление через клавиатуру (3) Нужно создать новый проект Windows

Задача 1. Управление через клавиатуру (3)

Нужно создать новый проект Windows
Добавить глобальные

переменные image1_x и image1_y
Добавить отрисовку прямоугольника вокруг точки с координатами image1_x и image1_y
Добавить обработку события WM_KEYDOWN. В ней реализовать изменение image1_x при помощи клавиш VK_LEFT и VK_RIGHT, и изменение image1_y при помощи клавиш VK_DOWN и VK_UP.
Слайд 8

Задача 1. Управление через клавиатуру (3) Нужно создать новый проект Windows

Задача 1. Управление через клавиатуру (3)

Нужно создать новый проект Windows
Добавить глобальные

переменные image1_x и image1_y
Добавить отрисовку прямоугольника вокруг точки с координатами image1_x и image1_y
Добавить обработку события WM_KEYDOWN. В ней реализовать изменение image1_x при помощи клавиш VK_LEFT и VK_RIGHT, и изменение image1_y при помощи клавиш VK_DOWN и VK_UP.

case WM_KEYDOWN:
switch (wParam)
{
case VK_LEFT: // стрелка ВЛЕВО
image1_x -= 10;
InvalidateRect(hWnd, NULL, TRUE);
break;
case VK_RIGHT: // стрелка ВПРАВО
image1_x += 10;
InvalidateRect(hWnd, NULL, TRUE);
break;
}
break;

Слайд 9

Задача 1. Управление через клавиатуру (4) Нужно создать новый проект Windows

Задача 1. Управление через клавиатуру (4)

Нужно создать новый проект Windows
Добавить глобальные

переменные image1_x и image1_y
Добавить отрисовку прямоугольника вокруг точки с координатами image1_x и image1_y
Добавить обработку события WM_KEYDOWN. В ней реализовать изменение image1_x при помощи клавиш VK_LEFT и VK_RIGHT, и изменение image1_y при помощи клавиш VK_DOWN и VK_UP.
Слайд 10

Задача 1. Управление через клавиатуру (4) Нужно создать новый проект Windows

Задача 1. Управление через клавиатуру (4)

Нужно создать новый проект Windows
Добавить глобальные

переменные image1_x и image1_y
Добавить отрисовку прямоугольника вокруг точки с координатами image1_x и image1_y
Добавить обработку события WM_KEYDOWN. В ней реализовать изменение image1_x при помощи клавиш VK_LEFT и VK_RIGHT, и изменение image1_y при помощи клавиш VK_DOWN и VK_UP.


case VK_DOWN: // стрелка ВНИЗ
image1_y += 10;
InvalidateRect(hWnd, NULL, TRUE);
break;
case VK_UP: // стрелка ВВЕРХ
image1_y -= 10;
InvalidateRect(hWnd, NULL, TRUE);
break;

Слайд 11

Задача 2. Создание модуля В предыдущей лабораторной работе были создано несколько

Задача 2. Создание модуля

В предыдущей лабораторной работе были создано несколько

функций отрисовки изображений следующего вида void Image0(HDC hdc, int cx, int cy, COLORREF color)
Нужно собрать все эти функции в отдельном модуле и включить этот модуль в текущий проект.
Создать файл Images.cpp и перенести в него все реализованные вами функции вида void Image0(HDC hdc, int cx, int cy, COLORREF color)
Создать файл Images.h и перенести в него все заголовки функций
Файл Images.h включить посредством директивы #include в файл Images.cpp
Файл Images.h включить посредством директивы #include в основной файл проекта ( в примере это Lab14_Win.cpp)
Собрать и запустить проект – чтобы убедиться что все собрано корректно.
Заменить в коде Задачи 1 вызов Rectagle() на вызов Image0()
Слайд 12

Задача 2. Создание модуля (1) В предыдущей лабораторной работе были создано

Задача 2. Создание модуля (1)

В предыдущей лабораторной работе были создано

несколько функций отрисовки изображений следующего вида void Image0(HDC hdc, int cx, int cy, COLORREF color)
Нужно собрать все эти функции в отдельном модуле и включить этот модуль в текущий проект.
Создать файл Images.cpp и перенести в него все реализованные вами функции вида void Image0(HDC hdc, int cx, int cy, COLORREF color)
Создать файл Images.h и перенести в него все заголовки функций
Файл Images.h включить посредством директивы #include в файл Images.cpp
Файл Images.h включить посредством директивы #include в основной файл проекта ( в примере это Lab14_Win.cpp)
Собрать и запустить проект – чтобы убедиться что все собрано корректно.
Заменить в коде Задачи 1 вызов Rectagle() на вызов Image0()
Слайд 13

Задача 2. Создание модуля (2) В предыдущей лабораторной работе были создано

Задача 2. Создание модуля (2)

В предыдущей лабораторной работе были создано

несколько функций отрисовки изображений следующего вида void Image0(HDC hdc, int cx, int cy, COLORREF color)
Нужно собрать все эти функции в отдельном модуле и включить этот модуль в текущий проект.
Создать файл Images.cpp и перенести в него все реализованные вами функции вида void Image0(HDC hdc, int cx, int cy, COLORREF color)
Создать файл Images.h и перенести в него все заголовки функций
Файл Images.h включить посредством директивы #include в файл Images.cpp
Файл Images.h включить посредством директивы #include в основной файл проекта ( в примере это Lab14_Win.cpp)
Собрать и запустить проект – чтобы убедиться что все собрано корректно.
Заменить в коде Задачи 1 вызов Rectagle() на вызов Image0()
Слайд 14

Задача 2. Создание модуля (3) В предыдущей лабораторной работе были создано

Задача 2. Создание модуля (3)

В предыдущей лабораторной работе были создано

несколько функций отрисовки изображений следующего вида void Image0(HDC hdc, int cx, int cy, COLORREF color)
Нужно собрать все эти функции в отдельном модуле и включить этот модуль в текущий проект.
Создать файл Images.cpp и перенести в него все реализованные вами функции вида void Image0(HDC hdc, int cx, int cy, COLORREF color)
Создать файл Images.h и перенести в него все заголовки функций
Файл Images.h включить посредством директивы #include в файл Images.cpp
Файл Images.h включить посредством директивы #include в основной файл проекта ( в примере это Lab14_Win.cpp)
Собрать и запустить проект – чтобы убедиться что все собрано корректно.
Заменить в коде Задачи 1 вызов Rectagle() на вызов Image0()
Слайд 15

Задача 2. Создание модуля (4) В предыдущей лабораторной работе были создано

Задача 2. Создание модуля (4)

В предыдущей лабораторной работе были создано

несколько функций отрисовки изображений следующего вида void Image0(HDC hdc, int cx, int cy, COLORREF color)
Нужно собрать все эти функции в отдельном модуле и включить этот модуль в текущий проект.
Создать файл Images.cpp и перенести в него все реализованные вами функции вида void Image0(HDC hdc, int cx, int cy, COLORREF color)
Создать файл Images.h и перенести в него все заголовки функций
Файл Images.h включить посредством директивы #include в файл Images.cpp
Файл Images.h включить посредством директивы #include в основной файл проекта ( в примере это Lab14_Win.cpp)
Собрать и запустить проект – чтобы убедиться что все собрано корректно.
Заменить в коде Задачи 1 вызов Rectagle() на вызов Image0()
Слайд 16

Задача 2. Создание модуля (5) В предыдущей лабораторной работе были создано

Задача 2. Создание модуля (5)

В предыдущей лабораторной работе были создано

несколько функций отрисовки изображений следующего вида void Image0(HDC hdc, int cx, int cy, COLORREF color)
Нужно собрать все эти функции в отдельном модуле и включить этот модуль в текущий проект.
Создать файл Images.cpp и перенести в него все реализованные вами функции вида void Image0(HDC hdc, int cx, int cy, COLORREF color)
Создать файл Images.h и перенести в него все заголовки функций
Файл Images.h включить посредством директивы #include в файл Images.cpp
Файл Images.h включить посредством директивы #include в основной файл проекта ( в примере это Lab14_Win.cpp)
Собрать и запустить проект – чтобы убедиться что все собрано корректно.
Заменить в коде Задачи 1 вызов Rectagle() на вызов Image0(
Слайд 17

Задача 3. Выбор отображаемой фигуры Добавить возможность менять отображаемую фигуру –

Задача 3. Выбор отображаемой фигуры

Добавить возможность менять отображаемую фигуру – при

помощи нажатия пробела
Добавить глобальную переменную type в которой хранится номер отображаемой фигуры.
В обработку события WM_KEYDOWN добавить обработку клавиши пробела - VK_SPACE.
По нажатию пробела значение глобальной переменной type увеличивается на 1.
В обработку события WM_PAINT добавить логику выбора вызова функций Image0(), Image1(), Image2() и т.д. в зависимости от значения глобальной переменной type
Слайд 18

Задача 4. Управление мышкой При нажатии левой кнопки мышки перемещать отрисованную

Задача 4. Управление мышкой

При нажатии левой кнопки мышки перемещать отрисованную фигуру

в точку, где была нажата мышь
Добавить обработку события WM_LBUTTONDOWN.
Координаты мышки присвоить переменным image1_x и image1_y
Слайд 19

Задача 4. Управление мышкой (1) При нажатии левой кнопки мышки перемещать

Задача 4. Управление мышкой (1)

При нажатии левой кнопки мышки перемещать отрисованную

фигуру в точку, где была нажата мышь
Добавить обработку события WM_LBUTTONDOWN.
Координаты мышки присвоить переменным image1_x и image1_y
Слайд 20

Задача 4. Управление мышкой (2) При нажатии левой кнопки мышки перемещать

Задача 4. Управление мышкой (2)

При нажатии левой кнопки мышки перемещать отрисованную

фигуру в точку, где была нажата мышь
Добавить обработку события WM_LBUTTONDOWN.
Координаты мышки присвоить переменным image1_x и image1_y

case WM_LBUTTONDOWN:
WORD xPos, yPos;
// Сохраняем координаты курсора мыши
xPos = LOWORD(lParam);
yPos = HIWORD(lParam);
image1_x = xPos;
image1_y = yPos;
InvalidateRect(hWnd, NULL, TRUE);
break;

Слайд 21

Задача 5*. Изменяем количеством строк и столбцов При помощи клавиатуры увеличивается/уменьшается

Задача 5*. Изменяем количеством строк и столбцов

При помощи клавиатуры увеличивается/уменьшается количество

отрисованных строк/столбцов
Добавить глобальные переменные image1_n и image1_m в которых хранится количество строк и столбцов соответственно.
В обработку события WM_KEYDOWN добавить обработку клавиш I, O, U, N.
В обработку события WM_PAINT добавить циклы для отрисовки нескольких рядов и нескольких столбцов фигур.
Где найти коды клавиш:
«Операционная система Microsoft Windows 3.1 для программиста» https://www.frolov-lib.ru/books/bsp/v11/ch5_2.htm
Слайд 22

Домашнее задание по ЛР14 Доделать задачи 1-4. * Добавить возможность изменения

Домашнее задание по ЛР14

Доделать задачи 1-4.
* Добавить возможность изменения цвета отображаемых

фигур при помощи нажатия клавиш (конкретные клавиши и способ изменения цвета нужно выбрать самостоятельно).
Все ранее созданные картинки (во всех предыдущих лабораторных работах) собрать в один единый проект и организовать переключение картинок при помощи клавиатуры. (Например, нажимая на клавишу СТРЕЛКА_ВЛЕВО показывается предыдущая картинка, СТРЕЛКА_ВПРАВО – следующая картинка)
** Все картинки, созданные в предыдущих лабораторных работах поместить в отдельный модуль Pictures.cpp/Pictures.h.
Слайд 23

ИТОГО по ЛР14 Научились управлять программой через клавиатуру и мышь. Попробовали создавать модули в Си программе.

ИТОГО по ЛР14

Научились управлять программой через клавиатуру и мышь. Попробовали создавать

модули в Си программе.
Слайд 24

Слайд 25

ТЕОРЕТИЧЕСКИЙ БЛОК

ТЕОРЕТИЧЕСКИЙ БЛОК

Слайд 26

Компиляция программы на Си

Компиляция программы на Си

Слайд 27

Процесс компиляции «Процесс компиляции программ на C++» - https://habr.com/ru/post/478124/ 1) Препроцессинг

Процесс компиляции

«Процесс компиляции программ на C++» - https://habr.com/ru/post/478124/
1) Препроцессинг
Препроцессор —

это макро процессор, который преобразовывает вашу программу для дальнейшего компилирования. На данной стадии происходит происходит работа с препроцессорными директивами. Например, препроцессор добавляет хэдеры в код (#include), убирает комментирования, заменяет макросы (#define) их значениями, выбирает нужные куски кода в соответствии с условиями #if, #ifdef и #ifndef.
2) Компиляция
На данном шаге компилятор выполняет свою главную задачу — компилирует, то есть преобразует полученный на прошлом шаге код без директив в ассемблерный код. Это промежуточный шаг между высокоуровневым языком и машинным (бинарным) кодом.
3) Ассемблирование
Так как процессоры исполняют команды на бинарном коде, необходимо перевести ассемблерный код в машинный с помощью ассемблера. Ассемблер преобразовывает ассемблерный код в машинный код, сохраняя его в объектном файле.
4) Компоновка
Компоновщик (линкер) связывает все объектные файлы и статические библиотеки в единый исполняемый файл, который мы и сможем запустить в дальнейшем.
Слайд 28

Препроцессор «Директивы препроцессора в Си» - https://prog-cpp.ru/c-directives/ Препроцессор — это специальная

Препроцессор

«Директивы препроцессора в Си» - https://prog-cpp.ru/c-directives/
Препроцессор — это специальная программа,

являющаяся частью компилятора языка Си. Она предназначена для предварительной обработки текста программы. Препроцессор позволяет включать в текст программы файлы и вводить макроопределения.
Работа препроцессора осуществляется с помощью специальных директив (указаний). Они отмечаются знаком решетка #.
Слайд 29

#include Директива #include Директива #include позволяет включать в текст программы указанный

#include

Директива #include
Директива #include позволяет включать в текст программы указанный файл. Если

заголовочный файл содержит описание библиотечных функций и находится в папке компилятора, он заключается в угловые скобки <>.
Если файл находится в текущем каталоге проекта, он указывается в кавычках "". Для файла, находящегося в другом каталоге необходимо в кавычках указать полный путь.
#include
#include "func.c"
Слайд 30

#define (1) Директива #define Директива #define позволяет вводить в текст программы

#define (1)

Директива #define
Директива #define позволяет вводить в текст программы константы и

макроопределения.
Общая форма записи
#define Идентификатор Замена
Поля Идентификатор и Замена разделяются одним или несколькими пробелами.
Директива #define указывает компилятору, что нужно подставить строку, определенную аргументом Замена, вместо каждого аргумента Идентификатор в исходном файле. Идентификатор не заменяется, если он находится в комментарии, в строке или как часть более длинного идентификатора.
#include
#define A 3
int main()
{
printf("%d + %d = %d", A, A, A+A); // 3 + 3 = 6
return 0;
}
Слайд 31

#define (2) Вторая форма синтаксиса определяет макрос, подобный функции, с параметрами.

#define (2)

Вторая форма синтаксиса определяет макрос, подобный функции, с параметрами. Эта

форма допускает использование необязательного списка параметров, которые должны находиться в скобках. После определения макроса каждое последующее вхождение
идентификатор(аргумент1, ..., агрументn)
замещается версией аргумента замена, в которой вместо формальных аргументов подставлены фактические аргументы.
Пример на Си: Вычисление синуса угла
#include
#include
#include
#define PI 3.14159265
#define SIN(x) sin(PI*x/180)
int main()
{
int c;
system("chcp 1251");
system("cls");
printf("Введите угол в градусах: ");
scanf("%d", &c);
printf("sin(%d)=%lf", c, SIN(c));
getchar(); getchar();
return 0;
}
Слайд 32

Основные директивы препроцессора #include — вставляет текст из указанного файла #define

Основные директивы препроцессора

#include — вставляет текст из указанного файла
#define — задаёт

макроопределение (макрос) или символическую константу
#undef — отменяет предыдущее определение
#if — осуществляет условную компиляцию при истинности константного выражения
#ifdef — осуществляет условную компиляцию при определённости символической константы
#ifndef — осуществляет условную компиляцию при неопределённости символической константы
#else — ветка условной компиляции при ложности выражения
#elif — ветка условной компиляции, образуемая слиянием else и if
#endif — конец ветки условной компиляции
#line — препроцессор изменяет номер текущей строки и имя компилируемого файла
#error — выдача диагностического сообщения
#pragma — действие, зависящее от конкретной реализации компилятора.
Слайд 33

Создание модулей в Си

Создание модулей в Си

Слайд 34

1. Структура файлов Главный модуль: Main.c – главный файл – в

1. Структура файлов

Главный модуль:
Main.c – главный файл – в нем находится

функция main()
Модуль Unit:
Unit.c – файл, где находятся определения вызываемых функций
Unit.h – заголовочный файл, где находятся объявления функций
Слайд 35

2. Файл модуля (Unit.c) #include "Unit.h" int cnt = 0; void

2. Файл модуля (Unit.c)

#include "Unit.h"
int cnt = 0;
void unitF() {
printf("unitF() start!\n");
cnt++;
printf("unitF:cnt

= %d\n", cnt);
printf("unitF() finish!\n");
}
Слайд 36

3. Заголовочный файл (Unit.h) #pragma once void unitF(); extern int cnt;

3. Заголовочный файл (Unit.h)

#pragma once
void unitF();
extern int cnt;

Слайд 37

4. Главный файл (Main.c) #include #include "Unit.h" void main() { printf("main()

4. Главный файл (Main.c)

#include
#include "Unit.h"
void main() {
printf("main() start!\n");
printf("cnt = %d\n",

cnt);
unitF();
unitF();
unitF();
printf("main:cnt = %d\n", cnt);
printf("main() finish!\n");
}
Слайд 38

Слайд 39

Solution & Project в MS VS

Solution & Project в MS VS

Слайд 40

«Пустой проект»

«Пустой проект»

Слайд 41

Проект, созданный на основе «пустого»

Проект, созданный на основе «пустого»

Слайд 42

«Классическое приложение Windows»

«Классическое приложение Windows»

Слайд 43

Solution

Solution

Слайд 44

Слайд 45

Как работает Windows Application

Как работает Windows Application

Слайд 46

События Windows List Of Windows Messages - https://wiki.winehq.org/List_Of_Windows_Messages

События Windows

List Of Windows Messages - https://wiki.winehq.org/List_Of_Windows_Messages

Слайд 47

Как работает программа Windows (1) «Архитектура программ Windows» - http://netlib.narod.ru/library/book0031/ch02_01.htm Архитектура

Как работает программа Windows (1)

«Архитектура программ Windows» - http://netlib.narod.ru/library/book0031/ch02_01.htm
Архитектура программ

Windows
Если вы до Windows работали с другой операционной системой, такой как UNIX, Linux или DOS, новый стиль программирования может показаться несколько необычным. Сначала придется отказаться от функции main(), которая будет заменена функцией с именем WinMain(). Так же как в других операционных системах требовалось наличие функции main(), программам работающим в Windows необходима функция WinMain().
Работа, управляемая событиями
Следующее отличие программирования в Windows заключается в том, что программы для Windows управляются событиями. Это значит, что программа, вместо того, чтобы бежать за информацией, может бездельничать и ждать сообщений, поступающих ей через очередь сообщений. Все сообщения получает и обрабатывает обработчик сообщений (message handler). Элементы, обрабатываемые в обработчике сообщений обычно называются событиями (events).
Слайд 48

Как работает программа Windows (2)

Как работает программа Windows (2)

Слайд 49

Как устроен код автоматически сгенерированного Windows приложения

Как устроен код автоматически сгенерированного Windows приложения

Слайд 50

Код Windows приложения (1)

Код Windows приложения (1)

Слайд 51

Код Windows приложения (2)

Код Windows приложения (2)

Слайд 52

Код Windows приложения (3)

Код Windows приложения (3)

Слайд 53

Код Windows приложения (3.1) https://firststeps.ru/mfc/winapi/r.php?54

Код Windows приложения (3.1)

https://firststeps.ru/mfc/winapi/r.php?54

Слайд 54

Код Windows приложения (4)

Код Windows приложения (4)

Слайд 55

Код Windows приложения (5)

Код Windows приложения (5)

Слайд 56

Код Windows приложения (6)

Код Windows приложения (6)

Слайд 57

Код Windows приложения (7)

Код Windows приложения (7)

Слайд 58

Слайд 59

Лабораторная работа №15 Самодвижущиеся фигуры – таймер, случайные числа

Лабораторная работа №15

Самодвижущиеся фигуры – таймер, случайные числа

Слайд 60

Задача 0. Создать заготовку для ЛР15 Нужно создать новый проект Windows

Задача 0. Создать заготовку для ЛР15

Нужно создать новый проект Windows
Добавить

в этот проект модуль Images.cpp / Images.h созданный в предыдущей лабораторной работе.
Убедиться что все собирается и работает – на примере отрисовки Image0()
Слайд 61

Задача 1. Добавить самодвижущуюся фигуру Добавить в код определение структуры Image

Задача 1. Добавить самодвижущуюся фигуру

Добавить в код определение структуры Image
Добавить переменную

im1 имеющую тип struct Image
Задать переменной im1 положение фигуры (примерно) в центре окна, и задать ей перемещение вправо
Добавить таймер в программу
По таймеру изменять координаты фигуры и вызывать перерисовку фигуры
В обработчик WM_PAINT добавить код отрисовки фигуры Image0() по координатам заданным в im1
Слайд 62

Задача 1. Добавить самодвижущуюся фигуру (1) Добавить в код определение структуры

Задача 1. Добавить самодвижущуюся фигуру (1)

Добавить в код определение структуры Image
Добавить

переменную im1 имеющую тип struct Image
Задать переменной im1 положение фигуры (примерно) в центре окна, и задать ей перемещение вправо
Добавить таймер в программу
По таймеру изменять координаты фигуры и вызывать перерисовку фигуры
В обработчик WM_PAINT добавить код отрисовки фигуры Image0() по координатам заданным в im1
struct Image {
int x;
int y;
int vx;
int vy;
};
typedef struct Image IMAGE;
struct Image im1 = { 100, 200, 10, 0 };
Слайд 63

Задача 1. Добавить самодвижущуюся фигуру (2) Добавить в код определение структуры

Задача 1. Добавить самодвижущуюся фигуру (2)

Добавить в код определение структуры Image
Добавить

переменную im1 имеющую тип struct Image
Задать переменной im1 положение фигуры (примерно) в центре окна, и задать ей перемещение вправо
Добавить таймер в программу
По таймеру изменять координаты фигуры и вызывать перерисовку фигуры
В обработчик WM_PAINT добавить код отрисовки фигуры Image0() по координатам заданным в im1
case WM_CREATE:
SetTimer(hWnd, 1, 500, 0);
break;
Слайд 64

Задача 1. Добавить самодвижущуюся фигуру (3) Добавить в код определение структуры

Задача 1. Добавить самодвижущуюся фигуру (3)

Добавить в код определение структуры Image
Добавить

переменную im1 имеющую тип struct Image
Задать переменной im1 положение фигуры (примерно) в центре окна, и задать ей перемещение вправо
Добавить таймер в программу
По таймеру изменять координаты фигуры и вызывать перерисовку фигуры
В обработчик WM_PAINT добавить код отрисовки фигуры Image0() по координатам заданным в im1
case WM_TIMER:
im1.x += im1.vx;
im1.y += im1.vy;
InvalidateRect(hWnd, NULL, TRUE);
break;
Слайд 65

Задача 1. Добавить самодвижущуюся фигуру (4) Добавить в код определение структуры

Задача 1. Добавить самодвижущуюся фигуру (4)

Добавить в код определение структуры Image
Добавить

переменную im1 имеющую тип struct Image
Задать переменной im1 положение фигуры (примерно) в центре окна, и задать ей перемещение вправо
Добавить таймер в программу
По таймеру изменять координаты фигуры и вызывать перерисовку фигуры
В обработчик WM_PAINT добавить код отрисовки фигуры Image0() по координатам заданным в im1
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
Image0(hdc, im1.x, im1.y, RGB(128, 128, 0));
EndPaint(hWnd, &ps);
}
break;
Слайд 66

Задача 2. Добавить еще одну самодвижущуюся фигуру (1) Добавить переменную im2

Задача 2. Добавить еще одну самодвижущуюся фигуру (1)

Добавить переменную im2 имеющую

тип IMAGE
Задать переменной im2 положение фигуры (примерно) в правой части окна, и задать ей перемещение влево
В обработчик таймера добавить изменение координат фигуры im2
В обработчик WM_PAINT добавить код отрисовки фигуры Image1() по координатам заданным в im2
IMAGE im2 = { 400, 200, -10, 0 };
Слайд 67

Задача 2. Добавить еще одну самодвижущуюся фигуру (2) Добавить переменную im2

Задача 2. Добавить еще одну самодвижущуюся фигуру (2)

Добавить переменную im2 имеющую

тип IMAGE
Задать переменной im2 положение фигуры (примерно) в правой части окна, и задать ей перемещение влево
В обработчик таймера добавить изменение координат фигуры im2
В обработчик WM_PAINT добавить код отрисовки фигуры Image1() по координатам заданным в im2
case WM_TIMER:
im1.x += im1.vx;
im1.y += im1.vy;
im2.x += im2.vx;
im2.y += im2.vy;
InvalidateRect(hWnd, NULL, TRUE);
break;
Слайд 68

Задача 2. Добавить еще одну самодвижущуюся фигуру (3) Добавить переменную im2

Задача 2. Добавить еще одну самодвижущуюся фигуру (3)

Добавить переменную im2 имеющую

тип IMAGE
Задать переменной im2 положение фигуры (примерно) в правой части окна, и задать ей перемещение влево
В обработчик таймера добавить изменение координат фигуры im2
В обработчик WM_PAINT добавить код отрисовки фигуры Image1() по координатам заданным в im2
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
Image0(hdc, im1.x, im1.y, RGB(128, 128, 0));
Image1(hdc, im2.x, im2.y, RGB(128, 128, 0));
EndPaint(hWnd, &ps);
}
break;
Слайд 69

Задача 3. Добавить еще одну самодвижущуюся фигуру Добавить переменную im3 имеющую

Задача 3. Добавить еще одну самодвижущуюся фигуру

Добавить переменную im3 имеющую тип

IMAGE
Задать переменной im3 положение фигуры (примерно) в верхней части окна, и задать ей перемещение вниз
В обработчик таймера добавить изменение координат фигуры im3
В обработчик WM_PAINT добавить код отрисовки фигуры Image2() по координатам заданным в im3
Слайд 70

Задача 4. Добавить еще одну самодвижущуюся фигуру Добавить переменную im4 имеющую

Задача 4. Добавить еще одну самодвижущуюся фигуру

Добавить переменную im4 имеющую тип

IMAGE
Задать переменной im4 положение фигуры (примерно) в верхней части окна, и задать ей перемещение вниз
В обработчик таймера добавить изменение координат фигуры im4
В обработчик WM_PAINT добавить код отрисовки фигуры Image3() по координатам заданным в im4
Слайд 71

Задача 5. Случайное перемещение фигуры Добавить переменную im5 имеющую тип IMAGE

Задача 5. Случайное перемещение фигуры

Добавить переменную im5 имеющую тип IMAGE
Задать переменной

im5 положение фигуры (примерно) в центре окна, и задать ей перемещение 0,0 (стоит на месте)
В обработчик таймера добавить изменение координат фигуры im5 случайным образом
В обработчик WM_PAINT добавить код отрисовки фигуры Image4() по координатам заданным в im5
int dx5 = rand() % 10;
int dy5 = rand() % 21 - 10;
im5.x += dx5;
im5.y += dy5;
Слайд 72

Задача 6. Массив фигур Добавить переменную imA имеющую тип массив IMAGE

Задача 6. Массив фигур

Добавить переменную imA имеющую тип массив IMAGE
Задать всем

элементам массива imA координаты и направления перемещение
В обработчик таймера добавить изменение координат элементов массива imA
В обработчик WM_PAINT добавить код отрисовки всех элементов imA через вызов Image5()
Слайд 73

Задача 6. Массив фигур (1) Добавить переменную imA имеющую тип массив

Задача 6. Массив фигур (1)

Добавить переменную imA имеющую тип массив IMAGE
Задать

всем элементам массива imA координаты и направления перемещение
В обработчик таймера добавить изменение координат элементов массива imA
В обработчик WM_PAINT добавить код отрисовки всех элементов imA через вызов Image5()
Слайд 74

Задача 6. Массив фигур (2) Добавить переменную imA имеющую тип массив

Задача 6. Массив фигур (2)

Добавить переменную imA имеющую тип массив IMAGE
Задать

всем элементам массива imA координаты и направления перемещение
В обработчик таймера добавить изменение координат элементов массива imA
В обработчик WM_PAINT добавить код отрисовки всех элементов imA через вызов Image5()
Слайд 75

Задача 6. Массив фигур (3) Добавить переменную imA имеющую тип массив

Задача 6. Массив фигур (3)

Добавить переменную imA имеющую тип массив IMAGE
Задать

всем элементам массива imA координаты и направления перемещение
В обработчик таймера добавить изменение координат элементов массива imA
В обработчик WM_PAINT добавить код отрисовки всех элементов imA через вызов Image5()
Слайд 76

Слайд 77

Домашнее задание по ЛР15 Доделать задачи 1-6. Добавить еще один массив

Домашнее задание по ЛР15

Доделать задачи 1-6.
Добавить еще один массив фигур –

в количестве 20-100 штук.
Фигуры из этого массива перемещаются случайным образом.
3) * Добавить цвет к каждой фигуре.
4) ** Сделать так, чтобы фигуры сталкиваясь с краем окна разворачивались и двигались после столкновения в обратную сторону (от границы окна).
Слайд 78

ИТОГО по ЛР15 Познакомились с таймером. Применили массивы к отрисовке множества

ИТОГО по ЛР15

Познакомились с таймером.
Применили массивы к отрисовке множества объектов.
Познакомились с

генератором случайных чисел.
Слайд 79

ЛИТЕРАТУРА Где найти коды клавиш: «Операционная система Microsoft Windows 3.1 для программиста» https://www.frolov-lib.ru/books/bsp/v11/ch5_2.htm

ЛИТЕРАТУРА

Где найти коды клавиш:
«Операционная система Microsoft Windows 3.1 для программиста»
https://www.frolov-lib.ru/books/bsp/v11/ch5_2.htm