Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Изменить цвет неактивного TEdit

01.01.2007
{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;
 
 
end.
 

Взято с сайта: https://www.swissdelphicenter.ch