Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Как сделать прозрачное окно родными средствами Windows2000?

01.01.2007

В Windows2000 есть для этого ф-я SetLayeredWindowAttributes, вот пример её использования:

unit Win2k;
interface
uses
Graphics, Windows;
 
function SetLayeredWindowAttributes(
hwnd
: HWND; // handle to the layered window
crKey
: TColor; // specifies the color key
bAlpha
: byte; // value for the blend function
dwFlags
: DWORD // action
): BOOL; stdcall;
 
function SetLayeredWindowAttributes; external 'user32.dll';
implementation
 
end.
 
program
WinLayer;
 
uses
Windows, SysUtils,
Win2k
in 'Win2k.pas';
 
const
WS_EX_LAYERED
= $80000;
LWA_COLORKEY
= 1;
LWA_ALPHA
= 2;
 
var
Hndl : THandle;
Transp : Byte;
 
begin
Writeln('Windows2000 Layer <- build by AK ->');
Writeln(' Usage: WINLAYER.EXE [window name] [Transp (0-255)]');
Writeln(' Example: WINLAYER "Calculator" 200');
Writeln;
if ParamCount <> 2 then exit;
Hndl := FindWindow(nil, PChar(ParamStr(1)));
Transp := StrToIntDef(ParamStr(2), 128);
if SetWindowLong(Hndl, GWL_EXSTYLE, GetWindowLong(Hndl, GWL_EXSTYLE) or WS_EX_LAYERED) = 0 then
Writeln('Error !');
 
if not SetLayeredWindowAttributes(Hndl, 0, Transp, LWA_ALPHA) then
// ^^^ степень прозрачности
// 0 - полная прозрачность
// 255 - полная непрозрачность
Writeln('Error !');
end.

Взято из https://forum.sources.ru


SetWindowTransp(hndl: THandle; Perc: byte);

hndl

Hanle окна, которое надо сделать полупрозрачным.

Perc

Число от 1 до 100, указывающее уровень прозрачности.

Взято с https://delphiworld.narod.ru


Есть более продвинутые возможности (например, альфа-канал в битмапе)

https://msdn.microsoft.com/isapi/msdnlib.idc?theURL=/library/techart/layerwin.htm

unit TransparentWnd;
 
interface
 
uses
 
Windows, Messages, Classes, Controls, Forms;
 
type
  _Percentage
= 0..100;
 
 
TTransparentWnd = class(TComponent)
 
private
   
{ Private declarations }
 
protected
   
{ Protected declarations }
    _percent
: _Percentage;
    _auto
: boolean;
    User32
: HMODULE;
 
public
   
{ Public declarations }
   
constructor Create(AOwner: TComponent); override;
    destructor
Destroy; override;
 
   
//These work on a Handle
   
//It doesn't change the Percent Property Value!
    procedure
SetTransparentHWND(hwnd: THandle; percent : _Percentage);
 
   
//These work on the Owner (a TWinControl decendant is the Minumum)
   
//They don't change the Percent Property Value!
    procedure
SetTransparent; overload;
    procedure
SetTransparent(percent : _Percentage); overload;
 
    procedure
SetOpaqueHWND(hwnd : THandle);
    procedure
SetOpaque;
  published
   
{ Published declarations }
   
//This works on the Owner (a TWinControl decendant is the Minumum)
    property
Percent: _Percentage read _percent write _percent default 0;
 
    property
AutoOpaque: boolean read _auto write _auto default false;
end;
 
procedure
register;
 
implementation
 
const LWA_ALPHA = $2;
const GWL_EXSTYLE = (-20);
const WS_EX_LAYERED = $80000;
const WS_EX_TRANSPARENT = $20;
 
var
 
SetLayeredWindowAttributes: function (hwnd: LongInt; crKey: byte;
    bAlpha
: byte; dwFlags: LongInt): LongInt; stdcall;
 
constructor TTransparentWnd.Create(AOwner: TComponent);
begin
  inherited
;
 
  User32
:= LoadLibrary('USER32.DLL');
 
if User32 <> 0 then
   
@SetLayeredWindowAttributes := GetProcAddress(User32, 'SetLayeredWindowAttributes')
 
else
   
SetLayeredWindowAttributes := nil;
end;
 
destructor
TTransparentWnd.Destroy;
begin
 
if User32 <> 0 then
   
FreeLibrary(User32);
 
  inherited
;
end;
 
procedure
TTransparentWnd.SetOpaqueHWND(hwnd: THandle);
var
  old
: THandle;
begin
 
if IsWindow(hwnd) then
 
begin
    old
:= GetWindowLongA(hwnd,GWL_EXSTYLE);
   
SetWindowLongA(hwnd, GWL_EXSTYLE, old and ((not 0)-WS_EX_LAYERED));
 
end;
end;
 
procedure
TTransparentWnd.SetOpaque;
begin
 
Self.SetOpaqueHWND((Self.Owner as TWinControl).Handle);
end;
 
procedure
TTransparentWnd.SetTransparent;
begin
 
Self.SetTransparentHWND((Self.Owner as TWinControl).Handle, Self._percent);
end;
 
procedure
TTransparentWnd.SetTransparentHWND(hwnd: THandle; percent : _Percentage);
var
  old
: THandle;
begin
 
if (User32 <> 0) and (Assigned(SetLayeredWindowAttributes)) and (IsWindow(hwnd)) then
   
if (_auto=true) and (percent=0) then
     
SetOpaqueHWND(hwnd)
   
else
   
begin
      percent
:= 100 - percent;
      old
:= GetWindowLongA(hwnd, GWL_EXSTYLE);
     
SetWindowLongA(hwnd, GWL_EXSTYLE, old or WS_EX_LAYERED);
     
SetLayeredWindowAttributes(hwnd, 0, (255 * percent) div 100, LWA_ALPHA);
   
end;
end;
 
procedure
TTransparentWnd.SetTransparent(percent: _Percentage);
begin
 
Self.SetTransparentHWND((Self.Owner as TForm).Handle, percent);
end;
 
procedure
register;
begin
 
RegisterComponents('Win32', [TTransparentWnd]);
end;
 
end.

Взято с https://delphiworld.narod.ru