2015-10-12 5 views
2

Я хотел бы изменить серый цвет Texthint моих TEdits.Delphi XE7: TEdit TextHint Color

Я Allready нашел 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

Проблема заключается в том, что с вашим кодом вы меняете C olor для текста TEdit, а не HintText. Теперь я даже не уверен, что VCL предоставляет цвет TextHint или если он, возможно, жестко закодирован. – SilverWarior

+0

Нет функциональности цветового баннера, отображаемого базовым API Win32, поэтому невозможно применить пользовательские цвета к тексту знака баннера. –

ответ

3

Цинк-баннер - это функция, встроенная в базовый элемент управления Win32 EDIT, который обертывает TEdit. Он вообще не управляется VCL. Для управления раскраски текста баннерной подсказки нет API Win32. Если вам нужна пользовательская раскраска, вам придется прекратить использование функций собственного баннерного знака и индивидуально нарисовать элемент управления редактированием вручную, обратившись непосредственно к его сообщениям WM_ERASEBKGND и/или WM_PAINT (см. How do i custom draw of TEdit control text?). В противном случае вам придется найти сторонний элемент управления Edit, который поддерживает пользовательскую раскраску. Или используйте TRichEdit вместо TEdit, чтобы вы могли установить цвет текста по мере необходимости.

1

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;