Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лаб3.doc
Скачиваний:
2
Добавлен:
12.11.2019
Размер:
116.22 Кб
Скачать

15

Министерство образования и науки Российской Федерации

Казанский государственный технический университет

имени А.Н. Туполева

____________________________________________

Межкафедральный филиал факультета № 4 в ОАО ICL-КПО ВС

Р.Ф. Миннибаев

Методическое руководство к

лабораторной работе

“ Работа с GDI – объектами.

Обработка нажатий на клавиши мыши и клавиатуры.”

по дисциплине “Системное программирование”

КАЗАНЬ 2004

СОДЕРЖАНИЕ

1. Сообщение WM_PAINT 3

2. Рисование графических примитивов 4

2.1. Создание кистей и перьев 4

2.2. Выбор объектов 5

2.3. Рисование прямоугольника 6

2.4. Рисование эллипса 6

2.5. Рисование линий 6

3. Обработка нажатий клавиш мыши 8

4. Обработка сообщений от клавиатуры 9

5.Порядок выполнения лабораторной работы 10

6. Контрольные вопросы 10

Приложение 11

1. Сообщение wm_paint

В Windows существует специальное сообщение WM_PAINT, которое посылается окну, когда его содержимое необходимо перерисовать. Это может происходить во многих случаях: при свертывании – развертывании окна, изменении размеров, перетаскивании и т.д. Программист может сам инициировать перерисовку, вызывая API-функцию:

BOOL InvalidateRect(

HWND hWnd, // дескриптор окна

CONST RECT *lpRect, // указатель на прямоугольник

BOOL bErase // флаг стирания фона

);

HWND hWnd – определяет окно, в котором необходимо перерисовать регион, если этот параметр равен NULL, то Windows перерисовывает все окна.

CONST RECT *lpRect – указывает на структуру RECT, которая содержит координаты клиентского прямоугольника, который будет перерисован Если этот параметр равен NULL, то перерисовывается вся клиентская область.

Структура RECT:

typedef struct _RECT { // rc

LONG left; // х координата верхнего левого угла прямоугольника

LONG top; // у координата верхнего левого угла прямоугольника

LONG right; // х координата нижнего правого угла прямоугольника

LONG bottom; // у координата нижнего правого угла прямоугольника

} RECT;

BOOL bErase – определяет будет ли стерт фон, перед перерисовкой окна. Если этот параметр равен TRUE, то фон будет стерт перед перерисовкой, если FALSE фон остается неизменным.

Возвращает ненулевое значение в случае успешного завершения и ноль в противном случае.

Итак, добавляем в нашу программу обработчик сообщения WM_PAINT.

Всю последовательность действий для отрисовки какой-либо графической фигуры или вывода текста в клиентскую область окна можно записать следующим образом:

  1. Получение контекста клиентской области (функция BeginPaint в случае обработчика сообщения WM_PAINT и GetDC в остальных случаях).

  2. Создание необходимых кистей (функция CreateSolidBrush) и перьев ( функция CreatePen) или задание цвета фона (функция SetBkColor) и цвета текста (функция SetTextColor)

  3. Выбор необходимой кисти и пера для графической фигуры (функция SelectObject)

  4. Рисование графической фигуры (Rectangle, Ellipse, MoveTo, LineTo и т.д.)или вывод текста (функция TextOut).

  5. Освобождение контекста клиентской области (функция EndPaint в случае обработчика сообщения WM_PAINT и ReleaseDC в остальных случаях)

Для того, чтобы нарисовать в клиентской области окна некую графическую фигуру или вывести текст, необходимо получить контекст устройства этой области. Для этого вызывается специальная функция BeginPaint:

HDC BeginPaint(

HWND hwnd, // дескриптор окна

LPPAINTSTRUCT lpPaint // указатель на структуру для информации о //перерисовке, выходной параметр

);

Функция BeginPaint возвращает дескриптор контекста клиентской области окна, который в дальнейшем будет использоваться при вызове графических функций, и NULL в том случае если контекст не доступен.

Структура PAINTSTRUCT

typedef struct tag PAINTSTRUCT { // ps

HDC hdc; // контекст устройства клиентской области

BOOL fErase; // флаг стирания фона

RECT rcPaint; // прямоугольник для перерисовки

BOOL fRestore; // зарезервирован для внутреннего использования Windows

BOOL fIncUpdate; // зарезервирован для внутреннего использования Windows

BYTE rgbReserved[32]; // зарезервирован для внутреннего использования Windows

} PAINTSTRUCT;

Флаг стирания фона fErase определяет, будет ли стерт фон перед перерисовкой, если не равен нулю, то происходит стирание фона. Прямоугольник