• Winform 中panel的mousewheel鼠标滚轮事件触发


      如果将窗体或容器控件(如Panel控件)的AutoScroll属性设置为True时,那么当窗体或Panel容不下其中的子控件时就会出现 滚动条,通过移动滚动条可以上下显示出窗体或Panel中的全部内容。但是默认情况下滚动条的移动只能通过鼠标直接拖动滚动条来实现,而不能通过鼠标的滚 轮来实现上下移动,因此需要手动添加代码来实现这个功能。

      滚动鼠标的滚轮,触发的是窗体或控件上的 MouseWheel 事件。但是在VS.net2005中,窗体和控件的事件列表中却不包含 MouseWheel 事件,因此关于这个事件的全部代码必须手动输入。这里以添加一个Panel的 MouseWheel 事件为例。首先在窗体的构造函数或InitializeComponent函数中,添加对MouseWheel 事件的订阅:

    this.Panel.MouseWheel+=new System.Windows.Forms.MouseEventHandler(this.Panel_MouseWheel);

      这样只是使Panel能接收鼠标的滚动事件,但还不能实现滚动条的上下移动,因此还需要添加以下代码:

    private void Panel_MouseWheel(object sender, MouseEventArgs e)
    {
      Panel.VerticalScroll.Value+=10;
      Panel.Refresh();
      Panel.Invalidate();
      Panel.Update();
    }

      如果添加了以上代码,就认为万事大吉了,那就大错特错了。运行以上的程序,可以发现,Panel控件并不能对鼠标滚轮事件做出反应,原因是 Panel控件默认不能获得焦点,因此它就不能捕获鼠标,也就不能捕获鼠标的滚轮事件。解决方法是让Panel控件先获得焦点,可以通过Panel的 MouseClick事件或MouseEnter事件来执行this.Panel.Focus()以达到目的。这样当鼠标点击了Panel控件或移动到 Panel控件上时它就获得了焦点。因此还需要添加以下代码:

     private void Panel_MouseClick(object sender, MouseEventArgs e)
        {
        this.Panel.Focus();
        }

      这样再执行程序,就可以达到通过鼠标滚动来移动滚动条的目的了。

      除此之外还要说的一点是,触发鼠标的滚动事件后,处理事件的函数参数 MouseEventArgs e 中有个Delta属性,默认情况下向上滚动e.Delta=120,向下滚动e.Delta=-120。

      以上的程序还不是特别完美,因为当Panel控件较大而没有显示滚动条时,或滚动条已在最上方而滚轮又是向上滚动,或滚动条已在最下方而滚轮又 是向下滚动时,同样会执行Panel.Refresh();Panel.Invalidate();Panel.Update();等窗体重绘代码,占用 较多资源。因此可以在执行这些代码前先对Panel的当前状况做判断。完整的程序代码如下:

    public partial class PlotInfoForm. Form
    {
      int lastRightPanelVerticalScrollValue=-1;//为鼠标滚动事件提供一个静态变量,用来存储上次滚动后的VerticalScroll.Value
      public PlotInfoForm()
      {
        InitializeComponent();
        this.rightPanel.MouseWheel+=newSystem.Windows.Forms.MouseEventHandler(this.rightPanel_MouseWheel);
      }
    
      //当鼠标在右侧面板上单击时,激活其滚动事件
      private void rightPanel_MouseClick(object sender, MouseEventArgs e)
      {
        this.rightPanel.Focus();
      }
      private void rightPanel_MouseWheel(object sender, MouseEventArgs e)
      {
        if(!(rightPanel.VerticalScroll.Visible==false||(rightPanel.VerticalScroll.Value==0&&e.Delta>0)||(rightPanel.VerticalScroll.Value==lastRightPanelVerticalScrollValue&&e.Delta<0)))
        {
          rightPanel.VerticalScroll.Value+=10;
          lastRightPanelVerticalScrollValue=rightPanel.VerticalScroll.Value;
          rightPanel.Refresh();
          rightPanel.Invalidate();
          rightPanel.Update();
        }
      }
    }



    引用: http://outofmemory.cn/code-snippet/3152/C-panel-mousewheel-shubiao-gunlun-event-trigger
     
  • 相关阅读:
    POJ 1251 Jungle Roads
    1111 Online Map (30 分)
    1122 Hamiltonian Cycle (25 分)
    POJ 2560 Freckles
    1087 All Roads Lead to Rome (30 分)
    1072 Gas Station (30 分)
    1018 Public Bike Management (30 分)
    1030 Travel Plan (30 分)
    22. bootstrap组件#巨幕和旋转图标
    3. Spring配置文件
  • 原文地址:https://www.cnblogs.com/eye-like/p/4797003.html
Copyright © 2020-2023  润新知