Change the color of a disabled TEdit (Views: 39)
Problem/Question/Abstract: How can I change the color of a disabled (Edit1.Enabled := false;) control? I do not want the normal grey color. Answer: Two options: Place the control on a panel and disable the panel instead of the control. This way the color stays to whatever you set it. Or 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. |