Ткните меня куда-нибудь носом на эту тему
Нестандартный Hint
Модератор: Модераторы
- Nik
- энтузиаст
- Сообщения: 573
- Зарегистрирован: 03.02.2006 23:08:09
- Откуда: Киров
- Контактная информация:
Нестандартный Hint
Понадобилось сделать Hint с нестандартным содержанием (в иделе - использовать вместо Hinta свой ListBox с кастомной отрисовкой). Но в какую сторону копать - вообще не могу придумать. Нашел пару Delphi-примеров по отрисовке кастомных Hint'ов, но там описано только изменение шрифта, а этого мало.
Ткните меня куда-нибудь носом на эту тему
Ткните меня куда-нибудь носом на эту тему
Создайте форму без рамки и показывайте её вместо хинта.
Смотрим у Application. Там есть что-то типа OnHint.
- Nik
- энтузиаст
- Сообщения: 573
- Зарегистрирован: 03.02.2006 23:08:09
- Откуда: Киров
- Контактная информация:
Есть, ага, но как перекрыть чем-то совсем нестандартным - хз пока. Тупо фон поменять - без проблем, кастомную отрисовку на канве - тоже. А вот засунуть контрол вместо хинта пока не получается. И нагуглить ничего на эту тему пока тоже не могу, блин.
В модуле forms смотрите в сторону THintWindow, THintWindowClass и переменную HintWindowClass 
- Brainenjii
- энтузиаст
- Сообщения: 1351
- Зарегистрирован: 10.05.2007 00:04:46
Код: Выделить всё
Unit Unit1;
{$mode objfpc}{$H+}
Interface
Uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
Buttons;
Type
{ BHintForm }
{ BHintFormClass }
BHintFormClass = Class(TForm)
Private
bBox: TListBox;
Public
Property Box: TListBox Read bBox;
Procedure ShowMe;
Constructor Build;
Destructor Burn;
End;
Type
{ TForm1 }
TForm1 = Class(TForm)
Procedure FormCreate(Sender: TObject);
Private
{ private declarations }
bHintForm: BHintFormClass;
Public
{ public declarations }
Procedure MyOnHint(Sender: TObject);
End;
Var
Form1: TForm1;
Implementation
{$R *.lfm}
{ TForm1 }
Procedure TForm1.FormCreate(Sender: TObject);
Var
i: Integer;
Begin
bHintForm := BHintFormClass.Build;
For i := 1 To 3 Do
With TSpeedButton.Create(Self) Do
Begin
Parent := Self;
ShowHint := TRUE;
Caption := IntToStr(i);
Hint := Caption;
Left := i * (Width + 10);
End;
Application.OnHint := @MyOnHint;
end;
Procedure TForm1.MyOnHint(Sender: TObject);
Begin
Application.HideHint;
Application.ProcessMessages;
bHintForm.ShowMe;
Application.ShowHint := TRUE;
End;
{ BHintFormClass }
Procedure BHintFormClass.ShowMe;
Begin
Top := Mouse.CursorPos.Y;
Left := Mouse.CursorPos.X;
Show;
End;
Constructor BHintFormClass.Build;
Begin
Inherited Create(Application);
bBox := TListBox.Create(Self);
bBox.Parent := Self;
bBox.Align := alClient;
Width := 100;
Height := 100;
BorderStyle := bsNone;
End;
Destructor BHintFormClass.Burn;
Begin
Box.Free;
Inherited Destroy;
End;
End.
Вот создание формы ^_^ Правда её ещё и прятать, и узнавать откуда хинт пришёл >_<
- Nik
- энтузиаст
- Сообщения: 573
- Зарегистрирован: 03.02.2006 23:08:09
- Откуда: Киров
- Контактная информация:
2Brainenjii
Спасибо! Попробую поэкспериментировать. Ещё придумал немного извращённый метод с непосредственным показом ListBox в нужной точке экрана после небольшой паузы. Может чего дельное и выйдет в итоге
Добавлено спустя 39 минут 6 секунд:
Таки сделал Hint из формы, всё работает отлично, но есть одно маленькое "но". При показе формы-хинта главное окно теряет фокус (что логично). Если вернуть фокус принудительно (SetFocus для контрола, вызвавшего подсказку), то "падает" вниз (под родительское окно). Если форме-хинту поставить Style = StayOnTop, то поведение приходит в норму, но при этом форма игнорирует свойство BorderStyle и всегда показывается с рамкой и заголовком.
Собственно, вопрос вот в чём. Как показать форму без бордера поверх всех окно так, чтобы она при этом не забирада фокус у родительского окна.
Добавлено спустя 5 минут 25 секунд:
Всё, кажется пофиксил, теперь работает точно как задумано
Спасибо! Попробую поэкспериментировать. Ещё придумал немного извращённый метод с непосредственным показом ListBox в нужной точке экрана после небольшой паузы. Может чего дельное и выйдет в итоге
Добавлено спустя 39 минут 6 секунд:
Таки сделал Hint из формы, всё работает отлично, но есть одно маленькое "но". При показе формы-хинта главное окно теряет фокус (что логично). Если вернуть фокус принудительно (SetFocus для контрола, вызвавшего подсказку), то "падает" вниз (под родительское окно). Если форме-хинту поставить Style = StayOnTop, то поведение приходит в норму, но при этом форма игнорирует свойство BorderStyle и всегда показывается с рамкой и заголовком.
Собственно, вопрос вот в чём. Как показать форму без бордера поверх всех окно так, чтобы она при этом не забирада фокус у родительского окна.
Добавлено спустя 5 минут 25 секунд:
Всё, кажется пофиксил, теперь работает точно как задумано
