powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Координаты курсора на элементе
7 сообщений из 7, страница 1 из 1
Координаты курсора на элементе
    #39230354
Здравствуйте.

На форме есть элемент рисунок в нём отсутствует картинка, вместо этого в свойствах тип фона указан обычный и задан цвет. В итоге получается квадрат. (можно конечно использовать элемент прямоугольник, но желательно всёже изображение).
Суть в том что мне нужно увеличивать глобальную переменную на 1 когда курсор входит в область изображения и на 1 когда уходит. Пока курсор внутри рисунка переменная не меняется.
Использую для этого событие "перемещение указателя" (MouseMove) элемента.


Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Private Sub Рисунок1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
        If (X = 0) Or (Y = 0) Or (X = 550) Or (Y = 550) Then
            count = count + 1
        End If

    Me.Поле1.Value = count ' выводит в поле 1 значение глобальной переменной
    Me.Поле2.Value = X       ' выводит в поле 2 значение X
    Me.Поле3.Value = Y       ' выводит в поле 3 значение Y

End Sub



Но возникли проблемы/вопросы:

1) Размер квадрата 1x1см. Его Height и Width равны 567. Но координаты X и Y выводятся всегда кратными 5. Поэтому немогу прописать условие If (X = Me.Рисунок1.Width) Or (Y = Me.Рисунок1.Height) Or (X = 0) Or (Y = 0) Then
Может есть возможность узнавать координаты более точно (именно в самой фигуре)

2) Хоть размер указан 567, но при выведении координат максимальный X (и Y) на котором выходит курсор (то есть последнее значение) является 555. Получается что фигура обрезана на 12. Если учесть то что шагом является 5 и координаты всегда кратны им то последнее значение должно быть 565, а не 555. Куда деваются эти (?пиксели?).

3) Иногда происходит ошибочное срабатывание, тогда count увеличивается на 3 или же вообще не срабатывает. В чём может быть причина ?
...
Рейтинг: 0 / 0
Координаты курсора на элементе
    #39230369
Фотография __Michelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А зачем знать размеры квадрата?
Можно завести переменную, просто отслеживающую нахождение в квадрате и выход из него,
а также добавить процедуру обработки перемещения указателя для области вокруг квадрата
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Dim InPicture As Boolean

Private Sub Рисунок1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
 If InPicture Then
  Exit Sub
 Else
  InCount = InCount + 1
  InPicture = True
 End If
End Sub

Private Sub ОбластьВнеРисунка1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
 If Not InPicture Then
  Exit Sub
 Else
  InCount = InCount + 1
  InPicture = False
 End If
End Sub
...
Рейтинг: 0 / 0
Координаты курсора на элементе
    #39230399
Predeclared
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__Michelle,

Найдете отличие в подходах?
...
Рейтинг: 0 / 0
Координаты курсора на элементе
    #39230401
Фотография __Michelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Predeclared,

Попробую минут через 30-40.
Сейчас у меня компьютер забрали.
...
Рейтинг: 0 / 0
Координаты курсора на элементе
    #39230423
Фотография __Michelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Predeclared,

Вот только что удалось посмотреть.

Кажется, поняла
а) при вхождении в область квадрата
– фиксируется факт входа,
– отключается отслеживание движения мыши по этому квадрату.
б) при выходе из квадрата
– фиксируется факт выхода,
– включается слежение за перемещением по квадрату, чтобы поймать следующее вхождение в квадрат
......................
и так по кругу.

Да?

Мне понравилось.
...
Рейтинг: 0 / 0
Координаты курсора на элементе
    #39230428
Predeclared
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да,
в таком решении нет бесконечной обработки событий перемещения мышки.

Это не VB-шный вариант, а чисто Access-VBA-шный.
Но раз он таки имеется, то почему бы им не воспользоваться.
...
Рейтинг: 0 / 0
Координаты курсора на элементе
    #39230771
Ежик_из_тумана1) Размер квадрата 1x1см. Его Height и Width равны 567.Откуда берётся 567:
1 см = 1/2,54 дюйма, 1 дюйм (inch) = 72 пункта (point), 1 пункт = 20 твипов (twip) => 1 см = 72 * 20 / 2,54 = ~566,929 твипов. Округляем до целого (Integer), получаем 567 твипов.Ежик_из_туманаНо координаты X и Y выводятся всегда кратными 5.Не 5, а 15. И не всегда, кстати. Откуда берётся 15:
существует такое понятие как логическое разрешение (растрового) устройства отображения по осям координат, выражается в DPI (точек растра (пикселей) на "логический" дюйм). Курсор мыши двигается по (растровому) устройству отображения - экрану с шагом 1 пиксель. Логическое разрешение экрана можно для пользователя узнать через панель управления, для программиста - функцией GetDeviceCaps с параметром LOGPIXELSX или LOGPIXELSY. Обычно (изредка попадаются другие значения, например, 120) это 96 DPI. Получается: 1 пиксель = 1 дюйм / DPI = 72 * 20 / 96 = 15 твипов.Ежик_из_туманаМожет есть возможность узнавать координаты более точно (именно в самой фигуре)Нет, если не лезть в дебри. И незачем.Ежик_из_тумана2) Хоть размер указан 567, но при выведении координат максимальный X (и Y) на котором выходит курсор (то есть последнее значение) является 555. Получается что фигура обрезана на 12. Если учесть то что шагом является 5 и координаты всегда кратны им то последнее значение должно быть 565, а не 555. Куда деваются эти (?пиксели?).По существу ответил выше. Практический же выход из положения - выравнивание положения (Left, Top) и размеров (Width, Height) элемента управления программно по границе экранных пикселей. См. AlignControlToPixelBound2 в 13530661 .Ежик_из_тумана3) Иногда происходит ошибочное срабатывание, тогда count увеличивается на 3 или же вообще не срабатывает. В чём может быть причина ?MouseMove не даёт полный контроль за выходом курсора за область. "По-взрослому " эта задача решается через subclassing, но обычно программист на VBA от этого слова шарахается.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Координаты курсора на элементе
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]