interfaceuses
Windows, Messages, Forms;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
end;
const
WS_EX_LAYERED = $80000;
function SetLayeredWindowAttributes(hWindow : HWND; crKey : DWORD; bAlpha : Byte;
dwFlags : DWORD) : BOOL; stdcall; external user32 name 'SetLayeredWindowAttributes';
var
Form1: TForm1;
implementation{$R *.DFM}procedure TForm1.FormCreate(Sender: TObject);
begin
SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
SetLayeredWindowAttributes(Handle, 0, Byte(196), 2);
end;
end.
...
const
WS_EX_LAYERED = $80000;
type
TSetLayeredWindowAttributes = function(hWnd : HWND; crKey : DWORD;
bAlpha : Byte; dwFlags : DWORD) : BOOL; stdcall;
...
procedure TForm1.FormCreate(Sender: TObject);
var
SetLayeredWindowAttributes : TSetLayeredWindowAttributes;
hUser32 : HINST;
begin
SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
hUser32 := LoadLibrary('user32.dll');
if hUser32 <> 0 thenbegintry
SetLayeredWindowAttributes := GetProcAddress(hUser32, 'SetLayeredWindowAttributes');
if Assigned(@SetLayeredWindowAttributes) then
SetLayeredWindowAttributes(Handle, 0, Byte(196), 2);
finally
FreeLibrary(hUser32);
end;
end;
end;
Код, который я предоставил, - это реализация формы в Delphi, которая настраивает прозрачность окна с помощью функции SetLayeredWindowAttributes из Windows API.
Вот подробное описание того, что код делает:
Обработчик события FormCreate для формы реализован в классе TForm1.
В этом обработчике добавляется флаг стиля окна WS_EX_LAYERED с помощью функции SetWindowLong. Это позволяет окну быть слоем и прозрачным.
Затем вызывается функция SetLayeredWindowAttributes с.handle формы, значением цвета ключа (0 в этом случае), значением альфа (196, что соответствует 49,6% неопределенности) и флагами, указывающими желаемое поведение прозрачности окна.
Вторая версия кода обеспечивает больше гибкости, определив функциональный указатель TSetLayeredWindowAttributes, который указывает на функцию SetLayeredWindowAttributes из Windows API. Это позволяет динамически загружать DLL, содержащую эту функцию, и вызывать ее в runtime, а не связываясь с ней при компиляции.
Вот, как работает вторая версия кода:
Обработчик события FormCreate реализован так же, как и раньше.
Загружается handle библиотеки user32.dll с помощью функции LoadLibrary.
Если библиотека успешно загружена, получается указатель на функцию SetLayeredWindowAttributes с помощью функции GetProcAddress.
Затем вызывается функция SetLayeredWindowAttributes с.handle формы, значением цвета ключа (0 в этом случае), значением альфа (196, что соответствует 49,6% неопределенности) и флагами, указывающими желаемое поведение прозрачности окна.
Наконец, библиотека разгружается с помощью функции FreeLibrary.
В целом, обе версии кода достигают одного и того же результата - настройки прозрачности формы - но вторая версия обеспечивает больше гибкости и позволяет динамически загружать и вызывать внешние функции в runtime.
В статье описывается способ создания прозрачного окна в Delphi с использованием функции SetLayeredWindowAttributes для изменения свойств окна.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.