سؤال

أقوم بإنشاء تطبيق WinForms مع ضبط ListView على التفاصيل بحيث يمكن عرض عدة أعمدة.

أرغب في تمرير هذه القائمة عندما يكون الماوس فوق عنصر التحكم ويستخدم المستخدم عجلة تمرير الماوس.في الوقت الحالي، يحدث التمرير فقط عندما يتم التركيز على ListView.

كيف يمكنني جعل ListView يتم تمريره حتى في حالة عدم التركيز عليه؟

هل كانت مفيدة؟

المحلول

عادةً ما ستنقل أحداث الماوس/لوحة المفاتيح إلى النافذة أو عنصر التحكم فقط عندما يتم التركيز عليها.إذا كنت تريد رؤيتها دون تركيز، فسيتعين عليك وضع خطاف منخفض المستوى.

فيما يلي مثال لخطاف الماوس ذو المستوى المنخفض

نصائح أخرى

الحل "البسيط" والعملي:

public class FormContainingListView : Form, IMessageFilter
{
    public FormContainingListView()
    {
        // ...
        Application.AddMessageFilter(this);
    }

    #region mouse wheel without focus

    // 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);

    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() & 0xffff, m.LParam.ToInt32() >> 16);
            IntPtr hWnd = WindowFromPoint(pos);
            if (hWnd != IntPtr.Zero && hWnd != m.HWnd && System.Windows.Forms.Control.FromHandle(hWnd) != null)
            {
                SendMessage(hWnd, m.Msg, m.WParam, m.LParam);
                return true;
            }
        }
        return false;
    }

    #endregion
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top