Чтобы увидеть это в действии, всё, что надо сделать, это поместить этот юнит в список USES Вашего приложения
unit HintX;
interfaceuses
Windows, Messages, Controls;
type
TIconHintX = class(THintWindow)
protectedprocedure Paint; override;
publicfunction CalcHintRect(MaxWidth: Integer; const AHint: string;
AData: Pointer): TRect; override;
end;
implementationuses Forms;
{ TIconHintX }{-Вычисляем новый размер окошка подсказки
для помещения в него иконки:-}function TIconHintX.CalcHintRect(MaxWidth: Integer;
const AHint: string; AData: Pointer): TRect;
begin
Result := inherited CalcHintRect(MaxWidth, AHint, AData);
Result.Right := (Length(AHint) * 5) + Application.Icon.Width;
Result.Bottom := (Application.Icon.Height) * 2;
end;
procedure TIconHintX.Paint;
const
MARGIN = 5;
begininherited;
Canvas.Draw(MARGIN, MARGIN * 5, Application.Icon);
//рисуем рамку окошка подсказки
SendMessage(Handle, WM_NCPAINT, 0, 0);
end;
initialization//связываем наш новый класс с классом окошка//подсказки установленным поумолчанию:
HintWindowClass := TIconHintX;
end.
Программный код, который вы предоставили, является единицей для создания пользовательского окна подсказки с иконкой в Delphi. Класс TIconHintX переопределяет метод CalcHintRect, чтобы рассчитать размер окна подсказки в зависимости от длины текста подсказки и размера иконки, а также метод Paint, чтобы нарисовать иконку внутри окна подсказки.
Чтобы поместить иконку в окно подсказки, вы можете использовать метод Canvas.Draw для рисования иконки на конкретной позиции. В этом коде иконка рисуется в верхнем левом углу канваса с отступом в 5 пикселей вокруг нее.
Вот как можно модифицировать код, чтобы поместить иконку в центр окна подсказки:
procedureTIconHintX.Paint;constMARGIN=5;begininherited;// Рассчитать позицию для иконкиvarIconPosition:TPoint;IconPosition.X:=(Result.Right-Application.Icon.Width)div2;IconPosition.Y:=(Result.Bottom-Application.Icon.Height)div2;// Нарисовать иконку на рассчитанной позицииCanvas.Draw(IconPosition.X,IconPosition.Y,Application.Icon);// Нарисовать рамку вокруг иконкиSendMessage(Handle,WM_NCPAINT,0,0);end;
В этом модифицированном коде мы сначала рассчитываем позицию для иконки, вычитая половину ее ширины и высоты из правой и нижней границ окна подсказки. Затем мы рисуем иконку на этой позиции с помощью метода Canvas.Draw. Наконец, мы вызываем SendMessage(Handle, WM_NCPAINT, 0, 0) для перерисовки рамки вокруг иконки.
Также вы можете модифицировать метод CalcHintRect, чтобы изменить размер окна подсказки в зависимости от размера иконки:
functionTIconHintX.CalcHintRect(MaxWidth:Integer;constAHint:string;AData:Pointer):TRect;beginResult:=inheritedCalcHintRect(MaxWidth,AHint,AData);// Изменить ширину и высоту для учета иконкиResult.Right:=MaxWidth;Result.Bottom:=Application.Icon.Height+(Application.Icon.Heightdiv2);end;
В этом модифицированном коде мы устанавливаем правую границу окна подсказки равной MaxWidth, чтобы иконка была центрирована горизонтально. Мы также изменяем нижнюю границу, установив ее равной высоте иконки плюс половина ее высоты, чтобы иконка была центрирована вертикально.
Сделав эти модификации, вы можете поместить иконку в окно подсказки и иметь ее центрированной как горизонтально, так и вертикально.
В статье описывается, как поместить иконку в окошко подсказки в приложении Delphi, для чего создается новый классHintWindow и переопределяются методы CalcHintRect и Paint.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.