天天看点

Delphi 窗体透明化

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

  if Button1.Caption = 'Show Form' then

    DoInvisible

  else

    DoVisible;

end;

end

继续阅读