/// <summary>
    ///     Filtert eine Meldung, bevor sie gesendet wird.
    /// </summary>
    /// <param name="m">Die zu sendende Meldung. Diese Meldung kann nicht geändert werden.</param>
    /// <returns>
    ///     true, um die Meldung zu filtern und das Senden zu verhindern. false, um das Senden der Meldung bis zum nächsten Filter oder Steuerelement zu ermöglichen.
    /// </returns>
    public bool PreFilterMessage(ref Message m)
    {
        Point mousePosition = Control.MousePosition;
        var   args          = new MouseFilterEventArgs(MouseButtons.Left, 0, mousePosition.X, mousePosition.Y, 0);

        switch (m.Msg)
        {
        case WM_MOUSEMOVE:
            if (MouseFilterMove != null)
            {
                MouseFilterMove(Control.FromHandle(m.HWnd), args);
            }
            break;

        case WM_LBUTTONDOWN:
            if (MouseFilterDown != null)
            {
                MouseFilterDown(Control.FromHandle(m.HWnd), args);
            }
            break;

        case WM_LBUTTONUP:
            if (MouseFilterUp != null)
            {
                MouseFilterUp(Control.FromHandle(m.HWnd), args);
            }
            break;
        }
        // Always allow message to continue to the next filter control
        return(args.Handled);
    }
 /// <summary>
 ///     Handles the MouseFilterDown event of the mudmFilter control.
 /// </summary>
 /// <param name="sender">The source of the event.</param>
 /// <param name="e">
 ///     The <see cref="MouseFilterEventArgs" /> instance containing the event data.
 /// </param>
 private void mouseFilter_MouseFilterDown(object sender, MouseFilterEventArgs e)
 {
     if (!_doTouchScroll && e.Button == MouseButtons.Left)
     {
         _mouseStartPoint = new Point(e.X, e.Y);
         _yourScrollablePanelStartPoint = new Point(-yourScrollablePanel.AutoScrollPosition.X,
                                                    -yourScrollablePanel.AutoScrollPosition.Y);
     }
 }
 /// <summary>
 ///     Handles the MouseFilterUp event of the mudmFilter control.
 /// </summary>
 /// <param name="sender">The source of the event.</param>
 /// <param name="e">
 ///     The <see cref="MouseFilterEventArgs" /> instance containing the event data.
 /// </param>
 private void mouseFilter_MouseFilterUp(object sender, MouseFilterEventArgs e)
 {
     if (e.Button == MouseButtons.Left)
     {
         if (_doTouchScroll && !yourScrollablePanel.AutoScrollPosition.Equals(_yourScrollablePanelStartPoint) &&
             !_yourScrollablePanelStartPoint.Equals(Point.Empty))
         {
             // dont fire Click-Event
             e.Handled = true;
         }
         _doTouchScroll   = false;
         _mouseStartPoint = Point.Empty;
         _yourScrollablePanelStartPoint = Point.Empty;
     }
 }
 /// <summary>
 ///     Handles the MouseFilterMove event of the mudmFilter control.
 /// </summary>
 /// <param name="sender">The source of the event.</param>
 /// <param name="e">
 ///     The <see cref="MouseFilterEventArgs" /> instance containing the event data.
 /// </param>
 private void mouseFilter_MouseFilterMove(object sender, MouseFilterEventArgs e)
 {
     if (e.Button == MouseButtons.Left)
     {
         if (!_mouseStartPoint.Equals(Point.Empty))
         {
             int dx = (e.X - _mouseStartPoint.X);
             int dy = (e.Y - _mouseStartPoint.Y);
             if (_doTouchScroll)
             {
                 yourScrollablePanel.AutoScrollPosition = new Point(_yourScrollablePanelStartPoint.X - dx,
                                                                    _yourScrollablePanelStartPoint.Y - dy);
             }
             else if (Math.Abs(dx) > 10 || Math.Abs(dy) > 10)
             {
                 _doTouchScroll = true;
             }
         }
     }
 }