日期:2014-05-19  浏览次数:20813 次

外层控件获取Scroll事件
在自定义控件中放入了几个listView   设置listView1.Scrollable   =   false;
自定义控件放入一个窗口中设置为:contorl1.AutoScroll   =   true;
为什么鼠标中键滚动对自定义控件不起作用!!
大家帮帮忙,谢谢!

------解决方案--------------------
主要代码如下
1、注册事件
2、拦截消息,然后激发事件

protected override void OnMouseWheel(MouseEventArgs e)
{
base.OnMouseWheel(e); // 向基类注册事件。
if(pageInfo.Length == 0 || !_havewheel) // 无内容或客户没有滚轮鼠标,退出
return;

// 计算应该卷动的行数,鼠标滚轮滚动一格后,内容移动的行数
// 这个行数用 WHEEL_DELTA 常量表示,定义在另一个文件
// 在MSDN中,WHEEL_DELTA 常量推荐选择 120 ,在Windows的头文件中也是这样设置的
// 但我发现如果选择120的话,滚动速度很慢,所以我选择了20这个数。
// 数字可以自行设定,数字越小,则滚轮每滚动一格,
// 内容页滚动的行数越多
float scrollRatio = e.Delta * SystemInformation.MouseWheelScrollLines / Define.WHEEL_DELTA; // WHEEL_DELTA 常量,这里选择了20
Point p = position; // 当前页面所在的位置。
// 因为鼠标滚轮仅负责上下滚动,所以
// 获取当时预览页面的纵轴位置 482
int y = p.Y;
// 获取打印预览窗口的高度
//height = Math.Max(base.Height, virtualSize.Height);
int height = Math.Min(base.Height, virtualSize.Height); // 659

/*
* 实际上算法很简单,y 变量表示垂直滚动条标记方块的位置
* height 变量表示显示区域的高度,因为有滚动条,所以
* 使用Math.Max() 方法获取的就是 virtualSize.Height
* virtualSize.Height表示预览窗口里面的内容页的大小
* base.Height 表示显示打印预览控件的大小
* 而内容页有可能比控件要大得多,
* 所以我就选择了窗口大小为height的值
* 当滚轮向下滚动,则计算后得出的 scrollRatio 值为负值
* 此时就必须检查 y 的值,看当前页面处于什么位置
* 如果在页面底部,就看有没有下页,如果有,就转到下页
* 同样,向上滚动也这样处理。
*
* 另外,必须注意,当滚动到下页或上页时,页面的纵轴y还处于原来的位置
* 这表示如果上页处于页面最底部状态,下翻到下一页,还处于页面最底部。
* 所以必须设定,如果下翻到下一页,那么y值必须设定到页面顶部。
* 上翻同样,上翻到上一页,则y值设置到页面底部。
*
* 设定好以后,就给Position 属性赋值,赋值的操作实际上就是调用
* SetPositionNoInvalidate() 方法
*/
if (scrollRatio < 0) // 负数,向下滚动
{
// 检查当前页面的y位置,是否处于底部。
if(y > = (height - 177))
{
if(StartPage < (pageInfo.Length - 1)) // 如果有下页,就翻页,Length不是从零开始,必须减1
{
StartPage++;
y = 0; // 到下一页后,显示的应该是页面顶部。
p.Y = y;
Position = p;
return;
}
y = height; // 没有下页,就不翻页,直接到页面底部。
p.Y = y;
Position = p;
return;
}
// 不是处于底部
y += (int) Math.Abs(scrollRatio); // 纵轴加上滚动距离数
p.Y = y; // 指定位置。
Position = p; // 开始移动。
}
else // 正数,向上滚动
{
y = p.Y;
if(y <= 5) // 如果页面处于顶部状态
{
// 检查是否有上页
if(StartPage > 0) // 有就翻到上页
{
StartPage--;
// 到上页后,位置应该是上页的底部
y = height;
p.Y = y;
Position = p;
return;
}
// 如果没有上页,则把页面调整到顶部