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

Читать онлайн.
Название Программирование в Delphi. Трюки и эффекты
Автор произведения Александр Чиртик
Жанр Программирование
Серия
Издательство Программирование
Год выпуска 2010
isbn 978-5-49807-118-3



Скачать книгу

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

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

      Рис. 1.12. Результат построения региона по шаблону

      Немного о перемещении окон

      Кроме придания необычного вида окнам способами, рассмотренными выше, можно также несколько разнообразить интерфейс за счет оригинального использования перемещения окон. Ниже показано, как можно самостоятельно назначать области, позволяющие перетаскивать форму. Еще один пример демонстрирует один из способов дать пользователю возможность самому определять расположение элементов управления на форме.

      Перемещение за клиентскую область

      Здесь на конкретном примере (перемещение формы за любую точку клиентской области) продемонстрировано, как можно самостоятельно определять положение некоторых важных элементов окна. Под элементами окна здесь подразумеваются:

      • строка заголовка (предназначена не только для отображения текста