Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как сделать hint который не изчезает, при наведении курсора мышки 
:(
    Опции темы
Gnusss
  Дата 12.2.2006, 01:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 19.1.2005

Репутация: нет
Всего: нет



Привет всем!

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

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

p.s: Смотрел на torry.net ничего не нашол smile
PM MAIL   Вверх
Snowy
Дата 12.2.2006, 01:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



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

PM MAIL   Вверх
Gnusss
Дата 12.2.2006, 01:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 19.1.2005

Репутация: нет
Всего: нет



А другого более правильного способа нет?
Т.е что-то на основе THintWindow...
PM MAIL   Вверх
Albinos_x
Дата 12.2.2006, 02:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



попробуй это:
Код

  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;




--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Gnusss
Дата 12.2.2006, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 19.1.2005

Репутация: нет
Всего: нет



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


прафесар™
****


Профиль
Группа: Комодератор
Сообщений: 3014
Регистрация: 13.3.2003
Где: Венья, Пиетари

Репутация: 11
Всего: 102



может HintHidePause поставить равным одному году? smile


--------------------
Каждый чилавек пасвоему праф...а памоему НЕТ! 

PM WWW ICQ   Вверх
Gnusss
Дата 12.2.2006, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 19.1.2005

Репутация: нет
Всего: нет



Можно хоть два года ставить в HintHidePause, даже -1 можно, все-ровно хинт изчезнет когда курсор уйдет за пределы контора от которого показан хинт.
PM MAIL   Вверх
Albinos_x
Дата 12.2.2006, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



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


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

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


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Gnusss
Дата 12.2.2006, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 19.1.2005

Репутация: нет
Всего: нет



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

Посмотри как в ICQ работает hint, вот мне надо тоже самое.
PM MAIL   Вверх
Albinos_x
Дата 12.2.2006, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



тогда что мешает использовать даже вот это:
Цитата(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



--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Gnusss
Дата 12.2.2006, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 19.1.2005

Репутация: нет
Всего: нет



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

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

PM MAIL   Вверх
volvo877
Дата 12.2.2006, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 14
Всего: 116



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

Откуда ты знаешь, КАК это реализовано в BDS-2006?
PM MAIL   Вверх
Gnusss
Дата 12.2.2006, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 19.1.2005

Репутация: нет
Всего: нет



ну насчет ICQ не уверен, а вот в BDS(как я понял) на обычном наследнике ThintWindow лежит TWebB...
PM MAIL   Вверх
Gnusss
Дата 12.2.2006, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 19.1.2005

Репутация: нет
Всего: нет



я и не говорю что всё просто. я говорю что я думаю что есть возможность создать такое поведение hint'a средствами наследования его от thintwidnow или перехватом какихто сообщений. для примера можно изучить работу тех функций tapplication работа которых связана с хинтом. я к тому виду что решение с появлением и unпоявлением является поверхносным и что можно сделать намно лучше, и по мойму правильнее.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0678 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.