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;
我想将我的 TEdits 的文本提示更改为灰色。
我已经找到了这个
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;