C#ScrollableControl不会收到所有滚动事件

时间:2015-06-11 08:58:40

标签: c# events scrollable

我遇到了ScrollableControl的问题(Panel更精确)。当直接在滚动条上滚动鼠标指针时,Scroll事件将被正确触发。

但是当使用鼠标滚轮滚动时,Panel会正确滚动,但不会触发Scroll事件。

当Panel内的越界控件获得焦点时,Panel会正确滚动以使控件进入视图,但在这种情况下,Scroll事件不会被触发。

你们有没有经历过同样的事情?你找到了解决方案吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

更新:我现在已经过测试 - 这不起作用!

我还没有测试过,但根据这个:http://www.codeproject.com/Articles/7452/ScrollableControl-with-Scroll-Events 一个选项是扩展ScrollableControl的功能

代码如下:

using System;
using System.ComponentModel;
using System.Windows.Forms;
using System.Diagnostics;

namespace Foretel.SelectAGrid
{
    /// <summary>
    /// Adds the missing scroll events to the scrollable control!
    /// Written by Martin Randall - Thursday 17th June, 2004
    /// </summary>
    public class ScrollableControlWithScrollEvents : ScrollableControl
    {
        private const int WM_HSCROLL = 0x114;
        private const int WM_VSCROLL = 0x115;

        /// <summary>
        /// Horizontal scroll position has changed event
        /// </summary>
        public event ScrollEventHandler HorzScrollValueChanged;

        /// <summary>
        /// Vertical scroll position has changed event
        /// </summary>
        public event ScrollEventHandler VertScrollValueChanged;

        /// <summary>
        /// Intercept scroll messages to send notifications
        /// </summary>
        /// <param name="m">Message parameters</param>
        protected override void WndProc(ref Message m)
        {
            // Let the control process the message
            base.WndProc (ref m);

            // Was this a horizontal scroll message?
            if ( m.Msg == WM_HSCROLL ) 
            {
                if ( HorzScrollValueChanged != null ) 
                {
                    uint wParam = (uint)m.WParam.ToInt32();
                    HorzScrollValueChanged( this, 
                        new ScrollEventArgs( 
                            GetEventType( wParam & 0xffff), (int)(wParam >> 16) ) );
                }
            } 
            // or a vertical scroll message?
            else if ( m.Msg == WM_VSCROLL )
            {
                if ( VertScrollValueChanged != null )
                {
                    uint wParam = (uint)m.WParam.ToInt32();
                    VertScrollValueChanged( this, 
                        new ScrollEventArgs( 
                        GetEventType( wParam & 0xffff), (int)(wParam >> 16) ) );
                }
            }
        }

        // Based on SB_* constants
        private static ScrollEventType [] _events =
            new ScrollEventType[] {
                                      ScrollEventType.SmallDecrement,
                                      ScrollEventType.SmallIncrement,
                                      ScrollEventType.LargeDecrement,
                                      ScrollEventType.LargeIncrement,
                                      ScrollEventType.ThumbPosition,
                                      ScrollEventType.ThumbTrack,
                                      ScrollEventType.First,
                                      ScrollEventType.Last,
                                      ScrollEventType.EndScroll
                                  };
        /// <summary>
        /// Decode the type of scroll message
        /// </summary>
        /// <param name="wParam">Lower word of scroll notification</param>
        /// <returns></returns>
        private ScrollEventType GetEventType( uint wParam )
        {
            if ( wParam < _events.Length )
                return _events[wParam];
            else
                return ScrollEventType.EndScroll;
        }
    }
}