Delphi XE7:TEdit 文本提示颜色

Delphi XE7: TEdit TextHint Color

我想将我的 TEdits 的文本提示更改为灰色。

我已经找到了这个 并尝试像这样通过 SendMessage 更改颜色

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;

它改变了字体的大小而不是颜色。 感谢您的帮助。

提示横幅是 TEdit 包装的基础 Win32 EDIT 控件的内置功能。它根本不受 VCL 管理。没有公开的 Win32 API 来管理提示横幅文本的颜色。如果您想要自定义着色,则必须停止使用本机提示横幅功能并通过直接处理其 WM_ERASEBKGND and/or WM_PAINT 消息来手动自定义绘制编辑控件(请参阅 How do i custom draw of TEdit control text?).否则,您将不得不寻找支持自定义着色的第三方 Edit 控件。或者使用 TRichEdit 而不是 TEdit,这样您就可以根据需要设置文本颜色。

定义:

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;

实施:

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;

用法:

edit1.TextHintColor := clred;