【问题标题】:C# ScrollableControl does not receive all scroll eventsC# ScrollableControl 不接收所有滚动事件
【发布时间】:2015-06-11 08:58:40
【问题描述】:

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

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

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

你们中的任何人都经历过同样的事情吗?你找到解决办法了吗?

谢谢!

【问题讨论】:

    标签: c# events scrollable


    【解决方案1】:

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

    我还没有测试过,但是根据这个: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;
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-06-17
      • 2014-08-22
      • 1970-01-01
      • 1970-01-01
      • 2014-03-10
      • 2014-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多