Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CП.docx
Скачиваний:
9
Добавлен:
30.10.2018
Размер:
824 Кб
Скачать
☆

24. Інтерфейс графічних пристроїв gdi. Обробка повідомлень wm_paint.

Интерфейс графических устройств (Graphics Device Interface – GDI) системы открывает доступ к большому количеству функций вывода. Приложения, обращаясь к функциям GDI, работают не с физическими устройствами, а с логическими. То есть описание вызова функций не зависит от физического способа отображения. GDI передает указания о выводе драйверу устройства вывода. Драйвер работает непосредственно с физическим устройством и при управлении выводом учитывает его ограниченные возможности и аппаратные особенности. Благодаря этому приложения способны работать с любым устройством вывода, драйвер которого установлен в системе.

Параметры вывода устанавливают в контексте отображения с помощью функций GDI. Контекст отображения – это структура данных, которая содержит характеристики устройства вывода и указатели на выбранные инструменты рисования. Функции GDI используют только выбранные в контекст отображения параметры и инструменты рисования. Например, для рисования линии некоторой толщины приложение должно выбрать перо этой толщины. Дескриптор контекста отображения объявляется обычно следующим образом:

HDC hdc;

Система Windows является многозадачной операционной системой и, сле­довательно, на экране монитора могут одновременно присутствовать не­сколько окон связанных с различными приложениями. Окна могут менять размер и положение на экране, перекрывать друг друга, сворачиваться в иконку и разворачиваться на весь экран. В этих случаях изменяется клиент­ская область окна и часто возникает необходимость перерисовки изображе­ния в клиентской области. При возникновении необходимости перерисовки клиентской области окна система посылает сообщение WM_PAINT и прило­жение само должно заниматься перерисовкой.

Обработка сообщения WM_PAINT в оконной функции

case WM_PAINT:

PAINTSTRUCT ps;

начинается с получения контекста устройства окна приложения:

HDC hdc = BeginPaint (hwnd, &ps);

функция BeginPaint, кроме возвращения дескриптора контекста устройства в качестве своего значения, обнуляет недействительную область окна (аналогично ValidateRect (hwnd, NULL);) и заносит некоторую информацию об обновляемой области в струк­туру ps. В полученном контексте устройства область отсечения совпа­дает с недействительной областью, что позволяет избежать вывода информа­ции в ту часть клиентской области окна, которая в обновлении не нуждается.

Освобождаем контекст устройства

EndPaint (hwnd, &ps);

и завершаем обработку сообщения WM_PAINT

break;

Структура PAINTSTRUCT описана следующим образом:

typedef struct tagPAINTSTRUCT {

HDC hdc;

BOOL fErase;

RECT rcPaint;

BOOL fRestore;

BOOL fIncUpdate;

BYTE rgbReserved[32];

} PAINTSTRUCT, *PPAINTSTRUCT;

hdc – содержит дескриптор контекста отображения;

fErase – определяет необходимость стирания фона области обновления;

rcPaint – координаты прямоугольной области обновления;

Остальные поля зарезервированы для будущего использования.

Пример обработки сообщения WM_PAINT. В окно будет выведено синим цветом сообщение «Hello, world!».

PAINTSTRUCT ps;

HDC hdc;

switch (uMsg) {

case WM_PAINT:

hdc=BeginPaint(hWnd,&ps);

SetTextColor(hdc, RGB(0,0,200));

TextOut(hdc,10,20,”Hello, world!”,strlen(”Hello, world!”));

EndPaint(hWnd,&ps);

break;

}

25. Основи програмування мовою С++. Функції.

Наилучшим способом создания и поддержки больших программ является их конструирование из маленьких фрагментов, или модулей. Модули в C++ называются функциями или классами.

Функция – это именованная часть программы, которая может вызываться из других частей программы, а также из себя самой (рекурсия), столько раз, сколько необходимо. Функция в C++ необязательно возвращает значение, в таком случае она соответствует процедурам в некоторых других языках программирования (например, Паскаль).

Функция в C++ может быть объявлена и должна быть определена. Не объявлять функцию можно только в том случае, если она определена до её первого вызова из других функций.

Пример объявления функции:

int sum (int a, int b);

или

int sum (int, int);

Пример определения функции:

int sum (int a, int b) {

return a+b:

}

Необходимо заметить, что формальные параметры могут не указываться при объявлении функции (можно указывать только их тип), но при определении функции они обязательно должны указываться.

Фактические параметры – это значения, которые присваиваются формальным параметрам во время вызова функции. Например, для приведенного выше примера,

c = sum (3, 5);

3 и 5 – фактические параметры.

Можно объявить указатель на функцию. Причем, передаваемые параметры и возвращаемое значение при объявлении указателя должны соответствовать передаваемым параметрам и возвращаемому значению той функции, на которую мы хотим определить указатель.

int (*p_to_sum) (int, int);

В тексте программы через указатель функцию можно вызвать так:

p_to_sum=∑

c = (*p_to_sum) (3, 5);

Можно также определить ссылку на функцию.

Для этого сначала создается новый тип ссылки с соответствующими функции параметрами и возвращаемым значением:

typedef int REF (int, int);

Затем в тексте программы функция через ссылку вызывается так:

REF& ref_to_sum = sum;

ref_to_sum (3, 5);

Функция также может быть частью класса, тогда она называется методом класса.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]