Winform 中panel的mousewheel鼠標滾輪事件觸發


  如果將窗體或容器控件(如Panel控件)的AutoScroll屬性設置為True時,那么當窗體或Panel容不下其中的子控件時就會出現 滾動條,通過移動滾動條可以上下顯示出窗體或Panel中的全部內容。但是默認情況下滾動條的移動只能通過鼠標直接拖動滾動條來實現,而不能通過鼠標的滾 輪來實現上下移動,因此需要手動添加代碼來實現這個功能。

  滾動鼠標的滾輪,觸發的是窗體或控件上的 MouseWheel 事件。但是在VS.net2005中,窗體和控件的事件列表中卻不包含 MouseWheel 事件,因此關於這個事件的全部代碼必須手動輸入。這里以添加一個Panel的 MouseWheel 事件為例。首先在窗體的構造函數或InitializeComponent函數中,添加對MouseWheel 事件的訂閱:

this.Panel.MouseWheel+=new System.Windows.Forms.MouseEventHandler(this.Panel_MouseWheel);

  這樣只是使Panel能接收鼠標的滾動事件,但還不能實現滾動條的上下移動,因此還需要添加以下代碼:

private void Panel_MouseWheel(object sender, MouseEventArgs e) { Panel.VerticalScroll.Value+=10; Panel.Refresh(); Panel.Invalidate(); Panel.Update(); }

  如果添加了以上代碼,就認為萬事大吉了,那就大錯特錯了。運行以上的程序,可以發現,Panel控件並不能對鼠標滾輪事件做出反應,原因是 Panel控件默認不能獲得焦點,因此它就不能捕獲鼠標,也就不能捕獲鼠標的滾輪事件。解決方法是讓Panel控件先獲得焦點,可以通過Panel的 MouseClick事件或MouseEnter事件來執行this.Panel.Focus()以達到目的。這樣當鼠標點擊了Panel控件或移動到 Panel控件上時它就獲得了焦點。因此還需要添加以下代碼:

 private void Panel_MouseClick(object sender, MouseEventArgs e) { this.Panel.Focus(); }

  這樣再執行程序,就可以達到通過鼠標滾動來移動滾動條的目的了。

  除此之外還要說的一點是,觸發鼠標的滾動事件后,處理事件的函數參數 MouseEventArgs e 中有個Delta屬性,默認情況下向上滾動e.Delta=120,向下滾動e.Delta=-120。

  以上的程序還不是特別完美,因為當Panel控件較大而沒有顯示滾動條時,或滾動條已在最上方而滾輪又是向上滾動,或滾動條已在最下方而滾輪又 是向下滾動時,同樣會執行Panel.Refresh();Panel.Invalidate();Panel.Update();等窗體重繪代碼,占用 較多資源。因此可以在執行這些代碼前先對Panel的當前狀況做判斷。完整的程序代碼如下:

public partial class PlotInfoForm. Form { int lastRightPanelVerticalScrollValue=-1;//為鼠標滾動事件提供一個靜態變量,用來存儲上次滾動后的VerticalScroll.Value public PlotInfoForm() { InitializeComponent(); this.rightPanel.MouseWheel+=newSystem.Windows.Forms.MouseEventHandler(this.rightPanel_MouseWheel); } //當鼠標在右側面板上單擊時,激活其滾動事件 private void rightPanel_MouseClick(object sender, MouseEventArgs e) { this.rightPanel.Focus(); } private void rightPanel_MouseWheel(object sender, MouseEventArgs e) { if(!(rightPanel.VerticalScroll.Visible==false||(rightPanel.VerticalScroll.Value==0&&e.Delta>0)||(rightPanel.VerticalScroll.Value==lastRightPanelVerticalScrollValue&&e.Delta<0))) { rightPanel.VerticalScroll.Value+=10; lastRightPanelVerticalScrollValue=rightPanel.VerticalScroll.Value; rightPanel.Refresh(); rightPanel.Invalidate(); rightPanel.Update(); } } }



引用: http://outofmemory.cn/code-snippet/3152/C-panel-mousewheel-shubiao-gunlun-event-trigger
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM