Parent Control Mouse Enter/Leave Events With Child Controls

前端 未结 5 1051
天涯浪人
天涯浪人 2020-11-27 18:49

I have a C# .NET 2.0 WinForms app. My app has a control that is a container for two child controls: a label, and some kind of edit control. You can think of it like this,

5条回答
  •  难免孤独
    2020-11-27 19:16

    After more research, I discovered the Application.AddMessageFilter method. Using this, I created a .NET version of a mouse hook:

    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);
        }
    }
    

    Then, I can handle the MouseMove event in my container control, check to see if the mouse is inside my parent control, and start the work. (I also had to track the last moused over parent control so I could stop the previously started parent.)

    ---- Edit ----

    In my form class, I create and hookup the filter:

    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;
        }   
    }
    

提交回复
热议问题