我遇到了ScrollableControl的问题(Panel更精确)。当直接在滚动条上滚动鼠标指针时,Scroll事件将被正确触发。
但是当使用鼠标滚轮滚动时,Panel会正确滚动,但不会触发Scroll事件。
当Panel内的越界控件获得焦点时,Panel会正确滚动以使控件进入视图,但在这种情况下,Scroll事件不会被触发。
你们有没有经历过同样的事情?你找到了解决方案吗?
谢谢!
答案 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;
}
}
}