unit transpar_frm;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
CheckBox1: TCheckBox;
// это просто кнопки на форме - для демонстрации
protected
procedure RebuildWindowRgn;
procedure Resize; override;
public
constructor Create(AOwner: TComponent); override;
end;
var
Form1 : TForm1;
implementation
{$R *.DFM}
{ Прозрачная форма }
constructor TForm1.Create(AOwner: TComponent);
begin
inherited;
// StayOnTop в принципе можно убрать
FormStyle:=fsStayOnTop;
// убираем скроллбары, чтобы не мешались
// при изменении размеров формы
HorzScrollBar.Visible:= False;
VertScrollBar.Visible:= False;
// строим новый регион
RebuildWindowRgn;
end;
procedure TForm1.Resize;
begin
inherited;
// строим новый регион
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;
end.
Первый фрагмент кода создает прозрачную форму, которая не реагирует на события мыши. Это достигается следующим образом:
Создается регион для всей формы и из него вычитывается клиентская зона.
Каждому контролу на форме добавляется его регион к полному региону, используя rgn_Diff для контролов, находящихся вне клиентской зоны, и rgn_Or для контролов, находящихся внутри клиентской зоны.
Регион формы устанавливается с помощью SetWindowRgn.
Второй фрагмент кода представляет собой более простой подход к созданию прозрачной формы, установкой ее расширенного стиля в WS_EX_TRANSPARENT. Это позволяет событиям мыши проходить через форму, но форма все еще существует и может быть манипулирована программно.
Третий фрагмент кода использует обработчик события HandleMessage для перехвата сообщений мыши и перенаправления их к underlying window. Это более сложный подход, требующий создания региона для каждого сообщения мыши и затем комбинации его с полным регионом окна с помощью CombineRgn. Полученный регион затем устанавливается как новый регион для окна с помощью SetWindowRgn.
В заключение, все три подхода достигают прозрачности, но отличаются в своей реализации сложности и побочных эффектах. Первый фрагмент кода обеспечивает более детальное управление поведением формы, а второй - более простой и прямой способ. Третий фрагмент кода более сложен, но позволяет иметь точное управление событиями мыши.
В качестве альтернативного решения можно использовать свойство TransparentColor класса TForm, чтобы сделать форму прозрачной, как показано ниже:
constructorTForm1.Create(AOwner:TComponent);begin...;TransparentColor:=clNone;// или любым другим цветомend;
Этот подход более прост и прямой, чем другие решения.
В статье рассматриваются различные способы создания прозрачной формы в Delphi, не реагирующей на мышь. Приводится код на примерах использования различных функций Windows API и компонентов Delphi для достижения этой цели.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.