Пятница, 14.11.2025, 04:40
AMAR Inc.
Приветствую Вас Гость | RSS
Главная Программирование Регистрация Вход
Меню сайта

Категории каталога
Разные статьи [48]
Система [62]

Главная » Статьи » Delphi » Разные статьи

Изменение стандартной формы
   Вас наверное часто удивляла форма окна, которая появляется при загрузке 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); // создаем регион для всей формы
  // создаем регион для клиентской части формы и вычитаем его из FullRgn
  Rgn:= 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;

Категория: Разные статьи | Добавил: amar-runyak (13.01.2008)
Просмотров: 1027 | Комментарии: 1 | Рейтинг: 0.0/0 |

Всего комментариев: 0
Имя *:
Email *:
Код *:
Форма входа

Поиск

Друзья сайта

Copyright AMAR Inc. © 2025