自定义控件加入鼠标滚轮事件

来源:互联网 发布: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);
        }
 

 
原创粉丝点击