Я хочу более персонализированный BalloonHint (цвет фона/закругленный угол/прозрачность)

При использовании TballoonHint мне нужны более персонализированные цвета, форма, прозрачность и анимированный внешний вид, как я могу это сделать?


person ghaek741977    schedule 23.12.2013    source источник


Ответы (1)


Создайте собственного потомка TBalloonHint или THintWindow. Переопределите метод NCPaint для отрисовки внешних краев (неклиентской области) и CalcHintRect (при необходимости) и предоставьте собственный метод Paint для отрисовки внутренней части так, как вы хотите.

Затем назначьте его Application.HintWindowClass в файле .dpr непосредственно перед вызовом Application.Run.

Вот (очень минимальный) пример, который ничего не делает, кроме как закрашивает стандартное окно подсказки зеленым фоном.

Сохраните это как MyHintWindow.pas:

unit MyHintWindow;

interface

uses
  Windows, Controls;

type
  TMyHintWindow=class(THintWindow)
  protected
    procedure Paint; override;
    procedure NCPaint(DC: HDC); override;
  public
    function CalcHintRect(MaxWidth: Integer; const AHint: string; AData: Pointer): TRect;
      override;
  end;

implementation

uses
  Graphics;

{ TMyHintWindow }

function TMyHintWindow.CalcHintRect(MaxWidth: Integer; 
  const AHint: string; AData: Pointer): TRect;
begin
  // Does nothing but demonstrate overriding.
  Result := inherited CalcHintRect(MaxWidth, AHint, AData);
  // Change window size if needed, using Windows.InflateRect with Result here
end;

procedure TMyHintWindow.NCPaint(DC: HDC);
begin
  // Does nothing but demonstrate overriding. Changes nothing.
  // Replace drawing of non-client (edges, caption bar, etc.) with your own code
  // here instead of calling inherited. This is where you would change shape 
  // of hint window
  inherited NCPaint(DC);
end;

procedure TMyHintWindow.Paint;
begin
  // Draw the interior of the window. This is where you would change inside color,
  // draw icons or images or display animations. This code just changes the
  // window background (which it probably shouldn't do here, but is for demo 
  // purposes only.
  Canvas.Brush.Color := clGreen;
  inherited;
end;

end.

Пример проекта для его использования:

  • Создайте новое приложение форм VCL.
  • Установите для свойства Form1.ShowHint значение True в инспекторе объектов.
  • Отбросьте любой элемент управления (например, TEdit) в форму и поместите текст в его свойство Hint.
  • Используйте меню Project->View Source, чтобы отобразить исходный код проекта.

Добавьте указанные строки в исходники проекта:

program Project1;

uses
  Forms,
  MyHintWindow,                // Add this line
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
  Application.Initialize;
  HintWindowClass := TMyHintWindow;      // Add this line
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

Пример вывода (уродливый, но работает):

Изображение элемента управления заметками с уродливой зеленой всплывающей подсказкой

person Ken White    schedule 23.12.2013
comment
Спасибо, но не могли бы вы дать мне код, я не эксперт в Delphi. - person ghaek741977; 27.12.2013
comment
Спасибо, Кен Уайт, это очень полезно. - person ghaek741977; 30.12.2013
comment
Вы делаете то же самое, за исключением того, что вместо этого вы спускаетесь из окна всплывающей подсказки. Я не собираюсь кормить вас кодом с ложки; Я показал вам, что вам нужно сделать. Вам нужно выяснить, как заставить его работать для ваших нужд сейчас. :-) - person Ken White; 30.12.2013
comment
type TMyHintWindow=класс(TBalloonHint) защищенная процедура Paint; переопределить; процедура NCPaint(DC:HDC); переопределить; - person ghaek741977; 01.01.2014
comment
‹код›тип TMyHintWindow=класс(TBalloonHint) защищенная процедура Paint; переопределить; процедура NCPaint(DC:HDC); переопределить; - person ghaek741977; 01.01.2014