Нестандартная форма окна

Определение границы картинки

Выберите картинку и загрузите ее в PhotoShop. Чтобы получить при запуске программы на экране картинку неправильной формы (в PhotoShop она все равно прямоугольная) удобно "выделением" очертить смысловую часть картинки после этого все края "залить", например, белым цветом (если он не используется в смысловой части). Сохраните картинку в формате BMP.

Получение координат границы картинки

Для получения координат границ картинки удобно воспользоваться возможностями PhotoShop. Для этого надо выполнить всего две операции:

  • превратить "выделение" смысловой части картинки в путь,
  • экспортировать путь в Illustrator.

В результате получится файл с расширением ai и текстовым содержанием, такого типа:

  %!PS-Adobe-2.0
  %%Creator: Adobe Photoshop(TM) Pen Path Export 3.0
  %%Title: (predpr.ai)
  %%DocumentProcSets: Adobe_Illustrator_1.1 0 0
  %%ColorUsage: Black&White
  %%BoundingBox: 0 0 600 381
  %%HiResBoundingBox: 0 0 600 381
  %AI3_Cropmarks: 0 0 600 381
  %%DocumentPreview: None
  %%EndComments
  %%EndProlog
  %%BeginSetup
  Adobe_Illustrator_1.1 begin
  n
  %%EndSetup
  0.0 0.0 0.0 1.0 k
  0 i 0 J 0 j 1 w 4 M []0 d
  %%Note:
  260.9999 372 m
  335.0937 359.25 414.9062 367.1562 486.0624 352.25 c
  508.4687 347.5625 526.9374 341.4375 546.5937 332.5937 c
  556.4062 328.1875 567.4374 316 578.9999 316 C
  577.1249 301.625 582.6874 289.6875 582.9374 275 C
  583.1249 217.0312 583.3124 159.0312 583.4687 101.0625 C
  581.4374 79.875 571.2812 53.375 553.125 41.7812 C
  552.7499 41.1875 552.3749 40.5937 551.9999 40 C
  551.6562 38 551.3437 36 550.9999 34 C
  529.7187 29.2187 503.9062 31.7812 480.9999 29.9375 c
  465.9687 28.75 457.0624 17.0937 442.9374 15.4687 C
  402.2812 16.5312 361.6249 17.5937 320.9687 18.6875 C
  316.4062 18.6875 292.9999 18.8437 292.9999 15 C
  292.3437 16 291.6874 17 290.9999 18 C
  271.3437 11.875 246.5624 12 223.9999 12 C
  213.1249 21.3125 187.8124 25.4375 171.9687 25.9062 C
  169.6562 26.2812 167.3437 26.625 164.9999 27 C
  166.3437 27 167.6874 27 168.9999 27 C
  168.6562 27.6562 168.3437 28.3125 167.9999 29 C
  141.1874 39.7187 109.5937 41.4062 80.1562 46.75 C
  70.4374 49.5 60.7187 52.25 50.9999 55 C
  45.3437 63 39.6874 71 33.9999 79 C
  38.9062 92.1562 25.6562 108.5312 25.4374 124.0312 C
  25.6874 158.0312 25.9687 192 26.2187 226 C
  27.8124 234 29.4062 242 30.9999 250 C
  35.5937 257.6875 40.2187 265.375 44.8124 273.0625 C
  55.5937 283.5312 70.3749 289.3437 78.3437 303.3125 c
  86.0937 316.9687 86.8124 338.9062 96.1249 351.0312 c
  100.7499 357.0937 110.2187 361 117.9999 361 C
  140.1562 372.8437 176.9999 368 204.9999 368 C
  208.6562 368.3437 212.3437 368.6562 215.9999 369 C
  228.6562 369.3437 241.3437 369.6562 253.9999 370 C
  256.3437 370.6562 258.6874 371.3125 260.9999 372 C
  n
  %%Trailer
  %%EOF

В нем явно видны координаты в пикселях границы смысловой части картинки. Координаты идут парами X , Y. Они фактически готовы к подстановке в текст программы, а необходимые преобразования можно сделать уже в тексте программы.

Программирование в Delphi

Стандартная часть

Стандартная часть программирования подразумевает выполнение обычных операций:

  • Создание Form'ы для картинки.
  • Размещение на ней визуального элемента Timage
  • Загрузка в элемент типа Timage подготовленной картинки (типа BMP)
  • Установка свойства Timage Transparent в TRUE.

Задание границы Form'ы

Для точной настройки формы Form'ы надо загрузить координаты границы картинки из файла типа ai в программу, например, в виде массива констант:

code: #delphi
implementation
 
{$R *.DFM}
 
type t_coord = array [1..272] of real;//число точек определяется вручную
 
const
 
ImgHeight : integer = 381; //высота катринки в пикселях
 
coord : t_coord =(260.9999, 372, //массив координат границы
269.8749, 370.25,
280.4374, 371.5625,
289.9374, 370.625,
316.0624, 368.125,
341.8124, 366.8125,
369.9687, 365.9062,
408.9687, 364.6875,
448.0624, 359.3125,
484.9062, 352.5625,
507.5312, 348.4375,
527.0624, 341.6562,
 
... - я выпустил часть координат для уменьшения объема статьи
 
95.6874, 351.3437,
100.7187, 357.5,
109.6874, 361,
117.9999, 361,
138.7187, 373.7812,
178.0937, 368,
204.9999, 368,
208.6562, 368.3437,
212.3437, 368.6562,
215.9999, 369,
223.9999, 368.875,
231.9999, 368.7187,
239.9999, 368.5937,
244.6562, 369.0625,
249.3437, 369.5312,
253.9999, 370,
256.3437, 370.6562,
258.6874, 371.3125,
260.9999, 372); 

Настройка формы Form'ы

Настройка формы Form'ы связана с необходимостью округления до целого значения и пересчета заданных координат в систему отсчета Timage. У исходных координат ноль расположен в левой нижней части картинки, а у Timage - в левой верхней точке. Кроме того, основная цель - задать форму Form'ы, поэтому необходимо произвести пересчет координат относительно левой верхней точки элемента типа TForm. Все эти операции выполняются при создании Form'ы:

code: #delphi
procedure TForm1.FormCreate(Sender: TObject);
var
  P : array [0..134] of TPoint; //массив для задания формы
  i, imgX, imgY : integer;
  R : HRgn;
begin
  // координаты на форме объекта Image1
  imgX := Image1.Left;
  imgY := Image1.Top;
 
  // формирование массива точек для задания формы Form1
  for i := 0 to 134 do
    P[i] := Point(imgX + round(coord[i+i+1]),
  imgY + ImgHeight - round(coord[i+i+2]));
 
  R := CreatePolygonRgn(P, 135, WINDING); // создание полигона
  SetWindowRgn(Handle, R, True); //установка формы Form1
  Brush.Style:=bsClear; //прозрачность формы не помешает
end;

Формально это все, что касается основной темы статьи.

Замечания

Рассмотрен случай односвязанного пути. Вариант с несколькими путями реализуется аналогично с использованием метода CombineRgn.

Формально, для красоты работы примера я в код добавил еще

code: #delphi
//Это в общем-то ненужная добавка для перетаскивания картинки по экрану
//добавлена вручную
 
procedure TForm1.WMNCHitTest(var M: TWMNCHitTest);
begin
  inherited; // вызов унаследованного обработчика
  if M.Result = htClient then // мышь сидит на окне?
  M.Result := htCaption; // Если да, то пусть Windows думает, что мышь сидит на Caption
end;
 
//Закрытие программы по щелчку мыши
procedure TForm1.Button1Click(Sender: TObject);
begin
 close;
end;

автор: Нестандартная форма окна

Поделиться:

Похожие статьи: