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


Автор: Мозгоносец 19.8.2009, 16:40
Уважаемые господа! Стоит такая несложная задача: имею наследника THintWindowExt = class (THintWindow), нужно показывать по определенному событию объект Хинт этого класса и проигрывать в это время звук. Во время показа Хинта пользователь может прервать показ Хинта и прослушивание музыки, кликнув по Хинту. Вроде бы все просто, делаю примерно так:
Код

============
type
  THintWindowExt = class (THintWindow)
  private
    procedure Kill(Sender: TObject);
  public
    constructor Create(AOwner: TComponent); override;
end;
============

constructor THintWindowExt.Create(AOwner: TComponent);
begin
  inherited;
  Self.OnClick := SElf.Kill; // пробовал обрабатывать message   WM_LBUTTONDOWN - та же проблема...
end;

procedure THintWindowExt.Kill(Sender: TObject);
begin
// СЮДА СООБЩЕНИЕ НЕ ДОХОДИТ
//  Self.Color := clRed; 
  Self.Hide;
end;
==============


Но не работает.
 Что я делаю не так? Да, Хинт создается в рантайме так:   hnt := THintWindowExt.Create(Form1);  hnt.Parent := Form1;
 Вызывается к показу так:   hnt.ActivateHint(rct, hnt.Text);

 В справке написано, что при таком показе нужно убирать так: hnt.ReleaseHandle. Так и делаю. А нужно - по клику по нему мышкой. Спасибо.

Автор: MetalFan 19.8.2009, 17:48
Хинт - есть хинт... никаких кликов он не ловит, он для них "прозрачен"
причина:
Код

procedure THintWindow.WMNCHitTest(var Message: TWMNCHitTest);
begin
  Message.Result := HTTRANSPARENT;
end;

решение очевидно?

Автор: Мозгоносец 20.8.2009, 08:41
Цитата(MetalFan @ 19.8.2009,  17:48)
Хинт - есть хинт... никаких кликов он не ловит, он для них "прозрачен"
причина:
Код

procedure THintWindow.WMNCHitTest(var Message: TWMNCHitTest);
begin
  Message.Result := HTTRANSPARENT;
end;

решение очевидно?

Вроде бы... Получилось так:

Код

procedure THintWindowEx.WMNCHitTest(var Message: TWMNCHitTest);
begin
  Message.Result := HTCLIENT;
  Parent.SetFocus; // попробуйте без этого
end;

 В общем, спасибо!

Автор: MetalFan 20.8.2009, 14:05
Мозгоносец, имхо достаточно было и просто ничего не трогать в обработчике этого сообщения.

Автор: Мозгоносец 20.8.2009, 14:32
Так если ничего не трогать, тогда и проблема возникает: на работает, как хочется... smile 

Автор: MetalFan 20.8.2009, 17:02
Мозгоносец, я имел ввиду в методе наследника ничего не делать. т.е. не вызывать метод предка и не менять Message.Result

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