给你个透明窗体的例子,看看就知道了
主要是用CreateRectRgn和CombineRgn
procedure TForm1.DoInvisible;//将窗体透明化
var
; AControl : TControl;
; A, Margin, X, Y, CtlX, CtlY : Integer;
begin
; //边界宽度,即不透明边界的宽度
; Margin := ( Width - ClientWidth ) div 2;
; //获得该窗体的区域的句柄
; FullRgn := CreateRectRgn(0, 0, Width, Height);
; //获得该窗体的客户区域的句柄,即将要弄透明的部分
; X := Margin;
; Y := Height - ClientHeight - Margin;
; ClientRgn := CreateRectRgn( X, Y, X + ClientWidth, Y + ClientHeight );
; //将窗体中所有非客户区域(除窗体边界)的部分透明
; //RGN_DIFF表示在第二个FullRgn中,去掉ClientRgn大小的部分将结果显示在第一个FullRgn里
; CombineRgn( FullRgn, FullRgn, ClientRgn, RGN_DIFF );
; //对窗体上的各个控件作处理,RGN_OR
; 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;
; //设置窗体样式,透明生效
; SetWindowRgn(Handle, FullRgn, TRUE);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
; //释放创建的资源
; DeleteObject(ClientRgn);
; DeleteObject(FullRgn);
; DeleteObject(CtlRgn);
end;
procedure TForm1.DoVisible;
begin
; //恢复原来的显示
; FullRgn := CreateRectRgn(0, 0, Width, Height);
; CombineRgn(FullRgn, FullRgn, FullRgn, RGN_COPY);
; SetWindowRgn(Handle, FullRgn, TRUE);
end;
procedure TForm1.FormResize(Sender: TObject);
begin
; DoInvisible
end;