При создании окна непрямоугольной формы используются API функции
CreateEllipticRgn, CreateRectRgn, CreatePolygonRgn, CreateRoundRectRgn, CombineRgn.
Code: |
procedure TForm1.FormCreate(Sender: TObject); var R1, R2: HRgn; begin // Создаем линзу (пересечение двух эллипсов) R1 := CreateElliPticRgn(-150,-300,363,400); // Задаем // координаты эллипса. Верхняя левая точка формы имеет // координаты 0,0 R2 := CreateEllipticRgn(363+150,-300,5,400); CombineRgn(R1,R1,R2,RGN_AND); // Получаем пересечение // Отрезаем сверху слева R2:= CreateEllipticRgn(-40,-30,182,20); CombineRgn(R1,R1,R2,RGN_DIFF); // Вычитаем // Отрезаем сверху справа R2:= CreateEllipticRgn(180,-30,363+40,20); CombineRgn(R1,R1,R2,RGN_DIFF); // Назначаем полученный регион форме SetWindowRgn(Handle, R1, True); end; |
Если Вы все ввели правильно, то при запуске проекта получите окно в виде щита, как у Norton CrashGuard. Как это получилось, можно понять из схемы 1. Зеленые эллипсы при пересечении образуют линзу, красные эллипсы вычитаются.
Размер формы должен позволить разместиться на ней щиту полностью, иначе Вы получите усеченный вариант изображения.
Переопределение функции WMNCHitTest позволит перетаскивать окно, захватив его мышкой.
Code: |
procedure TForm1.WMNCHitTest(var Message: TWMNCHitTest); begin inherited; Message.Result := HTCAPTION; end; |
Теперь немного усложним задачу. Создадим фигурный щит
Синие фигуры складываются, красные вычитаются. Исходный код приведен ниже:
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!