首页  编辑  

更改TEdit控件禁止状态的颜色

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

Author: P. Below

{Question:

How can I change the color of a disabled (Edit1.Enabled := false;) control?

I do not want the normal grey color.

Answer:

Two options:

1) place the control on a panel and disable the panel instead of the control.

This way the color stays to whatever you set it.

2) make a descendent and take over the painting when it is disabled.

Here is an example:}

unit PBExEdit;

interface

uses

 Windows, Messages, SysUtils, Classes, Graphics, Controls,

 Forms, Dialogs, StdCtrls;

type

 TPBExEdit = class(TEdit)

 private

   { Private declarations }

   FDisabledColor: TColor;

   FDisabledTextColor: TColor;

   procedure WMPaint(var msg: TWMPaint); message WM_PAINT;

   procedure WMEraseBkGnd(var msg: TWMEraseBkGnd); message WM_ERASEBKGND;

   procedure SetDisabledColor(const Value: TColor); virtual;

   procedure SetDisabledTextColor(const Value: TColor); virtual;

 protected

   { Protected declarations }

 public

   { Public declarations }

   constructor Create(aOwner: TComponent); override;

 published

   { Published declarations }

   property DisabledTextColor: TColor read FDisabledTextColor

     write SetDisabledTextColor default clGrayText;

   property DisabledColor: TColor read FDisabledColor

     write SetDisabledColor default clWindow;

 end;

procedure Register;

implementation

procedure Register;

begin

 RegisterComponents('PBGoodies', [TPBExEdit]);

end;

constructor TPBExEdit.Create(aOwner: TComponent);

begin

 inherited;

 FDisabledColor := clWindow;

 FDisabledTextColor := clGrayText;

end;

procedure TPBExEdit.SetDisabledColor(const Value: TColor);

begin

 if FDisabledColor <> Value then

 begin

   FDisabledColor := Value;

   if not Enabled then

     Invalidate;

 end;

end;

procedure TPBExEdit.SetDisabledTextColor(const Value: TColor);

begin

 if FDisabledTextColor <> Value then

 begin

   FDisabledTextColor := Value;

   if not Enabled then

     Invalidate;

 end;

end;

procedure TPBExEdit.WMEraseBkGnd(var msg: TWMEraseBkGnd);

var

 Canvas: TCanvas;

begin

 if Enabled then

   inherited

 else

 begin

   Canvas:= TCanvas.Create;

   try

     Canvas.Handle := msg.DC;

     SaveDC(msg.DC);

     try

       canvas.Brush.Color := FDisabledColor;

       canvas.Brush.Style := bsSolid;

       canvas.Fillrect(clientrect);

       msg.Result := 1;

     finally

       RestoreDC(msg.DC, - 1);

     end;

   finally

     canvas.free

   end;

 end;

end;

procedure TPBExEdit.WMPaint(var msg: TWMPaint);

var

 Canvas: TCanvas;

 ps: TPaintStruct;

 CallEndPaint: Boolean;

begin

 if Enabled then

   inherited

 else

 begin

   CallEndPaint := False;

   Canvas:= TCanvas.Create;

   try

     if msg.DC <> 0 then

     begin

       Canvas.Handle := msg.DC;

       ps.fErase := true;

     end

     else

     begin

       BeginPaint(Handle, ps);

       CallEndPaint:= True;

       Canvas.handle := ps.hdc;

     end;

     if ps.fErase then

       Perform(WM_ERASEBKGND, Canvas.Handle, 0);

     SaveDC(canvas.handle);

     try

       Canvas.Brush.Style := bsClear;

       Canvas.Font := Font;

       Canvas.Font.Color := FDisabledTextColor;

       Canvas.TextOut(1, 1, Text);

     finally

       RestoreDC(Canvas.Handle, - 1);

     end;

   finally

     if CallEndPaint then

       EndPaint(handle, ps);

     Canvas.Free

   end;

 end;

end;