Подключите модуль CoolHint к любому проекту и пользуйтесь
unit CoolHint;
interfaceuses
Windows, Classes, Controls, Forms, Messages, Graphics;
type
TddgHintWindow = class(THintWindow)
private
FRegion: THandle;
procedure FreeCurrentRegion;
publicdestructor Destroy; override;
procedure ActivateHint(Rect: TRect; const AHint: string); override;
procedure Paint; override;
procedure CreateParams(var Params: TCreateParams); override;
end;
implementationdestructor TddgHintWindow.Destroy;
begin
FreeCurrentRegion;
inherited;
Destroy;
end;
procedure TddgHintWindow.CreateParams(var Params: TCreateParams);
{ We need to remove the border created on the Windows API-level }{ when the window is created. }begininherited; // ???
CreateParams(Params);
Params.Style := Params.Style andnot ws_Border; // remove borderend;
procedure TddgHintWindow.FreeCurrentRegion;
{ Regions, like other API objects, should be freed when you are }{ through using them. Note, however, that you cannot delete a }{ region which is currently set in a window, so this method sets }{ the window region to 0 before deleting the region object. }beginif FRegion <> 0 then// if Region is alive...begin
SetWindowRgn(Handle, 0, True); // set win region to 0
DeleteObject(FRegion); // kill the region
FRegion := 0; // zero out fieldend;
end;
procedure TddgHintWindow.ActivateHint(Rect: TRect; const AHint: string);
{ Called when the hint is activated by putting the mouse pointer }{ above a control. }beginwith Rect do
Right := Right + Canvas.TextWidth('WWWW'); // add some slop
BoundsRect := Rect;
FreeCurrentRegion;
with BoundsRect do{ Create a round rectangular region to display the hint window }
FRegion := CreateRoundRectRgn(0, 0, Width, Height, Width, Height);
if FRegion <> 0 then
SetWindowRgn(Handle, FRegion, True); // set win regioninherited;
ActivateHint(Rect, AHint); // call inheritedend;
procedure TddgHintWindow.Paint;
{ This method gets called by the WM_PAINT handler. It is }{ responsible for painting the hint window. }var
R: TRect;
begin
R := ClientRect; // get bounding rectangle
Inc(R.Left, 1); // move left side slightly
Canvas.Font.Color := clInfoText; // set to proper color{ paint string in the center of the round rect }
DrawText(Canvas.Handle, PChar(Caption), Length(Caption), R, DT_NOPREFIX or DT_WORDBREAK or DT_CENTER or DT_VCENTER);
end;
var
OldHintClass: THintWindowClass;
function SetNewHintClass(AClass: THintWindowClass): THintWindowClass;
var
DoShowHint: Boolean;
begin
Result := HintWindowClass; // return value is old hint window
DoShowHint := Application.ShowHint;
if DoShowHint then
Application.ShowHint := False; // destroy old hint window
HintWindowClass := AClass; // assign new hint windowif DoShowHint then
Application.ShowHint := True; // create new hint windowend;
initialization
OldHintClass := SetNewHintClass(TddgHintWindow);
finalization
SetNewHintClass(OldHintClass);
end.
Эта единица Delphi предлагает реализацию класса TddgHintWindow, который наследуется от класса THintWindow и используется для отображения подсказок или всплывающих окон для контролов в графическом пользовательском интерфейсе.
Класс TddgHintWindow переопределяет несколько методов:
Метод ActivateHint вызывается, когда подсказка активируется, помещая указатель мыши над контролом. Он создает круглый прямоугольник с помощью функции CreateRoundRectRgn, устанавливает его как регион окна, и затем вызывает метод ActivateHint, наследуемый от класса THintWindow.
Метод Paint отвечает за рисование подсказки. Он получает клиентский прямоугольник, смещает левую сторону слегка, устанавливает цвет шрифта в подходящий для него, и затем рисует текст в центре круглого прямоугольника с помощью функции DrawText.
Единица также включает несколько других процедур:
Процедура FreeCurrentRegion используется для освобождения любого существующего региона, связанного с окном.
Процедура CreateParams переопределяется для удаления рамки, создаваемой на уровне API Windows при создании окна.
Деструктор Destroy вызывает процедуру FreeCurrentRegion и затем вызывает метод Destroy, наследуемый от класса THintWindow.
Единица также включает функцию SetNewHintClass, которая позволяет установить новый класс подсказки. Она временно устанавливает Application.ShowHint в значение False, присваивает новый класс подсказки, и затем устанавливает Application.ShowHint обратно в его оригинальное значение, если это необходимо.
В секции инициализации единицы OldHintClass присваивается текущий класс подсказки, а затем вызывается SetNewHintClass(TddgHintWindow), чтобы заменить старый класс подсказки на новый.
В секции финализации единицы вызывается SetNewHintClass(OldHintClass), чтобы восстановить оригинальный класс подсказки.
В целом, эта единица предлагает реализацию custom hint window, который может использоваться в приложениях Delphi.
Подключите модуль CoolHint к любому проекту и используйте его для создания hint-окна с круглым краем.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.