自定义控件加入鼠标滚轮事件
来源:互联网 发布:3.3.5wlk数据库 编辑:程序博客网 时间:2024/05/20 05:47
http://community.csdn.net/Expert/topic/5694/5694560.xml?temp=.9589044
思路都是一样的,不过写法我不会C#,就找了一篇类似的贴上来
源代码来源:
http://www.cnblogs.com/submaie/archive/2006/12/05/474568.html
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;
}
// 如果没有上页,则把页面调整到顶部
y = 0;
p.Y = y;
Position = p;
return;
}
y -= (int) scrollRatio;
p.Y = y;
Position = p;
}
}
/// <summary>
/// Windows 内部消息处理。
/// </summary>
/// <param name="m"></param>
protected override void WndProc(ref Message m)
{
switch(m.Msg)
{
case 0x114:
WmHScroll(ref m);
return;
case 0x115:
WmVScroll(ref m);
return;
case 0x100:
WmKeyDown(ref m);
return;
}
base.WndProc(ref m);
}
- 自定义控件加入鼠标滚轮事件
- 自定义QTreeWidget和QTableWidget控件鼠标滚轮事件
- 鼠标滚轮事件
- javascript: 鼠标滚轮事件
- 兼容鼠标滚轮事件
- SWT:鼠标滚轮事件
- 鼠标--滚轮事件
- 鼠标滚轮事件
- 浅谈鼠标滚轮事件
- jquery 鼠标滚轮事件
- 【Js】鼠标滚轮事件
- 鼠标滚轮滚动事件
- 鼠标滚轮事件
- 鼠标滚轮事件
- js鼠标滚轮事件
- 鼠标滚轮事件
- JQuery鼠标滚轮事件
- 鼠标滚轮事件封装
- 快速教您Apache + Tomcat + SSL的配置
- Web第一次变革:客户端技术发展与成熟
- Web技术第二次变革:服务器端技术发展
- JAVA基础知识精华总结
- (新手必看)在Tomcat下JSP、Servlet和JavaBean环境的配置
- 自定义控件加入鼠标滚轮事件
- subversion
- 深入理解sizeof
- ClickOnce DIY全自动更新下载升级的自我实现
- 什么是AOP?
- The WTL wiki
- aop 解释
- 生活-干蚕豆去皮
- 好消息:可以匿名回复了