Изменение стандартной формы

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Оформил: DeeCo

Автор: Mirovodin Dmitriy

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

Все делается с помощью одной единственной процедуры :

SetWindowRgn(Handle, R, True);

Handle — указатель на форму, вид которой хотим поменять

R — указатель на регион

Третий параметр — флаг, при значении TRUE сразу после установки перерисовка

Для установки R смотрите функцию CreatePolygonRgn .

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

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

Приведу простой пример, как можно использовать данную форму. Допустим Вам надо сделать программу- напоминалку. Висит эта форма и на ней постоянно отображаются Ваши встречи, дела, праздники или другая полезная информация. Получится этакий 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;

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

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

procedure TForm1.WMNCHitTest(var M: TWMNCHitTest);

begin

inherited; // вызов унаследованного обработчика

if M.Result = htClient then // Мышь сидит на окне? Если да

M.Result := htCaption; // — то пусть Windows думает, что мышь на caption bar

end;

{/codecitation}

Добавить комментарий