C# 可滚动控件不会接收所有滚动事件

本文关键字:滚动 事件 控件 | 更新日期: 2023-09-27 17:55:39

我在滚动控件(更准确地说是面板)时遇到了问题。使用鼠标指针直接在滚动条上滚动时,将正确触发 Scroll 事件。

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

此外,当面板内的越界控件收到焦点时,面板会正确滚动以显示控件,但同样,在这种情况下,不会触发 Scroll 事件。

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

谢谢!

C# 可滚动控件不会接收所有滚动事件

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

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

代码如下:

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