Мышь над компонентом, или нет?
От: Eagle-XK Украина http://esoft.pp.ua
Дата: 19.07.06 09:09
Оценка:
Всем привет! Вобщем, есть приблизительно такой код: глобально ловим мышку, опознаём координаты и если видим, что мышка находится над панелькой — посылаем beep.
Как ни странно, работает... но с огрехами: если форма с панелькой скрыта другой формой, оно всё равно будет работать, хотя мне это как раз и не нужно... Проблемма в том, как узнать, находится ли мышка реально над компонентом (отлов WM_MOUSEMOVE не канает — на панельке могут лежать ещё компоненты, да и не работает WM_MOUSEMOVE если на каком-то компоненте уже стоит SetCaptureControl) или она реально прикрыта другим окном/компонентой. Помогите, плиз, советом, а то у меня что-то совсем башка не варит... %)

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure TmrTimer(Sender: TObject);
    procedure PnlCaptureMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  end;

var
  Form1: TForm1;
  Pnl, PnlCapture: TPanel;
  Tmr: TTimer;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Pnl := TPanel.Create(Self);
  Pnl.Parent := Self;

  PnlCapture := TPanel.Create(Self);
  PnlCapture.Parent := Self;
  PnlCapture.OnMouseMove := PnlCaptureMouseMove;
  PnlCapture.Left := 200;

  Tmr := TTimer.Create(Self);
  Tmr.Enabled := True;
  Tmr.Interval := 100;
  Tmr.OnTimer := TmrTimer;
end;

procedure TForm1.PnlCaptureMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
 P:TPoint;
begin
 if not ((x>=0) and (y>=0) and (x<PnlCapture.width) and (y<PnlCapture.height)) then
 begin
  if GetCaptureControl=PnlCapture then ReleaseCapture;
 end
 else
  if not (GetCaptureControl=PnlCapture) then SetCaptureControl(PnlCapture);
end;

procedure TForm1.TmrTimer(Sender: TObject);
var
  CurPos: TPoint;
begin
  GetCursorPos(CurPos);
  CurPos := Pnl.ScreenToClient(CurPos);
  if ((CurPos.X >= 0) and (CurPos.X <= Pnl.Width)) and ((CurPos.Y >= 0) and (CurPos.Y <= Pnl.Height)) then
    Beep;
end;

end.


RSDN@Home v.1.1.4
ORIGIN: Рай и ад отличаются лишь поставщиком софта.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.