打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
C#窗体和控件的AutoScroll属性和鼠标的滚轮(MouseWheel)事件

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

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

this.Panel1.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.Panel1_MouseWheel);

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

private void Panel1_MouseWheel(object sender, MouseEventArgs e)
{
Panel1.VerticalScroll.Value -= e.Delta;
Panel1.Refresh();
Panel1.Invalidate();
Panel1.Update();
}

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

private void Panel1_MouseClick(object sender, MouseEventArgs e)
{
this.Panel1.Focus();
}

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

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

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

int mVSValue = this.Panel1.VerticalScroll.Value;

if ((mVSValue - pScrollValueDelta) <= this.Panel1.VerticalScroll.Minimum)
{
    this.Panel1.VerticalScroll.Value = this.Panel1.VerticalScroll.Minimum;
}
else if ((mVSValue - pScrollValueDelta) >= this.Panel1.VerticalScroll.Maximum)
{
    this.Panel1.VerticalScroll.Value = this.Panel1.VerticalScroll.Maximum;
}
else
{
    this.Panel1.VerticalScroll.Value -= pScrollValueDelta;
}

if (this.Panel1.VerticalScroll.Value != mVSValue)
{
    return;
}

this.Panel1.Refresh();
this.Panel1.Invalidate();
this.Panel1.Update();

有些时候,还是无法让Panel获得焦点,然而没有获得焦点又无法接受MouseWheel事件,针对这些情况,可以让这个Panel所在的窗体获得MouseWheel事件。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
(.net)让panel支持mousewheel滚轮,适用于其它不可获得焦点控件
vb.net入门——分组控件:Panel控件的使用
你不知道的鼠标小技巧,赶紧试试吧!
VB6.0对鼠标滚轮不支持的解决方法
c#如何将子窗体显示到父窗体的容器(panel)控件中
鼠标滚轮突然失灵?教你一招解决方法,三步就能恢复!
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服