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

Координаты Blt

Когда описывался синтаксис функции PatBlt, упоминалось, что точка (xDest, yDest) задает верхний левый угол прямоугольника, и этот прямоугольник имеет ширину xWidth и высоту yHeight единиц. Это не совсем корректно.

Только в функциях GDI BitBlt, PatBlt и StretchBlt логические координаты прямоугольника задаются в терминах логической ширины и высоты относительно одной вершины. Все другие функции GDI для рисования, использующие ограничивающий прямоугольник, требуют задания координат в терминах левого верхнего и правого нижнего углов. В режиме отображения MM_TEXT указанное описание параметров функции PatBlt верно.

Однако, для метрических режимов отображения — не верно. Если вы используете положительные значения xWidth и yHeight, то точка с координатами (xDest, yDest) должна быть левым нижним углом прямоугольника. Если вы хотите, чтобы точка (xDest, yDest) была левым верхним углом прямоугольника, то параметр yHeight должен быть установлен равным высоте прямоугольника, взятой со знаком минус.

Более точно, прямоугольник, с которым работает функция PatBlt, имеет логическую ширину, задаваемую абсолютным значением xWidth и логическую высоту, задаваемую абсолютным значением yHeight. Эти два параметра могут быть отрицательными. Прямоугольник определяется двумя углами, имеющими логические координаты (xDest, yDest) и (xDest + xWidth, yDest + yHeight). Верхний левый угол прямоугольника всегда включается в область, изменяемую функцией PatBlt. Правый нижний угол — всегда за ее пределами. В зависимости от режима отображения и знаков параметров xWidth и yHeight левым верхним углом прямоугольника может быть точка:

(xDest, yDest)

или

(xDest, yDest + yHeight)

или

(xDest + xWidth, yDest)

или

(xDest + xWidth, yDest + yHeight)

Если вы установите режим отображения MM_LOENGLISH и захотите использовать функцию PatBlt, изменяющую зону квадратного дюйма в левом верхнем углу рабочей области, вы можете использовать:

PatBlt(hdc, 0, 0, 100, -100, dwROP);

или

PatBlt(hdc, 0, -100, 100, 100, dwROP);

или

PatBlt(hdc, 100, 0, -100, -100, dwROP);

или

PatBlt(hdc, 100, -100, -100, 100, dwROP);

Простейший путь задать правильные параметры функции PatBlt — это установить xDest и yDest в левый верхний угол прямоугольника. Если ваш режим отображения определяет координату y так, что она возрастает при движении вверх, то используйте отрицательную величину параметра yHeight. Если ваш режим отображения определяет координату x так, что она возрастает при движении влево (что почти не встречается), то используйте отрицательную величину параметра xWidth.

4.10.6 Перенос битов с помощью функции BitBlt

В некотором смысле функция BitBlt — это расширенная функция PatBlt. Она делает все то же, что и PatBlt, а также вовлекает второй контекст устройства в логическую операцию. Ниже приведен синтаксис функции:

BitBlt(hdcDest, xDest, yDest, xWidth, yHeight, hdcSrc, xSrc, ySrc, dwROP);

Вызов функции BitBlt модифицирует приемный контекст устройства (его описатель hdcDst) в рамках прямоугольника, заданного логической точкой (xDesr, yDest) и параметрами xWidth и yHeight, заданными в логических единицах. Эти параметры определяют прямоугольник в соответствии с тем, как описано в предыдущем разделе. Функция BitBlt также использует прямоугольник из контекста устройства источника (описатель контекста hdcSrc). Этот прямоугольник начинается в логической точке (xSrc, ySrc) и имеет ширину xWidth логических единиц и высоту yHeight логических единиц.

Функция BitBlt осуществляет логическую операцию над тремя элементами: кистью, выбранной в контексте устройства приемника, пикселями прямоугольника в контексте устройства источника и пикселями прямоугольника в контексте устройства приемника. Результат заносится в прямоугольник приемного контекста устройства. Вы можете использовать любой из 256 ROP кодов в качестве параметра dwROP функции BitBlt. Пятнадцать ROP кодов, имеющих имена, приведены в следующей таблице.

Обратите внимание на ряды из восьми нулей и восьми единиц, которые являются результатами логических операций. Двузначное шестнадцатиричное число, соответствующее этим битам, есть старшее слово ROP кода.

Если вы используете один из 16-ти ROP кодов, приведенных в предыдущей таблице, то можно работать с функцией PatBlt вместо BitBlt, поскольку вы не обращаетесь к контексту устройства источника.

Вы можете сделать так, что hdcSrc и hdcDst будут описывать один и тот же контекст устройства. В этом случае функция BitBlt выполняет логическую операцию над приемным прямоугольником, исходным прямоугольником и текущей кистью, выбранной в контексте устройства. Однако, существует некоторая доля риска при выполнении этой операции с контекстом устройства рабочей области. Если часть исходного прямоугольника закрыта другим окном, то Windows будет использовать пиксели этого окна как исходные. Windows ничего не знает о том, что какое-либо окно закрывает часть рабочей области вашего окна.

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

Функция:

BitBlt(hdc, 100, 0, 50, 100, hdc, 0, 0, SRCCOPY);

копирует прямоугольник с вершиной в логической точке (0, 0), шириной 50 и высотой 100 логических единиц в прямоугольную область с вершиной в логической точке (100,0).

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