Оценить:
 Рейтинг: 4.6

Программирование в Delphi. Трюки и эффекты

Год написания книги
2010
Теги
<< 1 ... 7 8 9 10 11 12 13 14 15 ... 42 >>
На страницу:
11 из 42
Настройки чтения
Размер шрифта
Высота строк
Поля

end;

В этом листинге подписано, какие операции предназначены для создания каких элементов итогового региона. В операциях участвуют семь регионов. Расположение используемых в операциях регионов показано на рис. 1.10.

Рис. 1.10. Элементарные регионы, используемые для получения формы, представленной на рис. 1.9

Использование шаблона

Предыдущий пример наглядно демонстрирует мощь функции CombineRgn при построении регионов сложной формы. Однако существует огромное количество предметов, контуры которых крайне сложно повторить, комбинируя простые регионы. Построение многоугольных регионов с большим количеством точек может в этом случае выручить, но ведь это крайне нудно и утомительно.

Если есть изображение предмета, контуры которого должны совпадать с контурами региона, то гораздо проще при построении региона обрабатывать само изображение, выбирая все точки, для которых выполняется определенное условие. Используемое изображение и будет тем шаблоном, по которому «вырезается» регион нужной формы.

Рассмотрим простейший пример: есть изображение, каждая точка которого должна попасть в результирующий регион, если ее цвет не совпадает с заданным цветом фона. При этом изображение анализируется по так называемым «скан-линиям», то есть построчно. Из подряд идущих точек не фонового цвета формируются прямоугольные регионы, которые объединяются с результирующим регионом. Пример возможного используемого шаблона приведен на рис. 1.11.

Рис. 1.11. Пример растрового изображения-шаблона

Код функции построения региона указанным способом приведен в листинге 1.19.

Листинг 1.19. Построение региона по шаблону

function RegionFromPicture(pict:TPicture; backcolor: TColor): HRGN;

var

rgn, resRgn: HRGN;

x, y, xFirst: Integer;

begin

resRgn:= CreateRectRgn(0, 0, 0, 0); //Результирующий регион

//Анализируем каждую скан-линию рисунка (по горизонтали)

for y:= 0 to pict.Height – 1 do

begin

x:= 0;

while x < pict.Width do

begin

if (pict.Bitmap.Canvas.Pixels[x, y] <> backcolor) then

begin

xFirst:= x;

Inc(x);

//Определим часть линии, окрашенной не цветом фона

while (x < pict.Width) and

(pict.Bitmap.Canvas.Pixels[x, y] <> backcolor) do Inc(x);

//Создаем регион для части скан-линии и добавляем его к

//результирующему региону

rgn:= CreateRectRgn(xFirst, y, x–1, y+1);

CombineRgn(resRgn, resRgn, rgn, RGN_OR);

DeleteObject(rgn);

end;

Inc(x);

end;

end;

RegionFromPicture:= resRgn;

end;

Загрузка изображения-шаблона и создание региона могут происходить, например, при создании формы (листинг 1.20).

Листинг 1.20. Создание региона для области отсечения формы

procedure TfrmTemplate.FormCreate(Sender: TObject);

var

pict: TPicture;

begin

//Загрузка изображения и создание региона

//(считаем, что цвет фона – белый)

pict:= TPicture.Create;

pict.LoadFromFile('back.bmp');
<< 1 ... 7 8 9 10 11 12 13 14 15 ... 42 >>
На страницу:
11 из 42

Другие электронные книги автора Александр Анатольевич Чиртик