У меня есть List<Rectangle> myRectangles
, которые отображаются в панели управления. Если я хочу запустить обработчик событий, когда мышь находится внутри любого из моихRectangles, мой лучший вариант сделать «foreach»? А потом сделайте все, что бы сделал myRectangle.OnMouseMove()?Захват мыши
ответ
Не используйте элементы управления для своих прямоугольников, они ужасно дороги и не могут пересекаться. Вы не можете сделать его надежным только с помощью метода OnMouseMove(), вы пропустите мышь, перемещающуюся за пределы панели, когда пользователь быстро перемещает мышь и/или край прямоугольника близок к границе панели. Это легко решить с помощью свойства Control.Capture. Пример кода примера:
public event EventHandler InsideRectangles;
private List<Rectangle> mRectangles = new List<Rectangle>();
private bool mInside;
protected void OnInsideRectangles(EventArgs e) {
EventHandler handler = InsideRectangles;
if (handler != null) handler(this, e);
}
protected override void OnMouseMove(MouseEventArgs e) {
bool inside = false;
foreach (var rc in mRectangles) {
if (rc.Contains(e.Location)) {
inside = true;
break;
}
}
if (inside && !mInside) OnInsideRectangles(EventArgs.Empty);
this.Capture = inside;
mInside = inside;
base.OnMouseMove(e);
}
Благодарим за помощь. Очень полезно. – IAbstract
Вы можете создать элемент управления, который имеет два прямоугольника один внутри другого. Открытый OnMouseMove прямоугольника будет открыт. Внешний прямоугольник будет невидим. Таким образом, вы можете позволить Windows управлять вызовом события и не иметь загроможденный код.
Это может показаться полезным для Reactive LINQ или Rx, но я больше знаком с использованием первого.
http://tomasp.net/blog/reactive-ii-csevents.aspx
Вы хотите оптимизировать, чтобы определить, какие прямоугольники может быть, возможно, пересекались, а просто использовать OnMouseMove, а затем в вашем LINQ запрос, который вы найдете в зависимости от того прямоугольников будут введены.
Это потенциально может быть производителем.
Спасибо за эту ссылку! Это очень «далеко» программирование на C#! – BillW
@BillW. Одним из преимуществ использования Reactive LINQ является то, что вы можете определить наклон направления и предсказать, какой прямоугольник будет наноситься дальше, чтобы повысить производительность. –
@James Спасибо. imho, если вычисление (предсказание) «наклона» было бы полезным, будет зависеть от конкретных сценариев использования: цель ui, модальные действия, которые могут сделать конечные пользователи. imho в этом конкретном вопросе, мы пока не знаем достаточно о том, что такое намерение/дизайн/использование OP. Но, я считаю ваш комментарий увлекательным, и это ценится. Мне еще нужно «прыгать с корабля» из WinForms в WPF, но признаться, что его привлекают гораздо более надежные возможности управления событиями WPF (барботирование, а также трансляция). С другой стороны, я нахожу идею кругового отключения между C# и XAML реальным странным :) – BillW
Предполагаю, что вы должны использовать Winforms? Если это так, вы можете подумать о том, чтобы сделать прямоугольники отдельными дочерними элементами управления (рендерингом любого вида прямоугольника в OnPaint
) и использовать события мыши, предоставленные Control
.
Я рассматривал возможность использования/наследования Control. Однако есть соображения производительности. Во-первых, этот графический интерфейс должен быть максимально легким. Я создаю многоразовые панели и как можно меньше элементов управления (кнопки и т. Д.). Согласно MS, прилипание к максимально возможному количеству GDI + значительно улучшит производительность. Мне нужно резервировать ресурсы для того, где это действительно важно, - я запланировал реализацию почти реального времени мониторинга сетевых коммуникаций и ресурса дорогостоящего сетевого серверного приложения. – IAbstract
- 1. Захват мыши левой кнопкой мыши
- 2. захват Второе движение мыши
- 3. Захват движения мыши
- 4. Захват и выбор мыши
- 5. Захват мыши в Firefox
- 6. захват мыши с Xlib
- 7. Захват пользователя щелчком мыши?
- 8. Захват движения мыши
- 9. Захват движения мыши
- 10. Захват действий мыши
- 11. WINAPI Захват правой кнопкой мыши
- 12. Захват курсора мыши в GLFW
- 13. ffmpeg gdigrab hidpi захват мыши
- 14. Щелкните правой кнопкой мыши, текстовый захват
- 15. Захват местоположений щелчка мыши в matlab
- 16. Захват и блокировка глобальной мыши в X11
- 17. Захват события клавиатуры + мыши JavaFx через кнопку
- 18. захват колесика мыши события вне qwidget
- 19. Захват данных о событиях мыши вне iframe
- 20. Захват пиксельной поверхности при выборе мыши
- 21. Захват позиции мыши за окном окна хрома
- 22. Захват всего экрана с помощью мыши
- 23. Захват событий мыши вне wx.Frame в Python
- 24. Захват мыши Вход/Оставить во время разработки
- 25. Захват событий колесика мыши в консольном приложении
- 26. Захват экрана с помощью курсора мыши
- 27. Захват движения мыши в win32/Opengl
- 28. Захват событий мыши для пользовательского SplitContainerDesigner
- 29. Как сделать захват мыши на Gtk.Stack
- 30. Захват сообщений мыши - Message.XPos или Message.Pos.x?
Привет, когда вы говорите «визуализированный», вы имеете в виду, что прямоугольники рисуются в панели событием Paint? Или они «объекты» какого-то типа? Являются ли прямоугольники фиксированными по размеру или могут быть изменены или перемещены ... если объекты? Можем ли мы предположить, что прямоугольники не перекрывают друг друга? Чем яснее вы можете быть, тем яснее будут ответы, которые вы получите: – BillW