首页  编辑  

透明Label

Tags: /超级猛料/VCL/Control.控件使用开发和第三方控件/自定义控件/   Date Created:

这里有个控件的源代码,非常好用,可惜焦点在这个控件上时不透明,你可以试着改一下。

unit RbsWiredEdit;

interface

uses

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

 StdCtrls;

const

 TWM_RbsInvalidate=WM_USER+1;

type

 TRbsWiredEdit = class(TEdit)

 private

   { Private declarations }

   procedure RbsInvalidate(var Message:TMessage); message

             TWM_RbsInvalidate;

   procedure CNCTLCOLOREDIT(var Message:TWMCTLCOLOREDIT); message

             CN_CTLCOLOREDIT;

   procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND;

   procedure WMMove(var Message: TMessage); message WM_MOVE;

 protected

   { Protected declarations }

   FTransparent: boolean;

   procedure CreateWnd; override;

   procedure CreateParams(var Params: TCreateParams); override;

   procedure DoExit; override;

   procedure DoEnter; override;

 public

   { Public declarations }

   constructor Create(AOwner: TComponent); override;

   procedure Invalidate; override;

 published

   { Published declarations }

 end;

procedure Register;

implementation

constructor TRbsWiredEdit.Create(AOwner:TComponent);

begin

inherited create(AOwner);

  ftransparent:=true;

end;

procedure TRbsWiredEdit.CreateWnd;

begin

inherited CreateWnd;

  if fTransparent then

     begin

      SetWindowLong(Parent.Handle, GWL_STYLE,

      GetWindowLong(Parent.Handle, GWL_STYLE) and not WS_CLIPCHILDREN);

      end;

end;

procedure TRbsWiredEdit.RbsInvalidate(var Message:TMessage);

var r:TRect;

begin

 if (Parent<>nil) and FTransparent then

   begin

     r:=ClientRect;

     r.TopLeft:=Parent.ScreenToClient(ClientToScreen(r.TopLeft));

     r.BottomRight:=Parent.ScreenToClient(ClientToScreen(r.BottomRight));

     RedrawWindow(Handle,nil,0,RDW_FRAME+RDW_INVALIDATE);

   end;

end;

procedure TRbsWiredEdit.CNCTLCOLOREDIT(var Message:TWMCTLCOLOREDIT);

begin

 if FTransparent then

  with Message do

   begin

     SetBkMode(ChildDC,Windows.TRANSPARENT);

     Result:=GetStockObject(HOLLOW_BRUSH)

   end

  else inherited;

end;

procedure TRbsWiredEdit.WMEraseBkgnd(var Message:TWMERASEBKGND);

begin

 if FTransparent and not (csDesigning in ComponentState) then

     PostMessage(Handle,TWM_RbsInvalidate,0,0)

 else inherited;

end;

procedure TRbsWiredEdit.WMMove(var message:TMessage);

begin

inherited;

if FTransparent then SendMessage(Handle,TWM_RbsInvalidate,0,0)

 else Invalidate;

end;

procedure TRbsWiredEdit.CreateParams(var Params:TCreateParams);

begin

inherited CreateParams(Params);

if (CsDesigning in ComponentState) then exit;

   with Params do

     begin

  ExStyle:=ExStyle or WS_EX_TRANSPARENT;

     end;

end;

procedure TRbsWiredEdit.DoExit;

begin

inherited;

  FTransparent:=true;

  SetCursor(0);

  RecreateWnd;

end;

procedure TRbsWiredEdit.DoEnter;

var exstyle,stdstyle:longint;

begin

inherited;

Ftransparent:=false;

StdStyle:= Windows.GetWindowLong(handle, GWL_EXSTYLE);

exStyle:= StdStyle and not WS_EX_TRANSPARENT;

Windows.SetWindowLong(handle, GWL_EXSTYLE, exStyle);

invalidate;

end;

procedure TRbsWiredEdit.Invalidate;

begin

if FTransparent then SendMessage(Handle,TWM_RbsInvalidate,0,0)

 else inherited;

end;

procedure Register;

begin

 RegisterComponents('Rombest', [TRbsWiredEdit]);

end;

end.