2018年9月10日 星期一

ComboBox 禁用滑鼠滾輪

ComboBox 點選後,焦點會停留在元件上,此時如動到滑鼠滾輪,可能會造成資料變動。

最初的解決方像是想變更焦點,因為 Winform 沒有類似 Blur() 的函式,所以在 SelectedIndexChanged 事件加入:
// 下拉選單選擇後就讓焦點消失,避免USER滾到滑鼠滾輪
this.ActiveControl = null;


但是,如果 USER 這樣操作:點了選單,但並沒有改變選項,又再次點擊選單本身,滾輪依然是有效的。想在 MouseLeave 內處理,但是同上,沒有離開 (Leave) 也是無效。

上述的方式換成讓其他元件 Focus() 也可以,問題在於沒有合適的事件能處理。最後只好新建一個 ComboBox 類別,繼承原生物件,但屏蔽滑鼠滾論事件。
using System.Windows.Forms;

namespace LIB.MyControl
{
    // 定義一個新的 ComboBox,繼承原本元件,但排除滾論事件 (m.Msg == 0x020A)
    public class ComboBoxNoWheel : System.Windows.Forms.ComboBox, IMessageFilter
    {
        public ComboBoxNoWheel()
        {
            Application.AddMessageFilter(this); // 整個 Application 都會有影響
        }

        public bool PreFilterMessage(ref Message m)
        {
            if (m.Msg == 0x020A && this.Focused) // 加入 this.Focused,判斷 ComboBox 為焦點時才作用,避免影響整個 Application
                return true;
            return false;
        }
    }
}


參考資料:
https://blog.csdn.net/jamex/article/details/4257679