透明窗口的源代码

字体大小: 中小 标准 ->行高大小: 标准
unit Unit1;

{The transparent form effect is done with Regions.

First create a region that encompasses the entire form.

Then, find the client area of the form (Client vs. non-Client) and

combine with the full region with RGN_DIFF to make the borders

and title bar visible. Then create a region for each of the

controls and combine them with the original (FullRgn) region.}

{From various posts in the newsgroups - based on some famous

author I'm sure, but I first saw the post by Kerstin Thaler...}

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

ExtCtrls, StdCtrls;

type

TForm1 = class(TForm)

Button1: TButton;

Panel1: TPanel;

Button2: TButton;

procedure FormDestroy(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure FormResize(Sender: TObject);

private

{ Private declarations }

procedure DoVisible;

procedure DoInvisible;

public

{ Public declarations }

end;

var

Form1: TForm1;

FullRgn, ClientRgn, CtlRgn : THandle;

implementation

{$R *.DFM}

procedure TForm1.DoInvisible;

var

AControl : TControl;

A, Margin, X, Y, CtlX, CtlY : Integer;

begin

Margin := ( Width - ClientWidth ) div 2;

//First, get form region

FullRgn := CreateRectRgn(0, 0, Width, Height);

//Find client area region

X := Margin;

Y := Height - ClientHeight - Margin;

ClientRgn := CreateRectRgn( X, Y, X + ClientWidth, Y + ClientHeight );

//'Mask' out all but non-client areas

CombineRgn( FullRgn, FullRgn, ClientRgn, RGN_DIFF );

//Now, walk through all the controls on the form and 'OR' them

// into the existing Full region.

for A := 0 to ControlCount - 1 do begin

AControl := Controls[A];

if ( AControl is TWinControl ) or ( AControl is TGraphicControl )

then with AControl do begin

if Visible then begin

CtlX := X + Left;

CtlY := Y + Top;

CtlRgn := CreateRectRgn( CtlX, CtlY, CtlX + Width, CtlY + Height );

CombineRgn( FullRgn, FullRgn, CtlRgn, RGN_OR );

end;

end;

end;

//When the region is all ready, put it into effect:

SetWindowRgn(Handle, FullRgn, TRUE);

end;

procedure TForm1.FormDestroy(Sender: TObject);

begin

//Clean up the regions we created

DeleteObject(ClientRgn);

DeleteObject(FullRgn);

DeleteObject(CtlRgn);

end;

procedure TForm1.DoVisible;

begin

//To restore complete visibility:

FullRgn := CreateRectRgn(0, 0, Width, Height);

CombineRgn(FullRgn, FullRgn, FullRgn, RGN_COPY);

SetWindowRgn(Handle, FullRgn, TRUE);

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

//We start out as a transparent form....

DoInvisible;

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

//This button just toggles between transparent and not trans..

if Button1.Caption = 'Show Form' then begin

DoVisible;

Button1.Caption := 'Hide Form';

end

else begin

DoInvisible;

Button1.Caption := 'Show Form';

end;

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

Application.Terminate;

end;

procedure TForm1.FormResize(Sender: TObject);

begin

//Need to address the transparency if the form gets re-sized.

//Also, note that Form1 scroll bars are set to VISIBLE/FALSE.

//I did that to save a little coding here....

if Button1.Caption = 'Show Form' then

DoInvisible

else

DoVisible;

end;

end.

此文章由 http://www.ositren.com 收集整理 ,地址为: http://www.ositren.com/htmls/68398.html