我想改为我的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;
它会改变字体的大小,但不会改变颜色。 谢谢你的帮助。
答案 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;