3

TEdit の 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コントロールに組み込まれている機能です。TEditVCL ではまったく管理されません。キュー バナー テキストの色を管理するために公開されている 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 に答える