C++ Builder: Вырезка формы по шаблону

В продолжение серии о формах написала заметку, посвященную вырезанию форм «по шаблону».

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

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

В целом, необходимо создать функцию CreateBmpRgn и передать ей данные о том, какой именно рисунок следует считать шаблоном для вырезания и, естественно, какой именно цвет стоит считать прозрачным.

Прежде всего, поместим в заголовный файл:

1
HRGN CreateBmpRgn(TPicture *APicture, TColor ATransparentColor);

После чего создадим функцию для построчного анализа каждого пикселя нашего рисунка-шаблона. Кстати, в качестве такого шаблона я взяла рисунок из статьи «Как сделать прозрачный фон». Полученный контур я залила черным цветом, а фон оставила белым. Все это добро сохранила в формате *.bmp.

Контур

Функция построчного анализа выглядит так:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
HRGN tmpRgn,wndRgn;
wndRgn=CreateRectRgn(0,0,0,0);
tmpRgn=CreateRectRgn(0,0,0,0);
// цикл по высоте картинки
for(int y = 0; y < APicture->Height; y++)
{
int x = 0;
// изменяем ширину картинки
while(x < APicture->Width)
{
 while((x < APicture->Width) &&
 (APicture->Bitmap->Canvas->Pixels[x][y] == ATransparentColor))
      x++;
if (x!=APicture->Width)
  {
  int XStart = x;
   while((x < APicture->Width) &&
  (APicture->Bitmap->Canvas->Pixels[x][y] != ATransparentColor))
      x++;
   tmpRgn=CreateRectRgn(XStart,y,x,y+1);
   CombineRgn(wndRgn, wndRgn, tmpRgn, RGN_OR);
   }
}
}
HRGN Result = wndRgn;
SetWindowRgn(Handle, wndRgn, TRUE);
DeleteObject(wndRgn);
DeleteObject(tmpRgn);

В результате получаем вот такую форму:

Полученная форма

Будут вопросы – задавайте =)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *