C# 可滚动控件不会接收所有滚动事件
本文关键字:滚动 事件 控件 | 更新日期: 2023-09-27 17:55:39
我在滚动控件(更准确地说是面板)时遇到了问题。使用鼠标指针直接在滚动条上滚动时,将正确触发 Scroll 事件。
但是,当使用鼠标滚轮滚动时,面板会正确滚动,但不会触发 Scroll 事件。
此外,当面板内的越界控件收到焦点时,面板会正确滚动以显示控件,但同样,在这种情况下,不会触发 Scroll 事件。
你们中有人经历过同样的事情吗?你找到解决方案了吗?
谢谢!
更新:我现在已经测试过了 - 这不起作用!
我还没有测试过,但根据这个: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;
}
}
}