2009-12-13 2 views
0

У меня есть List<Rectangle> myRectangles, которые отображаются в панели управления. Если я хочу запустить обработчик событий, когда мышь находится внутри любого из моихRectangles, мой лучший вариант сделать «foreach»? А потом сделайте все, что бы сделал myRectangle.OnMouseMove()?Захват мыши

+0

Привет, когда вы говорите «визуализированный», вы имеете в виду, что прямоугольники рисуются в панели событием Paint? Или они «объекты» какого-то типа? Являются ли прямоугольники фиксированными по размеру или могут быть изменены или перемещены ... если объекты? Можем ли мы предположить, что прямоугольники не перекрывают друг друга? Чем яснее вы можете быть, тем яснее будут ответы, которые вы получите: – BillW

ответ

1

Не используйте элементы управления для своих прямоугольников, они ужасно дороги и не могут пересекаться. Вы не можете сделать его надежным только с помощью метода 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); 
    } 
+0

Благодарим за помощь. Очень полезно. – IAbstract

0

Вы можете создать элемент управления, который имеет два прямоугольника один внутри другого. Открытый OnMouseMove прямоугольника будет открыт. Внешний прямоугольник будет невидим. Таким образом, вы можете позволить Windows управлять вызовом события и не иметь загроможденный код.

2

Это может показаться полезным для Reactive LINQ или Rx, но я больше знаком с использованием первого.

http://tomasp.net/blog/reactive-ii-csevents.aspx

Вы хотите оптимизировать, чтобы определить, какие прямоугольники может быть, возможно, пересекались, а просто использовать OnMouseMove, а затем в вашем LINQ запрос, который вы найдете в зависимости от того прямоугольников будут введены.

Это потенциально может быть производителем.

+0

Спасибо за эту ссылку! Это очень «далеко» программирование на C#! – BillW

+0

@BillW. Одним из преимуществ использования Reactive LINQ является то, что вы можете определить наклон направления и предсказать, какой прямоугольник будет наноситься дальше, чтобы повысить производительность. –

+0

@James Спасибо. imho, если вычисление (предсказание) «наклона» было бы полезным, будет зависеть от конкретных сценариев использования: цель ui, модальные действия, которые могут сделать конечные пользователи. imho в этом конкретном вопросе, мы пока не знаем достаточно о том, что такое намерение/дизайн/использование OP. Но, я считаю ваш комментарий увлекательным, и это ценится. Мне еще нужно «прыгать с корабля» из WinForms в WPF, но признаться, что его привлекают гораздо более надежные возможности управления событиями WPF (барботирование, а также трансляция). С другой стороны, я нахожу идею кругового отключения между C# и XAML реальным странным :) – BillW

0

Предполагаю, что вы должны использовать Winforms? Если это так, вы можете подумать о том, чтобы сделать прямоугольники отдельными дочерними элементами управления (рендерингом любого вида прямоугольника в OnPaint) и использовать события мыши, предоставленные Control.

+0

Я рассматривал возможность использования/наследования Control. Однако есть соображения производительности. Во-первых, этот графический интерфейс должен быть максимально легким. Я создаю многоразовые панели и как можно меньше элементов управления (кнопки и т. Д.). Согласно MS, прилипание к максимально возможному количеству GDI + значительно улучшит производительность. Мне нужно резервировать ресурсы для того, где это действительно важно, - я запланировал реализацию почти реального времени мониторинга сетевых коммуникаций и ресурса дорогостоящего сетевого серверного приложения. – IAbstract

Смежные вопросы