Родительская Мышь Управления Вводит/Оставляет События С Дочерними элементами управления

С ES6 вы можете получить доступ к методам класса по имени:

class X {
  method1(){
    console.log("1");
  }
  method2(){
    this['method1']();
    console.log("2");
  }
}
let x  = new X();
x['method2']();

вывод будет:

1
2
21
задан Paul Williams 21 July 2009 в 19:33
поделиться

3 ответа

После дополнительных исследований я обнаружил метод Application.AddMessageFilter . Используя это, я создал .NET-версию перехватчика мыши:

class MouseMessageFilter : IMessageFilter, IDisposable
{
    public MouseMessageFilter()
    {
    }

    public void Dispose()
    {
        StopFiltering();
    }

    #region IMessageFilter Members

    public bool PreFilterMessage(ref Message m)
    {
         // Call the appropriate event
         return false;
    }

    #endregion

    #region Events

    public class CancelMouseEventArgs : MouseEventArgs
    {...}

    public delegate void CancelMouseEventHandler(object source, CancelMouseEventArgs e);
    public event CancelMouseEventHandler MouseMove;
    public event CancelMouseEventHandler MouseDown;
    public event CancelMouseEventHandler MouseUp;

    public void StartFiltering()
    {
        StopFiltering();
        Application.AddMessageFilter(this);
    }

    public void StopFiltering()
    {
        Application.RemoveMessageFilter(this);
    }
}

Затем я могу обработать событие MouseMove в моем контейнерном элементе управления, проверить, находится ли мышь внутри моего родительского элемента управления, и начать работу. (Мне также пришлось отслеживать последний наведенный родительский элемент управления, чтобы я мог остановить ранее запущенный родительский элемент.)

---- Изменить ----

В моем классе формы я создаю и подключаю фильтр:

public class MyForm : Form
{
   MouseMessageFilter msgFilter;

   public MyForm()
   {...
       msgFilter = new MouseMessageFilter();
       msgFilter.MouseDown += new MouseMessageFilter.CancelMouseEventHandler(msgFilter_MouseDown);
       msgFilter.MouseMove += new MouseMessageFilter.CancelMouseEventHandler(msgFilter_MouseMove);
    }

    private void msgFilter_MouseMove(object source, MouseMessageFilter.CancelMouseEventArgs e)
    {
        if (CheckSomething(e.Control)
            e.Cancel = true;
    }   
}
8
ответ дан 29 November 2019 в 21:44
поделиться

Вы можете узнать, находится ли мышь в пределах вашего элемента управления следующим образом (предполагая, что этот код находится в вашем элементе управления контейнера; если нет, замените this ссылкой в элемент управления контейнера):

private void MyControl_MouseLeave(object sender, EventArgs e)
{
    if (this.ClientRectangle.Contains(this.PointToClient(Cursor.Position)))
    {
        // the mouse is inside the control bounds
    }
    else
    {
        // the mouse is outside the control bounds
    }
}
4
ответ дан 29 November 2019 в 21:44
поделиться

Я не думаю, что вам нужно подключать насос сообщений, чтобы решить эту проблему. Некоторые отметки в вашем пользовательском интерфейсе должны помочь. Я думаю, что вы создаете переменную-член, что-то вроде Control _someParent, в своем управляющем классе, который будет принимать ссылку на родительский элемент управления при вызове одного из ваших обработчиков OnMouseEnter. Затем в OnMouseLeave проверьте значение «флага» _someParent, и если оно такое же, как у текущего отправителя, не останавливайте обработку, а просто вернитесь. Вы останавливаете и сбрасываете _someParent на null, только если родительский элемент другой.

2
ответ дан 29 November 2019 в 21:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: