Delphi World - Изменение стандартной формы
Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Изменение стандартной формы

Оформил: DeeCo

Автор: Mirovodin Dmitriy

Вас наверное часто удивляла форма окна, которая появляется при загрузке Norton Utilites и других подобных программ. Она имела не прямоугольный размер и ВЫ задавались вопросом : как получить такую форму? / Хотя я подозреваю, что это обычный Bitmap/ Оказывается сделать это довольно просто. При этом Ваша форма может иметь самые замысловатые очертания т.к. все это задается с помощью полигона.
Все делается с помощью одной единственной процедуры :

SetWindowRgn(Handle, R, True);

Handle - указатель на форму, вид которой хотим поменять
R - указатель на регион
Третий параметр - флаг, при значении TRUE сразу после установки перерисовка

Для установки R смотрите функцию CreatePolygonRgn .
В примере я задал в качестве региона простой треугольник, но при большей изобретательности можно создавать очень интересные варианты. Например форму-круг или эллипс.

CustForm

Прозрачная форма


Приведу простой пример, как можно использовать данную форму. Допустим Вам надо сделать программу- напоминалку. Висит эта форма и на ней постоянно отображаются Ваши встречи, дела, праздники или другая полезная информация. Получится этакий Activ Desctop :) Но будет он жрать ресурсов на порядки меньше.Реализуется все это очень просто.
Переписываем конструктор:

constructor TForm1.Create(AOwner:
  TComponent);
begin
  inherited;
  HorzScrollBar.Visible := False; //убираем сколлбары, чтобы не мешались
  VertScrollBar.Visible := False;
    // при изменении размеров формыRebuildWindowRgn; // строим новый регион
end;

А вот процедура "перестройки" региона формы:

procedure TForm1.RebuildWindowRgn;
var
  FullRgn, Rgn: THandle;
  ClientX, ClientY, I: Integer;
begin // определяем   относительные координаты клиентской части
  ClientX := (Width - ClientWidth) div 2;
  ClientY := Height - ClientHeight - ClientX;
  FullRgn := CreateRectRgn(0, 0, Width, Height);
    // создаем    регион для всей формы
  // создаем регион для клиентской части формы и   вычитаем его из
  FullRgnRgn := CreateRectRgn(ClientX, ClientY, ClientX
    + ClientWidth, ClientY + ClientHeight);
  CombineRgn(FullRgn, FullRgn,
    Rgn, rgn_Diff);
      // теперь добавляем к FullRgn регионы каждого контрольного элемента
  for I := 0 to ControlCount - 1 do
    with Controls[I] do
    begin
      Rgn := CreateRectRgn(ClientX + Left, ClientY +
        Top, ClientX + Left + Width, ClientY + Top +
        Height);
      CombineRgn(FullRgn, FullRgn, Rgn,
        rgn_Or);
    end;
  SetWindowRgn(Handle, FullRgn, True); //устанавливаем новый регион окна
end;

И самый последний штрих. Если Ваша форма, будет с изменяемыми размерами, то Вам надо добавить:

procedure
  TForm1.Resize;
begin
  inherited;
  RebuildWindowRgn; // строим новый регион
end;
CustForm

Перемещение формы


Еще один штрих - произвольное перемещение формы, а не за Title Bar. Так сделано в программе WinAmp. Пишем всего одну процедуру:

procedure TForm1.WMNCHitTest(var M: TWMNCHitTest);
begin
  inherited; // вызов унаследованного обработчика
  if M.Result = htClient then // Мышь сидит на окне? Если да
    M.Result := htCaption; // - то пусть Windows думает, что мышь на caption bar
end;
Проект Delphi World © Выпуск 2002 - 2017
Автор проекта: Эксклюзивные курсы программирования