3

我想将我的 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;

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

4

2 回答 2

4

提示横幅是一种内置于封装的底层 Win32EDIT控件的功能。TEdit它根本不受 VCL 管理。没有公开 Win32 API 来管理提示横幅文本的颜色。如果您想要自定义颜色,您将不得不停止使用本机提示横幅功能并通过直接处理其WM_ERASEBKGND和/或WM_PAINT消息来手动自定义绘制编辑控件(请参阅我如何自定义绘制 TEdit 控件文本?)。否则,您将不得不找到支持自定义着色的第三方编辑控件。或使用TRichEdit代替,TEdit以便您可以根据需要设置文本颜色。

于 2015-10-12T21:00:46.127 回答
4

定义:

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;
于 2015-10-28T16:05:41.260 回答