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

Материал из DRKB

Изменить цвет неактивного 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.


Language: en
Source: Взято с сайта: http://www.swissdelphicenter.ch
ID: 00980