Для этого можно воспользоваться API функцией GetCapture().
procedure TForm1.FormDeactivate(Sender: TObject);
begin
ReleaseCapture;
end;
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
beginif GetCapture = 0 then
SetCapture(Form1.Handle);
if PtInRect(Rect(Form1.Left,
Form1.Top,
Form1.Left + Form1.Width,
Form1.Top + Form1.Height),
ClientToScreen(Point(x, y))) then
Form1.Caption := 'Мышка на форме'
else
Form1.Caption := 'Мышка за пределами формы';
end;
Here's a translation of the provided text into Russian:
Программа на Delphi (Object Pascal), которая проверяет, находится ли курсор мыши внутри границ формы или нет.
Когда форма теряет фокус (FormDeactivate событие), она освобождает захват мыши (ReleaseCapture) для предотвращения дальнейшего обрабатывания событий мыши этой формой.
Когда курсор мыши перемещается (FormMouseMove событие), она проверяет, находится ли курсор мыши внутри границ формы. Она делает это, начиная с проверки наличия захвата с помощью GetCapture, и если нет, то устанавливает его с помощью SetCapture. Затем она проверяет, находится ли координата курсора мыши (x, y) внутри прямоугольника, определенного левым, верхним, правым и нижним краями формы (PtInRect). Если курсор мыши находится внутри этих границ, она изменяет заголовок формы на 'Мышка на форме'. Иначе, она изменяет заголовок на 'Мышка за пределами формы'.
Вот некоторые предложения по улучшению:
Вместо ручного освобождения захвата в FormDeactivate, вы могли бы просто не устанавливать захват при потере фокуса формы. Это предотвратило бы любое ненужное обрабатывание событий мыши вашей формой.
Код не учитывает ситуацию, когда курсор мыши находится вне клиентской области формы, но все еще внутри ее границ (например, если он нависает над областью формы, не являющейся клиентской). Если вам нужно проверять это, вы могли бы использовать PtInClientRect вместо PtInRect.
Код не обрабатывает ситуацию, когда курсор мыши перемещается за пределы окна формы, но все еще находится внутри ее границ (например, если он перемещается за пределы видимой области из-за прокрутки или других причин). Если вам нужно проверять это, вы могли бы использовать ScreenToClient для конвертации экранных координат обратно в клиентские координаты перед проверкой.
В статье описывается способ определения, находится ли мышка над формой в Delphi, используя функцию GetCapture и обработку событий FormDeactivate и FormMouseMove.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.