效果如下图:
实现代码:
unit Edit1;
interface
uses
SysUtils, Windows,Classes, Controls, StdCtrls,Graphics,Messages;
type
TEdit1 = class(TEdit)
private
FAlignment: TAlignment;
FMouseIn : Boolean;
FFColor1: TColor;
FFColor2: TColor;
procedure SetAlignment(const Value: TAlignment);
procedure SetFColor1(const Value: TColor);
procedure SetFColor2(const Value: TColor);
procedure InvalidateNC;
procedure WMNCPAINT(var msg:TWMNCPaint);message WM_NCPaint;
procedure CMMouseEnter(var msg:TMessage);message CM_MOUSEENTER;
procedure CMMouseLeave(var msg:TMessage);message CM_MOUSELEAVE;
{ Private declarations }
protected
{ Protected declarations }
public
{ Public declarations }
published
{ Published declarations }
property Alignment:TAlignment read FAlignment write SetAlignment;
property FColor1:TColor read FFColor1 write SetFColor1;
property FColor2:TColor read FFColor2 write SetFColor2;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Samples', [TEdit1]);
end;
{ TEdit1 }
procedure TEdit1.CMMouseEnter(var msg: TMessage);
begin
inherited;
FMouseIn := True;
InvalidateNC;
end;
procedure TEdit1.CMMouseLeave(var msg: TMessage);
begin
inherited;
FMouseIn := False;
InvalidateNC;
end;
procedure TEdit1.InvalidateNC;
begin
if Parent = nil then Exit;
SendMessage(Handle,WM_NCPAINT,0,0);
end;
procedure TEdit1.SetAlignment(const Value: TAlignment);
var
style :DWORD;
begin
if FAlignment<>Value then
begin
FAlignment := Value;
style := GetWindowLong(Handle,GWL_STYLE);
style := style and (not ES_LEFT) and (not ES_CENTER) and (not ES_RIGHT);
case FAlignment of
taLeftJustify: SetWindowLong(Handle,GWL_STYLE,style or ES_LEFT);
taRightJustify: SetWindowLong(Handle,GWL_STYLE,style or ES_RIGHT);
taCenter: SetWindowLong(Handle,GWL_STYLE,style or ES_CENTER);
end;
end;
Invalidate;
end;
procedure TEdit1.SetFColor1(const Value: TColor);
begin
FFColor1 := Value;
end;
procedure TEdit1.SetFColor2(const Value: TColor);
begin
FFColor2 := Value;
end;
procedure TEdit1.WMNCPAINT(var msg: TWMNCPaint);
var
dc:HDC;
borderBrush : HBRUSH;
r:TRect;
begin
dc := GetWindowDC(Handle);
try
SetRect(R,0,0,Width,Height);
if FMouseIn then
begin
borderBrush := CreateSolidBrush(FFColor1);
FrameRect(dc,r,borderBrush);
DeleteObject(borderBrush);
InflateRect(r,-1,-1);
end
else
begin
InflateRect(r,-1,-1);
borderBrush := CreateSolidBrush(ColorToRGB(Color));
FrameRect(dc,R,borderBrush);
DeleteObject(borderBrush);
InflateRect(r,1,1);
end;
borderBrush := CreateSolidBrush(FColor2);
FrameRect(dc,r,borderBrush);
DeleteObject(borderBrush);
finally
ReleaseDC(Handle,dc);
end;
end;
end.