Philipp H.
Philipp H.

Reputation: 562

Delphi XE7: TEdit TextHint Color

i would like to change to gray color of the Texthint of my TEdits.

I allready found this https://stackoverflow.com/a/31550017/1862576 and tried to change to color via SendMessage like this

procedure TEdit.DoSetTextHint(const Value: string);
var
  Font: TFont;
begin
  if CheckWin32Version(5, 1) and StyleServices.Enabled and HandleAllocated then
  begin
    Font := TFont.Create;
    try
      Font.Assign(self.Font);
      Font.Color := clGreen;
      Font.Size := 20;

      SendTextMessage(Handle, EM_SETCUEBANNER, WPARAM(1), Value);
      SendMessage(Handle, WM_SETFONT, Integer(Font.Handle), Integer(True));
    finally
//      Font.Free;
    end;
  end;    
end;

It changes the size of the font but not the color. Thanks for your help.

Upvotes: 3

Views: 2504

Answers (2)

Egor
Egor

Reputation: 81

Definition:

Type
    HitColor = class helper  for tEdit
      private
        procedure SetTextHintColor(const Value: TColor);
        function GetTextHintColor: TColor;
        procedure fixWndProc(var Message: TMessage);
    published
       property TextHintColor : TColor  read GetTextHintColor write SetTextHintColor;
     end;

Implementation:

procedure HitColor.fixWndProc(var Message: TMessage);
var
  dc : HDC ;
  r : TRect ;
  OldFont: HFONT;
  OldTextColor: TColorRef;
  Handled : boolean;
begin
     Handled := false;
     if   (Message.Msg = WM_PAINT)  and (Text  = '') and not Focused then
                  begin

                    self.WndProc(Message);
                    self.Perform(EM_GETRECT, 0, LPARAM(@R));
                    dc := GetDC(handle);
                   try
                      OldFont := SelectObject(dc,  Font.Handle );
                      OldTextColor := SetTextColor(DC,  ColorToRGB(GetTextHintColor));

                      FillRect(dc,r,0);
                      DrawText(DC, PChar(TextHint), Length(TextHint), R, DT_LEFT or DT_VCENTER or DT_SINGLELINE or DT_NOPREFIX);
                    finally
                       SetTextColor(DC, OldTextColor);
                       SelectObject(DC, OldFont);
                       ReleaseDC(handle,dc);
                    end;
                  Handled := true;
                end;




    if not Handled then WndProc(Message);

end;

function HitColor.GetTextHintColor: TColor;
begin
  result := tag;
end;

procedure HitColor.SetTextHintColor(const Value: TColor);
begin
  tag :=  Value;
  WindowProc := fixWndProc ;
end;

Usage:

edit1.TextHintColor := clred;

Upvotes: 5

Remy Lebeau
Remy Lebeau

Reputation: 597941

The cue banner is a feature built in to the underlying Win32 EDIT control that TEdit wraps. It is not managed by the VCL at all. There is no Win32 API exposed to manage the coloring of the cue banner text. If you want custom coloring, you will have to stop using the native cue banner functionality and custom-draw the edit control manually by handling its WM_ERASEBKGND and/or WM_PAINT messages directly (see How do i custom draw of TEdit control text?). Otherwise, you will have to find a third-party Edit control that supports custom coloring. Or use TRichEdit instead of TEdit so you can set text colors as needed.

Upvotes: 4

Related Questions