Delphi XE7:TEdit TextHint颜色

时间:2015-10-12 13:36:18

标签: delphi vcl editcontrol

我想改为我的TEdits的Texthint的灰色。

我已经找到了https://stackoverflow.com/a/31550017/1862576并尝试通过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;

它会改变字体的大小,但不会改变颜色。 谢谢你的帮助。

2 个答案:

答案 0 :(得分:3)

cue banner是内置于EDIT包装的基础Win32 TEdit控件的功能。它根本不是由VCL管理的。没有暴露Win32 API来管理提示横幅文本的着色。如果您想要自定义着色,则必须停止使用本机提示横幅功能,并通过直接处理其WM_ERASEBKGND和/或WM_PAINT消息来手动自定义编辑控件(请参阅How do i custom draw of TEdit control text? )。否则,您将不得不找到支持自定义着色的第三方编辑控件。或者使用TRichEdit代替TEdit,以便根据需要设置文字颜色。

答案 1 :(得分:2)

defenation

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;