Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Как сделать hint который не изчезает


Автор: Gnusss 12.2.2006, 01:10
Привет всем!

Во многих программах, типа ICQ, hint не изчезает когда на нанего наводят курсор, а наоборот изчезает когда курсор с него уходит.
Как можно сделать такоеже поведание hint'a?

Заранее спасибо!

p.s: Смотрел на torry.net ничего не нашол smile

Автор: Snowy 12.2.2006, 01:23
Создай формочку. Придай ей нужный вид.И показывай ее вместо хинта (по Application.OnHint) в нужном месте.
По событию OnMouseLeave уничтожай.

Автор: Gnusss 12.2.2006, 01:47
А другого более правильного способа нет?
Т.е что-то на основе THintWindow...

Автор: Albinos_x 12.2.2006, 02:20
попробуй это:
Код

  unit FHintWin;

{ -----------------------------------------------------------

TFocusHintWindow --


Вот пример того, как можно использовать TFocusHintWindow.
Данный пример выводит всплывающую подсказку ниже любого
TEdit, имеющего фокус. В противном случае выводится
стандартная подсказка Windows.


unit Unit1;
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls, FHintWin;


type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
FocusHintWindow: TFocusHintWindow;
procedure AppIdle( Sender: TObject; var Done: Boolean );
procedure AppShowHint( var HintStr: string;
var CanShow: Boolean; var HintInfo: THintInfo );
end;


implementation


procedure TForm1.FormCreate( Sender: TObject );
begin
Application.OnIdle := AppIdle;
Application.OnShowHint := AppShowHint;
FocusHintWindow := TFocusHintWindow.Create( Self );
end;


procedure TForm1.AppIdle(Sender: TObject; var Done: Boolean);
begin
FocusHintWindow.Showing := Screen.ActiveControl is TEdit;
end;


procedure TForm1.AppShowHint( var HintStr: string;
var CanShow: Boolean; var HintInfo: THintInfo );
begin
CanShow := not FocusHintWindow.Showing;
end;


end.
----------------------------------------------------------- }


interface


uses SysUtils, WinTypes, WinProcs, Classes, Controls, Forms;


type
TFocusHintWindow = class( THintWindow )
private
FShowing: Boolean;
HintControl: TControl;
protected
procedure SetShowing( Value: Boolean );
function CalcHintRect( Hint: string ): TRect;
procedure Appear;
procedure Disappear;
public
property Showing: Boolean read FShowing write SetShowing;
end;


implementation


function TFocusHintWindow.CalcHintRect( Hint: string ): TRect;
var
Buffer: array[ Byte ] of Char;
begin
Result := Bounds( 0, 0, Screen.Width, 0 );
DrawText( Canvas.Handle, StrPCopy( Buffer, Hint ), -1, Result,
DT_CALCRECT or DT_LEFT or DT_WORDBREAK or DT_NOPREFIX );


with HintControl, ClientOrigin do
OffsetRect( Result, X, Y + Height + 6 );
Inc( Result.Right, 6 );
Inc( Result.Bottom, 2 );
end;


procedure TFocusHintWindow.Appear;
var
Hint: string;
HintRect: TRect;
begin
if ( Screen.ActiveControl = HintControl ) then Exit;


HintControl := Screen.ActiveControl;
Hint := GetShortHint( HintControl.Hint );
HintRect := CalcHintRect( Hint );
ActivateHint( HintRect, Hint );
FShowing := True;
end;


procedure TFocusHintWindow.Disappear;
begin
HintControl := nil;
ShowWindow( Handle, SW_HIDE );
FShowing := False;
end;


procedure TFocusHintWindow.SetShowing( Value: Boolean );
begin
if Value then Appear else Disappear;
end;


end. 

Добавлено @ 02:22
или вот это:
Код

{Появление}
IF h<>nil H.ReleaseHandle; {если чей-то хинт yже был, то его погасить}
H:=THintWindow.Create(Окно-владелец хинта);
H.ActivateHint(H.CalcHintRect(...),'hint hint nint');
....
{UnПоявление :) - это возможно пpидется повесить на таймеp, котоpый бyдет
обнyляться пpи каждом новом появлении хинта}
IF h<>nil H.ReleaseHandle;


Автор: Gnusss 12.2.2006, 13:07
В моем понимание "правильный способ" это когда нинадо делать не какого паявления и unПоявления. Надо просто зделать правильный наследник THintWindow или перехватыват какието ообщени. Ведь в ICQ же сделали.
Если в качестве примера не нравится ICQ то возмите BDS-2006(Делфи), там в редакторе кода всплывает hint который ведет себя так как мне надо.

Автор: z-END 12.2.2006, 13:41
может HintHidePause поставить равным одному году? smile

Автор: Gnusss 12.2.2006, 14:55
Можно хоть два года ставить в HintHidePause, даже -1 можно, все-ровно хинт изчезнет когда курсор уйдет за пределы контора от которого показан хинт.

Автор: Albinos_x 12.2.2006, 15:10
Цитата(Gnusss @ 12.2.2006, 01:10 Найти цитируемый пост)
а нанего наводят курсор, а наоборот изчезает когда курсор с него уходит


Цитата(Gnusss @ 12.2.2006, 14:55 Найти цитируемый пост)
все-ровно хинт изчезнет когда курсор уйдет за пределы контора от которого показан хинт

так что нужно?

Автор: Gnusss 12.2.2006, 15:41
Цитата(Albinos_x @ 12.2.2006, 15:10 Найти цитируемый пост)
так что нужно?

Посмотри как в ICQ работает hint, вот мне надо тоже самое.

Автор: Albinos_x 12.2.2006, 16:16
тогда что мешает использовать даже вот это:
Цитата(Albinos_x @ 12.2.2006, 02:20 Найти цитируемый пост)
{Появление}
IF h<>nil H.ReleaseHandle; {если чей-то хинт yже был, то его погасить}
H:=THintWindow.Create(Окно-владелец хинта);
H.ActivateHint(H.CalcHintRect(...),'hint hint nint');
....
{UnПоявление smile - это возможно пpидется повесить на таймеp, котоpый бyдет
обнyляться пpи каждом новом появлении хинта}
IF h<>nil H.ReleaseHandle;

обрабатыеваешь события:
OnMouseMove
и
Цитата(Snowy)

OnMouseLeave

Автор: Gnusss 12.2.2006, 17:54
Цитата(Albinos_x @ 12.2.2006, 16:16 Найти цитируемый пост)
тогда что мешает использовать даже вот это:

Вот это:
Цитата(Gnusss @ 12.2.2006, 13:07 Найти цитируемый пост)
В моем понимание "правильный способ" это когда нинадо делать не какого паявления и unПоявления. Надо просто зделать правильный наследник THintWindow или перехватыват какието сообщения. Ведь в ICQ же сделали.
Если в качестве примера не нравится ICQ то возмите BDS-2006(Делфи), там в редакторе кода всплывает hint который ведет себя так как мне надо.

Автор: volvo877 12.2.2006, 17:59
Gnusss, и ты, конечно, уверен, что в ICQ сделали Hint именно "правильным" (с твоей точки зрения) способом? А с чего это ты так уверен в этом, можно поинтересоваться?

Откуда ты знаешь, КАК это реализовано в BDS-2006?

Автор: Gnusss 12.2.2006, 18:27
ну насчет ICQ не уверен, а вот в BDS(как я понял) на обычном наследнике ThintWindow лежит TWebB...

Автор: Gnusss 12.2.2006, 21:16
я и не говорю что всё просто. я говорю что я думаю что есть возможность создать такое поведение hint'a средствами наследования его от thintwidnow или перехватом какихто сообщений. для примера можно изучить работу тех функций tapplication работа которых связана с хинтом. я к тому виду что решение с появлением и unпоявлением является поверхносным и что можно сделать намно лучше, и по мойму правильнее.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)