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

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

{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.

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

Отправить комментарий

Проверка
Антиспам проверка
Image CAPTCHA
...