- •1. Сообщение wm_paint
- •2. Рисование графических примитивов
- •2.1. Создание кистей и перьев
- •2.2. Выбор объектов
- •2.3. Рисование прямоугольника
- •2.4. Рисование эллипса
- •2.5. Рисование линий
- •3. Обработка нажатий клавиш мыши
- •4. Обработка сообщений от клавиатуры
- •5.Порядок выполнения лабораторной работы
- •6. Контрольные вопросы
- •Приложение
Министерство образования и науки Российской Федерации
Казанский государственный технический университет
имени А.Н. Туполева
____________________________________________
Межкафедральный филиал факультета № 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.
Всю последовательность действий для отрисовки какой-либо графической фигуры или вывода текста в клиентскую область окна можно записать следующим образом:
Получение контекста клиентской области (функция BeginPaint в случае обработчика сообщения WM_PAINT и GetDC в остальных случаях).
Создание необходимых кистей (функция CreateSolidBrush) и перьев ( функция CreatePen) или задание цвета фона (функция SetBkColor) и цвета текста (функция SetTextColor)
Выбор необходимой кисти и пера для графической фигуры (функция SelectObject)
Рисование графической фигуры (Rectangle, Ellipse, MoveTo, LineTo и т.д.)или вывод текста (функция TextOut).
Освобождение контекста клиентской области (функция 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 определяет, будет ли стерт фон перед перерисовкой, если не равен нулю, то происходит стирание фона. Прямоугольник