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


Автор: Romero 16.9.2006, 07:58
Подскажите, как показывать подсказку формы, если форма неактивна?
То есть нужно вывести обычный виндовый хинт при наведении курсора на форму.
Делал через onmouseover и THintWindow, но не знаю, как убирать подсказку при покидании курсором границ формы.

Автор: Palladin 16.9.2006, 19:07
Запоминай координаты формы при активации, потом считывай координаты курсора если курсор вышел за предел то скрываеш подсказку чё сложного-то?

Автор: Alexeis 16.9.2006, 19:51
Сделать обработчики событий
 CM_MOUSEENTER       
 CM_MOUSELEAVE       

Автор: Romero 19.9.2006, 05:54
RooR, ты предлагаешь при каждом выводе подсказки проверять координаты? А если форма сдвинулась или изменила размер - снова координаты запоминать?
Кроме того в описанном мной способе есть существенное отличие от стандартной подсказки - она бегает за курсором при его передвижении в пределах формы. Это неудобно, хотелось бы просто запустить вывод обычной подсказки при наведении на форму, и пущай она сама пропадает через несколько секунд.
Если непонятно, о чем я говорю - примером будет виндовый QuickLaunch. При наведении на любой ярлык появляется хинт, НЕ ПЕРЕМЕЩАЕТСЯ за курсором при передвижении в пределах размеров значка и ИСЧЕЗАЕТ САМ при покидании пределов значка.


alexeis1, не раз писали на многих форумах об этих событиях - при резком движении мышью они не срабатывают.

Автор: Romero 24.9.2006, 08:37
Чтобы было понятнее, о чем я говорю:
Создайте форму и задайте ей hint (и showhint в true). Если навести на нее мышью - появится подсказка (именно в том месте, где был курсор при срабатывании события), которая не будет перемещаться за куросором и исчезнет после некоторого времени (до следующего срабатывания события). Если же теперь сделать форму неактивной - хинт не покажется. Вот, а хотелось бы smile

Автор: Alexeis 24.9.2006, 12:06
Цитата(Romero @  19.9.2006,  05:54 Найти цитируемый пост)
не раз писали на многих форумах об этих событиях - при резком движении мышью они не срабатывают. 

Да к сожалению я наблюдал такую ситуацию сам...

Есть идея
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
    FHookStarted : Boolean;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
 var
   JHook   : THandle;

 function JournalProc(Code, wParam: Integer; var EventStrut: TEventMsg): Integer; stdcall;
 var
   Char1: PChar;
   r : TRect;
   p1, p2 : TPoint;

 begin
   Result := CallNextHookEx(JHook, Code, wParam, Longint(@EventStrut));
   if Code < 0 then Exit;

   if Code = HC_SYSMODALON then Exit;
   if Code = HC_ACTION
   then
     if (EventStrut.message = WM_MOUSEMOVE)
     then
       begin
         R := Form1.ClientRect;
         p1 := Form1.ClientToScreen(r.TopLeft);
         p2 := Form1.ClientToScreen(r.BottomRight);
         r.TopLeft     := p1;
         r.BottomRight := p2;
         p1.X := EventStrut.paramL;
         p1.Y := EventStrut.paramH;

         if not PtInRect(r, p1)
         then
           Begin
             // здесь проверяем погашен ли хинт и если нет, то гасим
             // можно заоодно и хук здесь снять, чтоб не обрабатывать неклиентские
             //перемещения мыши
           end;
       end;
 end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  if FHookStarted then
   begin
     ShowMessage('Mouse is already being Journaled, can not restart');
     Exit;
   end;

   JHook := SetWindowsHookEx(WH_JOURNALRECORD, @JournalProc, hInstance, 0);

   if JHook > 0 then
   begin
     FHookStarted := True;
   end
   else
     ShowMessage('No Journal Hook availible');
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   FHookStarted := False;
   UnhookWindowsHookEx(JHook);
   JHook := 0;
end;

end.


Автор: Romero 28.9.2006, 05:50
Мда, нехило! Слишком сложная идея. Неужели проще нет вариантов?  smile 

Автор: Alexeis 28.9.2006, 10:12
Romero, ну сложность заключается в том что сообщения о перемещения мыши отправляются форме только когда курсор на ней, а если мы резко дернем мышью, то курсор в один момент был на форме, вдругой исчез. В этом случае у пиложения есть неопределенность, то ли мышка не двигается, то ли она ушла с формы. В обоих случаях нет сообщений о перемещении над формой. Отсюда вывод, что нам нужны сообщения вне формы. Этот способ как раз и позволяет получить журналированые сообщения о перемещении мыши вне окна. 
Так что тут вот такие ограничения. 

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