В продолжение серии о формах написала заметку, посвященную вырезанию форм «по шаблону».
Порой бывает так, что вручную (с помощью функции CreatePolygonRgn
) вырезать необходимую область довольно проблематично. В такой ситуации можно воспользоваться функцией CombineRgn
, которая предоставляет возможность комбинировать области различных форм.
Важным моментом является верное указание нужной области и, соответственно, прозрачного цвета. В случае, если цвет стоит считать прозрачным – значит, данный фрагмент формы должен быть вырезан.
В целом, необходимо создать функцию CreateBmpRgn
и передать ей данные о том, какой именно рисунок следует считать шаблоном для вырезания и, естественно, какой именно цвет стоит считать прозрачным.
Прежде всего, поместим в заголовный файл:
HRGN CreateBmpRgn(TPicture *APicture, TColor ATransparentColor);
После чего создадим функцию для построчного анализа каждого пикселя нашего рисунка-шаблона. Кстати, в качестве такого шаблона я взяла рисунок из статьи «Как сделать прозрачный фон». Полученный контур я залила черным цветом, а фон оставила белым. Все это добро сохранила в формате *.bmp
.
Функция построчного анализа выглядит так:
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);
В результате получаем вот такую форму:
Будут вопросы – задавайте =)