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

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