Delphi. Трюки и эффекты. Александр Чиртик
Чтение книги онлайн.

Читать онлайн книгу Delphi. Трюки и эффекты - Александр Чиртик страница 10

Название: Delphi. Трюки и эффекты

Автор: Александр Чиртик

Издательство:

Жанр: Программы

Серия:

isbn: 978-5-911-80219-6

isbn:

СКАЧАТЬ Элементарные регионы, используемые для получения формы на рис. 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');

      SetWindowRgn(Handle, RegionFromPicture(pict, RGB(255,255,255)),

      True);

      end;

      В листинге 1.20 подразумевается использование файла back.bmp, находящегося в той же папке, что и файл приложения. Цвет фона – белый. Таким образом, если шаблон, показанный на рис. 1.11, хранится в файле back. bmp, то получим форму, как на рис. 1.12.

СКАЧАТЬ