首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

关于mousewheel事件有关问题。

2012-12-22 
关于mousewheel事件问题。急,在线等...由于我要实现控件的缩放功能所以需要用到mousewheel事件。 但奇怪的是

关于mousewheel事件问题。急,在线等...
   由于我要实现控件的缩放功能所以需要用到mousewheel事件。 但奇怪的是,我vs2010右边的控件事件当中根本找不到mousewheel事件。 
   没办法我只好在designer中手动添加了mousewheel事件。如下:
   this.panel_paint.MouseWheel+=new System.Windows.Forms.MouseEventHandler(this.panel_paint_MouseWheel);
   然后又在代码中添加了相应方法
    private void panel_paint_MouseWheel(object sender, MouseEventArgs e)
        {
          
            foreach (Control c in panel_paint.Controls)
            {

                if (c.GetType() == new PictureBox().GetType())
                {
                    c.Height += Convert.ToInt32(e.Delta * 0.0001);
                    c.Width += Convert.ToInt32(e.Delta * 0.0001);
                }
            }
        }
    最后的结果是  运行之后完全没有反应。我用了下ctrl+F10想直接运行到mousewheel的方法中。结果很果断的现实 无法运行到光标处······。
   求解原因  谢谢。
[最优解释]
因为panel没有获得焦点
你用能获得焦点的控件试试 比如button
[其他解释]
不要手动更改designer.cs文件
this.panel_paint.MouseWheel+=new System.Windows.Forms.MouseEventHandler(this.panel_paint_MouseWheel);
这句话你完全可以写到Form的构造函数或Form_Load里啊
[其他解释]


如果将窗体或容器控件(如Plael控件)的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控件上时它就获得了焦点。因此还需要添加以下代码:
view sourceprint?1 private void Panel_MouseClick(object sender, MouseEventArgs e)  

2 {  

3 this.Panel.Focus();  

4 } 

这样再执行程序,就可以达到通过鼠标滚动来移动滚动条的目的了。
除此之外还要说的一点是,触发鼠标的滚动事件后,处理事件的函数参数 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 += new System.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();            }        }}


[其他解释]
归结原因主要是pannel 没有获取焦点吗?
  话句话说如果我手动设置pannel获得焦点的话 可以用吗?
  比如说我设置mouseEnter事件然后给它this.pannel.Focus() 这样可以吗?
[其他解释]
引用:
归结原因主要是pannel 没有获取焦点吗?
  话句话说如果我手动设置pannel获得焦点的话 可以用吗?
  比如说我设置mouseEnter事件然后给它this.pannel.Focus() 这样可以吗?

你在panel中放个控件(比如TextBox),让这个控件获得焦点,你在滑动滚轮。panel会响应事件的
[其他解释]
用Addhandle来做
[其他解释]
引用:
归结原因主要是pannel 没有获取焦点吗?
  话句话说如果我手动设置pannel获得焦点的话 可以用吗?
  比如说我设置mouseEnter事件然后给它this.pannel.Focus() 这样可以吗?


这样做完全正确

热点排行