2011-01-22 63 views
6

Tôi có một Biểu mẫu Windows (hoạt động trong C# .NET).Windows Forms: chụp MouseWheel

Biểu mẫu có một vài bảng ở phía trên cùng và một số ComboBoxes và DataGridView ở dưới cùng.

Tôi muốn sử dụng sự kiện cuộn trên bảng trên cùng, nhưng nếu chọn ví dụ: ComboBox tiêu điểm bị mất. Các bảng chứa nhiều điều khiển khác nhau.

Làm thế nào tôi có thể luôn nhận được các sự kiện bánh xe chuột khi chuột ở trên bất kỳ bảng nào? Cho đến nay tôi đã cố gắng sử dụng các sự kiện MouseEnter/MouseEnter nhưng không có may mắn.

Trả lời

13

gì bạn mô tả âm thanh như bạn muốn sao chép các chức năng của ví dụ Microsoft Outlook, mà bạn không cần phải thực sự nhấp để tập trung điều khiển để sử dụng chuột bánh xe trên đó.

Đây là vấn đề tương đối nâng cao để giải quyết: nó liên quan đến việc triển khai giao diện IMessageFilter của biểu mẫu có chứa, tìm kiếm sự kiện WM_MOUSEWHEEL và hướng chúng đến điều khiển chuột di chuột qua.

Dưới đây là một ví dụ (từ here):

using System; 
using System.ComponentModel; 
using System.Drawing; 
using System.Windows.Forms; 
using System.Runtime.InteropServices; 

namespace WindowsApplication1 { 
    public partial class Form1 : Form, IMessageFilter { 
    public Form1() { 
     InitializeComponent(); 
     Application.AddMessageFilter(this); 
    } 

    public bool PreFilterMessage(ref Message m) { 
     if (m.Msg == 0x20a) { 
     // WM_MOUSEWHEEL, find the control at screen position m.LParam 
     Point pos = new Point(m.LParam.ToInt32()); 
     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; 
    } 

    // P/Invoke declarations 
    [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); 
    } 
} 

Lưu ý rằng mã này đang hoạt động cho tất cả các hình thức trong ứng dụng của bạn, không chỉ là hình thức chính.

+0

Cảm ơn, đã nhìn thấy nó ở đó nhưng tôi không chắc chắn tại sao việc xử lý WM_MOUSEWHEEL không phải là rất mong muốn. – n0ter

+0

Xin chào, đó là mã của tôi! Không chắc chắn nếu yêu cầu phân bổ là thích hợp ở đây, nó nên được. –

+0

Bình luận của poster là "Windows" xử lý các sự kiện MouseWheel không phải là rất mong muốn ", có nghĩa là việc thực thi Windows mặc định của bánh xe chuột có nghĩa là nó gửi các sự kiện đến điều khiển bằng tiêu điểm, chứ không phải điều khiển chuột hơn, như hầu hết mọi người mong đợi hoặc mong muốn. –

0

Mọi điều khiển đều có sự kiện con lăn chuột xảy ra khi bánh xe chuột di chuyển trong khi điều khiển đã lấy nét.

Kiểm tra này ra để biết thêm: Control.MouseWheel Event

Các vấn đề liên quan