表單和控制項的AutoScroll屬性和滑鼠的滾輪(MouseWheel)事件

來源:互聯網
上載者:User
如果將表單或容器控制項(如Plael控制項)的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 += new System.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();
            }
        }} ☜ ☞〒_〒▓

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1957526

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.