視窗程式設計中,有時候會創建許多panel來容納資料,當資料太多時會使用到scroll bar,但panel是不支援滑鼠滾輪事件的。
本文演示如何讓panel也能支援滑鼠滾輪事件。
首先你的Panel的AutoScroll屬性必須要設為True。
實作以下步驟:
- IMessageFilter
- PreFilterMessage method
- 在Form中建構函式加入功能
1 2 3 4 |
using System; using System.Drawing; using System.Runtime.InteropServices; using System.Windows.Forms; |
Form class中繼承&添加的程式碼如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
namespace yournamespace { public partial class Form1:Form, IMessageFilter { [DllImport("user32.dll"] private static extern IntPtr WindowFromPoint(Point pt); [DllImport("user32.dll"] private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp); } public Form1() { InitializeComponent(); Application.AddMessageFilter(this); } public bool PreFilterMessage(ref Message e) { if (m.Msg == 0x20a) { Point pos = new Point(m.LParam.ToInt32() & 0xffff, m.LParam.ToInt32() >> 16); IntPtr hWnd = WindowFromPoint(pos); if (hWnd != IntPtr.Zero && hWnd != m.HWnd && Control.FromHandle(hWnd) != null) { SendMessage(hWnd, m.Msg, m.WParam, m.LParam); return true; } } return false; } } |
如此一來,只要有AutoScroll屬性為True的控件,都會有效。
留言
好高興看到您的文章,解決了mousewheel不能AutoScroll的疑惑,謝謝您!
很開心能幫助到妳!