Как создать непрямоугольную форму?
На самом деле ничего сложного нет. Первое, что надо сделать, это задать саму форму формы. Для этого используются регионы (HRGN).
   HRGN MyReg;
Разумеется, имя вы можете дать любое.
Теперь в этот регион необходимо поместить информацию о форме. Для этого используются следующие функции:
   MyReg = CreateRectRgn (int, int, int, int);
   MyReg = CreateRoundRectRgn (int, int, int, int, int, int);
   MyReg = CreateEllipticRgn (int, int, int, int);
Первые четыре параметра всех функций задают координаты левого верхнего и правого нижнего угла фигуры. У функции CreateRoundRectRgn есть еще два параметра: это ширина и высота закругления (блин, сами разбирайтесь, что это такое. Я, например, вообще эту функцию не использую).
Есть еще функция CreatePolygonRgn. Ее предназначение я пока не смотрел. Но, думаю, прямоугольника и эллипса вполне хватит.
Теперь может возникнуть вопрос: но ведь нам не нужна круглая или прямоугольная форма, нам нужны формы посложнее. Как это сделать?
Очень просто. Для этого используется комбинация регионов, выполняемая следующей функцией:
   CombineRgn (HRGN, HRGN, HRGN, int);
Первый параметр - это в какой регион поместить результат (в нашем случае это, разумеется, MyReg). Второй и третий параметры - это два региона, которые необходимо объединить. В нашем случае это опять же MyReg (ведь мы должны его в результате оставить) и новый созданный регион. Последний параметр принимает одно из следующих значений:
   RGN_AND   В результате останутся только общая часть обоих регионов.
   RGN_COPY  В результате останется только первый регион. Второй игнорируется.
   RGN_DIFF  Оставит только ту часть первого региона, которае не входит во второй.
   RGN_OR    Комбинирует оба региона, то есть в результате будет все, что
             принадлежит хотя бы одному региону.
   RGN_XOR   В результате будет все, что принадлежит хотя бы одному региону,
             но не будет того, что принадлежит обоим.
Таким образом, чтобы, скажем, поместить прямоугольник, слева и справа от которого находятся окружности, надо написать следующий код:
__fastcall Form1::Form1 (TObject*Owner)
{
 HRGN MyReg;
 MyReg = CreateRectRgn (25, 0, 75, 50);
 CombineRgn (MyRgn, MyRgn, CreateEllipticRgn (0, 12, 25, 37), RGN_OR);
 CombineRgn (MyRgn, MyRgn, CreateEllipticRgn (75, 12, 100, 37), RGN_OR);
}

Теперь, научившись готовить регионы дело осталось за малым: объяснить форме, что отныне она должна быть такой формы. Это совсем несложно:
   SetWindowRgn (Handle, MyReg, true);
Последний параметр говорит о том, стоит ли сразу перерисовывать форму. Я думаю, вполне очевидно, что стоит, потому и пишу true. Первый параметр - это Handle формы, второй - это регион, которые стоит присвоить форме.
И теперь последняя проблема: ведь во многих случаях бывает надо сделать форму в виде какой-то картинки (как MagicGoody). Это ОЧЕНЬ сложно. Для этого необходимо каждую строку картинки задавать как прямоугольник с высотой 1. Мне встречались исходники, автоматизирующие этот процесс, но они действовали УЖАСНО медленно, и потому тут я их не публикую.

SHD-ALakazam
mailto: shd@bk.ru