Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
WinAPI.docx
Скачиваний:
49
Добавлен:
16.12.2018
Размер:
3.43 Mб
Скачать

3.2.4 Получение описателя контекста устройства. Второй метод

Вы также можете получить описатель контекста устройства, если хотите рисовать в рабочей области при обработке отличных от WM_PAINT сообщений, или если вам необходим описатель контекста устройства для других целей, например, для получения информации о самом контексте устройства. Вызывайте GetDC для получения описателя контекста устройства и ReleaseDC, если он вам больше не нужен:

hdc=GetDC(hwnd);

[использование функций GDI]

ReleaseDC(hwnd, hdc);

Также как BeginPaint и EndPaint, функции GetDC и ReleaseDC следует вызывать парой. Если вы при обработке сообщения вызываете GetDC, то перед выходом из оконной процедуры необходимо вызвать ReleaseDC. Не вызывайте GetDC при обработке одного сообщения, а ReleaseDC при обработке другого.

В отличии от описателя контекста устройства, полученного из структуры PAINTSTRUCT, в описателе контекста устройства, возвращаемом функцией GetDC, определен отсекающий прямоугольник, равный всей рабочей области. Вы можете рисовать в любом месте рабочей области, а не только в недействительном прямоугольнике (если недействительный прямоугольник вообще определен). В отличии от BeginPaint, GetDC не делает действительными какие-либо недействительные зоны.

Как правило, вы будете использовать вызовы функций GetDC и ReleaseDC в ответ на сообщения от клавиатуры (например, в программах текстовых редакторов) или на сообщения от манипулятора мышь (например, в программах рисования). Они позволяют обновлять рабочую область непосредственно в ответ на пользовательский ввод информации с клавиатуры или с помощью мыши, при этом специально делать недействительной часть окна для выдачи сообщений WM_PAINT. Однако, в ваших программах должно содержаться достаточно информации для обновления экрана в любой момент, когда вы получаете сообщение WM_PAINT.

3.2.5 Функция TextOut. Подробности

Когда вы получаете описатель контекста устройства, Windows заполняет внутреннюю структуру контекста устройства задаваемыми по умолчанию значениями. Как вы увидите в следующих главах, эти задаваемые по умолчанию значения можно изменить с помощью функций GDI. Из тех функций GDI, которые нас интересуют прямо сейчас, рассмотрим TextOut:

TextOut(hdc, x, y, psString, iLength);

Давайте исследуем эту функцию более подробно.

Первый параметр — это описатель контекста устройства, являющийся возвращаемым значением либо функции GetDC, либо функции BeginPaint, полученный при обработке сообщения WM_PAINT.

Атрибуты контекста устройства управляют характеристиками выводимого на экран текста. Например, один атрибут контекста устройства задает цвет текста. Цвет, задаваемый по умолчанию — черный. Контекст устройства по умолчанию также определяет цвет фона — белый. Когда программа выводит текст на экран, Windows использует этот цвет фона для заполнения прямоугольной зоны вокруг каждого символа, эта зона называется знакоместом (character box).

Цвет фона текста не является цветом фона, который вы установили при определении класса окна. Фон в классе окна — это кисть, являющаяся шаблоном, которая может иметь, а может и не иметь чистый (без полутонов) цвет, и которую Windows использует для закрашивания рабочей области. Фон в классе окна не имеет отношения к структуре контекста устройства. При определении структуры класса окна в большинстве приложений Windows используется кисть WHITE_BRUSH, поэтому задаваемый по умолчанию в контексте устройства цвет фона оказывается таким же, как и цвет кисти, используемой Windows для закрашивания фона рабочей области.

Параметр psString — это указатель на символьную строку, а iLength — длина строки, т. е., число символов в строке. Строка не должна содержать никаких управляющих символов ASCII, таких как возврат каретки, перевод строки, табуляция или забой. Windows выводит такие управляющие символы в виде прямоугольников или закрашенных блоков. TextOut не определяет конца строки по нулевому символу, и поэтому для задания ее длины необходим параметр iLength.

Значения x и y в TextOut определяют точку начала строки текста внутри рабочей области. Значение x в горизонтальном направлении, значение y в вертикальном. Левый верхний угол первого символа строки имеет координаты (x, y). В контексте устройства по умолчанию исходной точкой отсчета (когда x и y равны 0) является левый верхний угол рабочей области. Если x и y в TextOut равны 0, строка текста начнет выводиться, начиная с левого верхнего угла рабочей области.

Координаты GDI в документации упоминаются как "логические координаты" (logical coordinates). Что именно это означает, мы более подробно изучим в следующей главе. Сейчас достаточно знать, что в Windows имеются различные "режимы отображения" (mapping mode), которые определяют, как логические координаты, заданные в функциях GDI, преобразуются в реальные физические координаты дисплея. Режим отображения определяется в контексте устройства. Задаваемый по умолчанию режим отображения называется MM_TEXT (идентификатор, заданный в заголовочных файлах Windows). В режиме отображения MM_TEXT логические единицы соответствуют физическим единицам, каковыми являются пиксели, задаваемые относительно левого верхнего угла рабочей области. Значения по координате x увеличиваются при движении вправо по рабочей области, а по y — при движении вниз. Система координат режима MM_TEXT эквивалентна системе координат, которую Windows использует для определения недействительного прямоугольника в структуре PAINTSTRUCT. Это очень удобно. (Однако это не относится к другим режимам отображения).

Контекст устройства также определяет "регион отсечения" (clipping region). Как вы уже узнали, задаваемый по умолчанию регион отсечения — это или вся рабочая область, если описатель контекста устройства получен из функции GetDC, или недействительный регион, если описатель контекста устройства получен из функции BeginPaint. Windows не выведет на экран ту часть строки символов, которая лежит вне региона отсечения. Если часть символа находится внутри отсекающей зоны, Windows выводит на экран только эту часть. Вывести что-нибудь за пределы рабочей области вашего окна очень непросто, поэтому не беспокойтесь о том, что это случится по невнимательности.

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