Решение
Описание
Я нашел решение, которое достаточно быстро реагирует на пылесосящие участки мышью.
Основные изображения отрисовываются в экземпляре PictureBox
, более подробно назначено его свойство Image
.
Свойство SizeMode
имеет значение Zoom, которое автоматически центрирует и изменяет размер изображения с сохранением соотношения сторон назначенного изображения.
Я использую динамически создаваемый экземпляр Picturebox
для каждой области карты (дочерних элементов), который невидим, если на него не наведена мышь.
При наведении курсора на область карты должен появиться дочерний элемент - это делается в событии перемещения мыши родительского PictureBox,
где я перебираю дочерние элементы, определяя, находится ли позиция мыши в границах дочерних элементов.
Найденный ребенок установлен видимым. Поэтому мышь входит в этот дочерний элемент управления.
В случае отпускания дочернего элемента управления я снова установил его невидимым.
Я испытал потерю событий отпускания мыши для дочерних элементов управления, если мышь перемещалась слишком быстро по всем областям карты.
Я предполагаю, что если указатель мыши уже покинул область до того, как он стал видимым, событие никогда не вызывается.
Решение состоит в том, что все (другие) дочерние элементы управления становятся невидимыми, если в обработчике событий перемещения мыши родительского элемента управления не обнаруживается (а) дочерний элемент управления.
Шаги для реализации
Что нужно сделать, чтобы реализовать моё решение:
- Используйте созданный родительский экземпляр
PictureBox
.
- Назначить (динамически) нарисованное изображение свойству
Image
- Установите SizeMode на Zoom
- список
Picturebox
экземпляров в виде поля формы
При присвоении вновь рассчитанного изображения родительскому элементу Picturebox
экземпляр:
- удалить все дочерние элементы управления, его обработчик событий, его запись из списка, если они уже существуют.
- динамически создать экземпляр
PictureBox
для каждой области карты и добавить его в список.
- добавить его в родительский экземпляр
PictureBox
в качестве дочернего элемента управления.
- устанавливает свои свойства
Tag
указывает на объект данных, содержащий границы исходной карты и объект, представленный прямоугольной областью карты.
- устанавливает границы для области карты, масштабированной и центрированной в соответствии с границами родительского
Picturebox
экземпляра, чтобы он соответствовал автоматически увеличенному изображению.
- зарегистрировать событие щелчка мыши
- зарегистрировать событие отпуска мыши
- установить цвет фона на e. г. полупрозрачный зеленый
- установить
Visible
в ложь
В родительском экземпляре Picturebox
курсор мыши над обработчиком событий выполняет:
- поиск дочернего
Picturebox
экземпляра, где указатель мыши указывает на
- если найдено, найденный ребенок становится видимым
- установить всех (других) детей
Picturebox
невидимых
В родительском Picturebox
экземпляре обработчик события изменения размера:
- масштабировать / перемещать все экземпляры области карты
Picturebox
в соответствии с границами родительского изображения и границами родительского Picturebox
экземпляра.
Событие отпускания мыши в каждой области карты Picturebox
Экземпляр ставит себя невидимым (потери упомянутых ранее событий).
Событие щелчка мышью каждого экземпляра области карты Picturebox
делает все, что нужно, щелкнув область карты.
Здесь играет синусоидальный тон правильной хроматической высоты.
Фотографии
На рисунках ниже показан прототип с областями карты (еще не выровнены правильно, с некоторым смещением):
Первое изображение предназначено для иллюстрации родительского изображения и всех областей карты.
Основное изображение (масштаб) и все области карты (динамически создаваемые дочерние Picturebox
экземпляры) отображаются на первом изображении (путем отключения невидимого действия для областей карты).
![first picture](https://i.stack.imgur.com/KObqK.png)
Второе изображение продуктивное , где мышь наводит курсор на тон G4.
На втором изображении размер был изменен - поэтому родительское изображение автоматически центрируется и изменяется.Области карты были просто изменены в их свойстве Bound
в обработчике события изменения размера родительского элемента PictureBox
.
И невидимое действие было включено для областей карты.
![second picture](https://i.stack.imgur.com/h2cO1.png)