3 / 3 / 0
Регистрация: 15.05.2015
Сообщений: 70

Событие MouseMove при нажатой кнопке мыши

23.11.2022, 10:57. Показов 374. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Приветствую, коллеги.

Уткнулся в казалось бы простую задачку, не знаю как решить.
Например:
На форме есть ряд контролов (например - лабелы).
Если над ними водить мышью, они не реагируют.
Но если над формой мы зажимаем левую кнопку мыши и ведём указатель над контролами - они скрываются.

Надеялся, оно сработает простым путём:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Dim a As Boolean
 
Private Sub form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
a = False
End Sub
 
Private Sub form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
a = True
End Sub
 
Private Sub image1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If a = True Then
    Image1.Visible = False
End If
End Sub
...но в VB6 как всегда всё оказалось через ж..
Если активно событие с другого контрола (или в данном случае MouseDown формы), то следующее событие MouseMove не наступает.

Чую я, что попроще без API никак не получится решить?
Меня скатерти чужого кода с api, в котором я практически ничего не понимаю, вгоняют в депрессию...

Добавлено через 10 минут
хотел исправить ошибочку в коде, не успел. Сам объявил что используем лабелы, а в коде image.
Но это сути не меняет. Это я экспериментировал с разными контролами...
И ещё момент:
Если отключить MouseUp оно конечно сработает, но это событие тоже должно отрабатывать - по типу "выделения" контролов - отпустили кнопку мыши - контролы больше не исчезают.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.11.2022, 10:57
Ответы с готовыми решениями:

Событие MouseMove при нажатой кнопке
Здравствуйте уважаемые программисты. Вот есть такой код: procedure TForm1.Panel1MouseLeave(Sender: TObject); begin ...

Cобытие MouseMove при нажатой левой кнопке мыши
Сделал у PictureBox событие MouseMove. Если просто провести мышкой над PictureBox все срабатывает, но если нажать левой(собственно правой...

MouseMove при нажатой правой кнопке мыши и рамки в PictureBox
Как избежать изменения действия события pictureBox1_MouseMove при смене рамки изображения внутри процедуры pictureBox1_MouseDown или в...

2
Модератор
10033 / 3880 / 882
Регистрация: 22.02.2013
Сообщений: 5,824
Записей в блоге: 78
23.11.2022, 11:26
Лучший ответ Сообщение было отмечено MrRoxMJ как решение

Решение

Цитата Сообщение от MrRoxMJ Посмотреть сообщение
...но в VB6 как всегда всё оказалось через ж..
Это вообще-то стандартное поведение окон в Windows. Когда ты зажимаешь кнопку мыши, окно захватывает ее и все события мыши передаются только ему. Сделано это для операций перетаскивания и VB6 тут не при чем. Решить можно просто:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Private Declare Function ReleaseCapture Lib "user32" () As Long
 
Dim b As Boolean
 
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    b = True
    ReleaseCapture
End Sub
 
Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
    b = False
End Sub
 
Private Sub Label1_MouseMove(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)
    If b Then
        Label1(Index).Visible = False
    End If
End Sub
Но теперь если ты отпустишь мышь за пределами формы то ей не придет уведомление MouseUp, т.к. мышь не захвачена. Нужно просто смотреть в какую область попадает мышь, минимальный вариант:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Option Explicit
 
Dim b As Boolean
 
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    b = True
End Sub
 
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Dim c As Object
    If b Then
        For Each c In Me.Controls
            If X >= c.Left And X < c.Left + c.Width And _
                Y >= c.Top And Y < c.Top + c.Height Then
                c.Visible = False
            End If
        Next
    End If
End Sub
 
Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
    b = False
End Sub
2
3 / 3 / 0
Регистрация: 15.05.2015
Сообщений: 70
23.11.2022, 12:10  [ТС]
Спасибо))
Адаптировал второй вариант применительно к лабелам, чтобы только эта группа скрывалась. Переменная b не понадобилась.
Весь код:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim ctl As Control
 
'If Button = 2 Then       это условие нужно чтобы выбирать правую[1] или левую[2] кнопку мыши, иначе работает на любую
 
For Each ctl In Me.Controls
 If TypeOf ctl Is Label Then
    If X >= ctl.Left And X < ctl.Left + ctl.Width And _
    Y >= ctl.Top And Y < ctl.Top + ctl.Height Then
    ctl.Visible = False
    End If
 End If
Next ctl
 
'End If
 
End Sub
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.11.2022, 12:10
Помогаю со студенческими работами здесь

Событие мыши Mouse Down и получение координат при нажатой кнопке
день добрый, подскажите пожалуйста, как сделать так, что бы при нажатой кнопке мыши в области окна я мог отслеживать координаты....

При нажатой кнопке мыши обработать событие "вход курсора" на другой обьект
Задажа в том что нужно сделать такой принцип: опускаем клавишу миши и тягаем её по екрану (за ней следом склонированный обект на котором...

Событие мыши: перемещение мыши при нажатой левой клавиши
Подскажите, пожалуйста как реализовать следующее: При перемещении мыши при нажатой левой клавише (выделение текста) выводится сообщение...

Рисование при нажатой кнопке мыши
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Canvas.MoveTo(X,Y);...

Прокрутка страницы при нажатой левой кнопке мыши
Есть такой код document.onmousedown = function(e) { e = e || window.event; down = 1; x = e.clientX; // начальное положение...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

Новые блоги и статьи
Анализ и линтинг кода JavaScript: ESLint, Prettier и JSHint
run.dev 26.04.2025
JavaScript прошёл долгий путь от простого языка для анимации веб-страниц до основы современной веб-разработки. С ростом сложности приложений, увеличением кодовых баз и масштабированием команд. . .
Паттерны в Python: Singleton, Factory и Observer
py-thonny 26.04.2025
Паттерны проектирования — это проверенные временем решения типовых проблем разработки программного обеспечения. Их история берёт начало с книги "Приёмы объектно-ориентированного проектирования. . . .
Исключения в C#: Stack Overflow, Access Violation и Out of memory
stackOverflow 26.04.2025
Исключения в C# — это не только механизм оповещения о проблемах, а целое искусство управления потоком выполнения программы в экстремальных ситуациях. Обычное исключение, например,. . .
Логирование в C# ASP.NET Core с помощью Serilog, ElasticSearch, Kibana
stackOverflow 25.04.2025
Помните те времена, когда для анализа проблемы приходилось подключаться к серверу, искать нужный лог-файл среди десятков других и вручную фильтровать тысячи строк в поисках ошибки? К счастью, эти дни. . .
Структура "железный OnKeyUp" вместо антидребезга. Полностью асинхронный счётчик.
Hrethgir 25.04.2025
Программа для симуляции схемы - Logisim Evolution В общем какое-то время отвлёкся, так было надо, теперь когда запилю это на verilog и FPGA , досоставлю заявку в ФИПС на полезную модель - не готов. . .
Автоматизация Amazon Web Services (AWS) с Boto3 в Python
py-thonny 25.04.2025
Облачные вычисления стали неотъемлемой частью современной ИТ-инфраструктуры, а Amazon Web Services (AWS) занимает лидирующие позиции среди провайдеров облачных услуг. Управление многочисленными. . .
Apache Kafka vs RabbitMQ в микросервисной архитектуре
ArchitectMsa 25.04.2025
Современная разработка ПО всё чаще склоняется к микросервисной архитектуре — подходу, при котором приложение разбивается на множество небольших, автономных сервисов. В этой распределённой среде. . .
Параллельное программирование с OpenMP в C++
NullReferenced 24.04.2025
Параллельное программирование — подход к созданию программ, когда одна задача разбивается на несколько подзадач, которые могут выполняться одновременно. Оно стало необходимым навыком для. . .
Цепочки методов в C# с Fluent API
UnmanagedCoder 24.04.2025
Современное программирование — это не только решение функциональных задач, но и создание кода, который удобно поддерживать, расширять и читать. Цепочки методов и Fluent-синтаксис в C# стали мощным. . .
Мульти-тенантные БД с PostgreSQL Row Security
Codd 23.04.2025
Современные облачные сервисы и бизнес-приложения всё чаще обслуживают множество клиентов в рамках единой программной инфраструктуры. Эта архитектурная модель, известная как мульти-тенантность, стала. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru