果然发现记性这东西,不怎么靠谱额。。记录下吧
unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; procedure FormDestroy(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure FormResize(Sender: TObject); procedure Button3Click(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.Button3Click(Sender: TObject); var Reg1,Reg2: THandle; begin Reg1 := CreateRoundRectRgn(0, 0, self.Width, self.Width, 16, 16); //在窗体指定的位置上创建一个圆角句型区域 Reg2 := CreateRectRgn(20, 20, self.Width, self.Width); //在窗体指定的位置上创建一个矩形区域 CombineRgn(Reg1, Reg1, Reg2, RGN_OR); //将Reg1,Reg2两个区域进行合并,Reg1得到Reg1,reg2的集合并集! SetwindowRgn(handle, Reg1, True); //将以上创建的区域设定成窗体的区域 end; procedure TForm1.FormResize(Sender: TObject); begin if Button1.Caption = 'Show Form' then DoInvisible else DoVisible; end; end.