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

Previous  Top  Next

    
 

 

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

Code:

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.

 

 

©Drkb::00448

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

 

 

 


SetWindowTransp(hndl: THandle; Perc: byte);

 

hndl

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

Perc

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

©Drkb::00449

       

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

 

 


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

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

Code:

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.

 

 

 

©Drkb::00450

       

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