Программирование устройств в Windows: Методические указания к выполнению практических и лабораторных работ по курсу “Операционные системы, среды и оболочки”, страница 7

Используйте BeginPaint для получения контекста устройства для обработчика сообщения WM_PAINT.Не вызывайте GetDC из обработчика сообщения WM_PAINT.Используйте GetDC, только когда  не отвечаете на сообщение WM_PAINT, но все же нуждаетесь в доступе к текущему контексту устройства.

EndPaint представляет собой столь же удобный способ завершения функции рисования, как BeginPaint . Сердцевина каждого ответа на сообщение WM PAINT должна быть заключена внутри этих двух процедур. Параметрами BeginPaint и EndPaint являются HWND и адрес PAINTSTRUCT.

Функции BeginPaint и EndPaint формируют своего рода оболочку для ядра программы рисования:

С помощью программы EasyText можно проверить два основных способа вывода текста в Windows-программе. Первый — TextOut, а второй — DrawText.

Функция TextOut наиболее проста в обращении. Ей требуются лишь контекст устройства, некоторые начальные координаты, строка и ее длина.

Функция более высокого уровня, DrawText, использует в качестве параметров контекст устройства, строку, длину строки, RECT и некоторые флажки. Если  передать в DrawText ASCIIZ-строку, то достаточно будет передать – 1 в качестве третьего параметра, чтобы заставить Windows вычислить длину этой строки. Параметр RECT определяет область, внутри которой будет выведена строка. В данном случае  используется функция GetClientRect, чтобы установить область всего рабочего окна, а затем передаются три флажка, которые приказывают Windows центрировать строку относительно RECT.

3.6 Нажатие клавиш и передвижения мыши

Рассмотрим функции нажатия клавиш на клавиатуре т.е. цели функции KeyMouse_OnChar и  как она обрабатывает сообщения WM_CHAR. В первую очередь функция KeyMouse_OnChar получает контекст устройства. Она делает это не путем вызова BeginPaint или EndPaint, а с помощью GetDC  и ReleaseDC. Вывод с помощью TextOut  использует контекст устройства. Для того чтобы понять разницу между вызовами GetDC и BeginPaint, нужно только перетащить окно другой программы поверх окна KeyMouse. Сообщение WM_PAINT посылается в окно всякий раз, когда открывается его часть, временно закрытая другим окном. Таким образом, заголовок и слова в левой части программы KeyMouse видимы, когда видимо окно. Однако любой текст, выводимый, скажем, функцией KeyMouse_OnChar, не будет перерисовываться вновь. Причина этого в том, что в метод KeyMouse_OnChar посылаются только сообщения WM_CHAR. Он ничего не знает о сообщении WM_PAINT и не обращает на него внимания. Важно понимать, что вывод, сделанный в ответ на сообщение WM_PAINT, всегда виден, когда видимо окно просто потому, что Windows гарантирует посылку сообщения WM_PAINT в нужный момент. Отвечая на сообщения WM_PAINT, надо использовать BeginPaint и EndPaint. Во всех остальных случаях следует использовать GetDC и ReleaseDC. Теперь, когда  понятна разница между BeginPaint и GetDC, можно рассмотреть сообщение WM_CHAR. Сообщения WM_CHAR посылаются в программу, как только пользователь нажимает одну из стандартных клавиш. То есть, если пользователь нажимает клавиши А или В, посылается сообщение WM_CHAR. Заметьте, что сообщения WM_CHAR не посылаются, когда пользователь нажимает функциональные клавиши или стрелки на цифровой части клавиатуры. Значение, ассоциированное с нажатием клавиши, посылается в функцию КеуMouse_OnChar в переменной ch, которая объявляется как беззнаковое целое. Иначе говоря, если пользователь нажимает клавишу А, ch устанавливается равным ASCII- значению 97, соответствующему букве "а". Если пользователь во время нажатия клавиши А держит клавишу Shift, то в переменную ch посылается ASCII-значение 65 (буква "А").