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

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

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.

Пример вывода (некрасиво, но работает):

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

Другие вопросы по тегам