При использовании TballoonHint
мне нужны более персонализированные цвета, форма, прозрачность и анимированный внешний вид, как я могу это сделать?
Я хочу более персонализированный BalloonHint (цвет фона/закругленный угол/прозрачность)
Ответы (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
Спасибо, но не могли бы вы дать мне код, я не эксперт в Delphi.
- person ghaek741977; 27.12.2013
Спасибо, Кен Уайт, это очень полезно.
- person ghaek741977; 30.12.2013
Вы делаете то же самое, за исключением того, что вместо этого вы спускаетесь из окна всплывающей подсказки. Я не собираюсь кормить вас кодом с ложки; Я показал вам, что вам нужно сделать. Вам нужно выяснить, как заставить его работать для ваших нужд сейчас. :-)
- person Ken White; 30.12.2013
type TMyHintWindow=класс(TBalloonHint) защищенная процедура Paint; переопределить; процедура NCPaint(DC:HDC); переопределить;
- person ghaek741977; 01.01.2014
‹код›тип TMyHintWindow=класс(TBalloonHint) защищенная процедура Paint; переопределить; процедура NCPaint(DC:HDC); переопределить; код>
- person ghaek741977; 01.01.2014