Для создания "прозрачных" форм неодходимо
хорошо разбираться в регионах. Поэтому если вы сейчас впервые столкнулись
с этим понятием рекомендую посмотреть
эту статью. Если форма прозрачна то должны быть видны только её
компоненты.Наша цель - создать регион который содержит в себе объединение
всей области формы которая находится под компонентами. В итоге нетрудно
получить примерно такой код , полностью решающий нашу задачу:
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
HRGN FullRgn;
HRGN Rgn;
int I;
// определяем относительные координаты клиенской части
int ClientX= (Width - ClientWidth)/ 2;
int ClientY= Height - ClientHeight - ClientX;
// создаем регион для всей формы
FullRgn = CreateRectRgn(0, 0, Width, Height);
// создаем регион для клиентской части формы
// и вычитаем его из FullRgn
Rgn = CreateRectRgn(ClientX, ClientY, ClientX + ClientWidth, ClientY
+ClientHeight);
CombineRgn(FullRgn, FullRgn, Rgn, RGN_DIFF);
// теперь добавляем к FullRgn регионы каждого контрольного элемента
for(I=0; I ControlCount; I++ )
{ Rgn = CreateRectRgn(ClientX+Controls[I]->Left, ClientY+Controls[I]->Top,
ClientX+Controls[I]->Left + Controls[I]->ClientWidth,
ClientY+Controls[I]->Top +Controls[I]->ClientHeight);
CombineRgn(FullRgn, FullRgn, Rgn, RGN_OR);
// устанавливаем новый регион окна
}
SetWindowRgn(Form1->Handle, FullRgn, True);
}
//---------------------------------------------------------------------------
(Выборка из статьи "Прозрачные формы"
d`AEON)
Скачать
архив с примером