![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как использовать свою форму для ToolTips [D7, WinXP]
Кашперук Иван © (2006-03-12 05:27:00)Хочу сделать сабж - показывать форму при наведении на элемент в главной форме, ждать пару сек, (2500 мсек вообще-то по умолчанию для Подсказок), и закрывать ее.
Чтоб работало хотя-бы чуточку похоже на Hint стандартный-а на форму я хочу кинуть, скажем, пару кнопок и листбокс.
Кашперук Иван (2006-03-13 17:02:00) [1]Вот нашел ответ на свой вопрос на загран. форуме
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
FFocusControl: TControl;
procedure ApplicationIdle(Sender: TObject; var Done: Boolean);
public
{ Public declarations }
procedure OnEnter(Sender: TObject);
procedure OnExit(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
FFocusControl := nil;
Application.OnIdle := ApplicationIdle;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
Application.OnIdle := nil;
end;
procedure TForm1.ApplicationIdle(Sender: TObject; var Done: Boolean);
var
CurControl: TControl;
P: TPoint;
begin
GetCursorPos(P);
CurControl := FindDragTarget(P, True);
if FFocusControl <> CurControl then
begin
if FFocusControl <> nil then
OnExit(FFocusControl);
FFocusControl := CurControl;
if FFocusControl <> nil then
OnEnter(FFocusControl);
end;
end;
procedure TForm1.OnEnter(Sender: TObject);
begin
//OnEnter code
If sender=Button1 then begin
Label1.caption:='Hello';
Button1.Caption:='Exit';
end;
end;
procedure TForm1.OnExit(Sender: TObject);
begin
//OnExit code
If sender=Button1 then begin
Label1.caption:='Godbye';
Button1.Caption:='Enter';
end;
end;
end.
REA (2006-03-13 12:17:00) [2]Можно перекрыть стандартный класс и присвоить переменную HintWindowClass.
Жуков Олег (2006-03-13 09:59:00) [3]>Кашперук Иван
Я про OnHint ничего не говорил
Glex (2006-03-13 08:32:00) [4]CM_MOUSELEAVE
CM_MOUSEENTER
Поищи поиском.
А ещё совет: www.drkb.ru =)
Кашперук Иван (2006-03-13 01:50:00) [5]Пардон - у контрола на форме ToolTipa просто стояло Visible = False :)
И вот теперь, последний вопрос:
Как, не создавай свой компонент-наследник обработать OnMouseLeave и OnMouseEnter?
Кашперук Иван (2006-03-13 00:36:00) [6]Ну, так именно как вы написали - не совсем верно, и вот почему:
1. OnHint срабатывает, как только попадаем на контрол, а для обычного хинта там еще всякие задержки, т.д.
Но это обходится Таймерами.
Но я все-таки решил делать это на OnMouseMove - у меня просто не отдельно стоящие контролы, а строки грида, поэтому чуть по-другому.
2. ShowWindow с параметром SW_SHOWNA или SW_SHOWNOACTIVATE плохо работает в данном случае - и вот в чем бы я хотел помощь - потому что HintForm.Show делает эту форму активной.
Вместо нормально отображения формы со всеми на ней контролами отображается только сама форма - не пойму почему, то ли контролы не создаются, то ли еще что-то.
Кто подскажет?
Жуков Олег (2006-03-12 14:36:00) [7]Контролы показывают хинт, когда им приходит сообщение CM_HINTSHOW. Надо написать наследников от этих контролов, и в них перекрыть обработку этого сообщения. Показывать форму подсказки функцией ShowWindow(HintForm.Handle, SW_SHOWNOACTIVATE). Прятать соответсвенно ShowWindow(HintForm.Handle, SW_HIDE). Я не знаю, приходит ли сообщение о том, что надо спрятать хинт, но по умолчанию подсказка спрятаться она должна через Application.HintPause или при покидании курсором мыши области контрола (WM_MOUSELEAVE, предварительно в MouseMove подписаться на получение этого сообщения функцией TrackMouseEvent).
Кашперук Иван (2006-03-12 12:34:00) [8]Нуу, собственно - ничего не получается - плохо происходит обновление - или моментально (MouseMove то очень часто отрабатывает), или не очень похоже на стандартный (если делаю открытие по левому клику)
Хотелось бы кратенькое руководсво, если можно. Или примерчик.
Glex (2006-03-12 09:53:00) [9]А что не получается?