Code: |
{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.
|
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!