怎样让panel DBGrid 等元件 为透明

解决方案 »

  1.   

    unit Unit2;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls;type
      TTransPanel = class(TPanel)  private    ReEntry: Boolean;
        FOnPaint: TNotifyEvent;    procedure WMEraseBkgnd(var Message: TWmEraseBkgnd); message WM_ERASEBKGND;
        procedure WMWindowPosChanged(var Message: TWMWindowPosChanged);
                    message WM_WINDOWPOSCHANGED;  protected    procedure CreateParams(var Params: TCreateParams); override;
        procedure Paint; override;  public    property Canvas;
        property OnPaint: TNotifyEvent read FOnPaint write FOnPaint;    constructor Create(AOwner: TComponent); override;
        procedure Invalidate; override;  end;implementationconstructor TTransPanel.Create(AOwner: TComponent);
    begin
      inherited;
      with Canvas do begin
        Pen.Color := clHighlight;
        Pen.Style := psDot;
        Brush.Style := bsClear;
      end;
      ControlStyle := ControlStyle - [csCaptureMouse, csOpaque,
                                      csClickEvents, csDoubleClicks,
                                      csReflector, csMenuEvents,
                                      csNoStdEvents];
    end;procedure TTransPanel.CreateParams(var Params: TCreateParams);
    begin
      Params.ExStyle := Params.ExStyle or WS_EX_TRANSPARENT;
      inherited CreateParams(Params);
    end;procedure TTransPanel.WMEraseBkgnd(var Message: TWmEraseBkgnd);
    var
      rc: TRect;
      OrgDesignMode: Boolean;
      rgn: THandle;
      i: Integer;
    begin
      rgn := CreateRectRgn(0, 0, Width, Height);
      try
        for i := Parent.ControlCount-1 downto 0 do
          if Parent.Controls[0] = Self then
            SelectClipRgn(Canvas.Handle, rgn);
      finally
        DeleteObject(rgn);
      end;  if ReEntry then exit;
      ReEntry := True;
      OrgDesignMode := csDesigning in ComponentState;
      try
        SetDesigning(False);
        Visible := False;
        rc := BoundsRect;
        InvalidateRect(Parent.Handle, @rc, False);
        UpdateWindow(Parent.Handle);
        Visible := True;
      finally
        SetDesigning(OrgDesignMode);
        ReEntry := False;
        Message.Result := 0;
      end;
    end;procedure TTransPanel.WMWindowPosChanged(var Message:
      TWMWindowPosChanged);
    begin
      inherited;
      if HandleAllocated then begin
        InvalidateRect(Handle, nil, True);
        UpdateWindow(Handle);
      end;
    end;procedure TTransPanel.Paint;
    begin
      if Assigned(OnPaint) then OnPaint(Self);
    end;procedure TTransPanel.Invalidate;
    begin
      if HandleAllocated then Perform(WM_ERASEBKGND, 0, 0);
    end;end.