Почему нельзя просто вывести данные в произвольном месте программы? Современные операционные системы, как правило, являются многозадачными, что означает возможность одновременной работы нескольких программ. Допустим, Вы отобразили в окне программы какой-то рисунок, потом окно частично перекрывается другим окном или полностью исчезает с экрана. Затем через некоторое время верхнее окно сдвигается. Казалось бы, операционная система должна самостоятельно восстановить пропавшую часть изображения. Увы, но это не так.
Существует взаимодействие «документ – вид», используемое при графических построениях с помощью электронных устройств. Документ представляет некие данные, невидимые для пользователя, хранимые в памяти компьютера, которые пользователь может редактировать, загружать и сохранять, используя диск. С другой стороны вид – временные данные, которые связаны с документом, и которые пользователь ассоциирует с ним. Например, текстовый документ программы «Блокнот» – массив байт, каждый байт представляет один символ, хранимый в оперативной памяти. Видом этого документа является графическое изображение на экране монитора с помощью шрифта определенного типа, размера, цвета и т.д. Вид можно всегда восстановить по данным документа, используя предопределенный программистом алгоритм, что и осуществляется при обработке сообщения WM_PAINT.
Функция BeginPaint возвращает контекст отображения для окна hWnd:
HDC WINAPI BeginPaint( HWND hWnd, PAINTSTRUCT FAR *lpps);
Перед этим функция подготавливает окно для рисования, заполняя структуру PAINTSTRUCT информацией, которую можно использовать в процессе рисования.
Контекст отображения, полученный с помощью функции BeginPaint, необходимо освободить перед завершением обработки сообщения WM_PAINT, вызвав функцию EndPaint с теми же параметрами:
void WINAPI EndPaint( HWND hWnd, PAINTSTRUCT FAR *lpps);
Функции BeginPaint и EndPaint можно использовать только внутри обработчика сообщения WM_PAINT. Если требуется рисовать при обработке других сообщений, получить контекст отображения можно с помощью функции GetDC() и освободить функцией ReleaseDC();
Функция GetDC возвращает контекст отображения для окна с идентификатором hwnd:
HDC WINAPI GetDC( HWND hWnd );
Функция ReleaseDC освобождает контекст изображения hdc, полученный для окна hwnd:
int WINAPI ReleaseDC( HWND hwnd, HDC hdc );
Каждый раз, когда приложение получает общий контекст отображения, его атрибуты получают значения по-умолчанию: белая кисть для заполнения фигур, черное перо для рисования линий и т.п. Если перед выполнением рисования приложение изменит атрибуты контекста отображения, вызвав соответствующие функции GDI, в следующий раз при получении значений эти атрибуты вновь примут значения по-умолчанию. Поэтому установка атрибутов должна выполняться каждый раз после получения общего контекста отображения.
Итак, данные в программе определяются следующим образом: