如果將表單或容器控制項(如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