功能描述:在鼠標進入一個用於繪制圖形的窗體(如:Show_3D)時,滾動鼠標滾輪,使窗體中的內容能夠進行放大縮小.此處以繪制XNA圖形為例.
滾動鼠標的滾輪,觸發的是窗體或控件上的 MouseWheel 事件。但是在VS2008以及其他版本中,窗體和控件的事件列表中並不包含 MouseWheel 事件,因此對於這個事件的事件處理函數須手動創建和實現。
首先在窗體的構造函數中,添加如下代碼:

1 this.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.Panel_MouseWheel);
這樣只是使Panel能接收鼠標的滾動事件,但還不能實現窗體中內容的放大縮小,因此還需要添加以下代碼:

private void Show_3D_MouseWheel(object sender, MouseEventArgs e) { float Mo = 0; if (e.Delta > 0) { Mo = 8; } else { Mo = -8; } if (Global.myCamera.cameraPosition.Y < 90.0f) { Global.myCamera.cameraPosition += 0.01f * Mo * (Global.myCamera.cameraTarget - Global.myCamera.cameraPosition); } else { Global.myCamera.cameraPosition.Y = 89.0f; } }
添加了以上代碼后,運行上述的程序,發現無論是在窗體內還是在窗體外鼠標滾輪都會對窗體中內容進行縮放。解決方法是可以通過窗體的MouseEnter事件和MouseLeave事件來對一個bool變量進行賦值更改,標識當前鼠標是否在窗體的范圍內,以達到目的。也就是說增加變量inxna,使其在窗體外滾動鼠標滾輪時,不能起到放大縮小的功能.
除此之外還要說的一點是,觸發鼠標的滾動事件后,處理事件的函數參數 MouseEventArgs e 中有個Delta屬性,默認情況下向上滾動e.Delta == 120,向下滾動e.Delta == -120。
完整的程序代碼如下:

1 public partial class Show_3D : Form 2 { 3 public Show_3D() 4 { 5 InitializeComponent(); 6 7 //lxw0109 20130314 8 //Show_3D窗體中鼠標滾輪實現縮放的處理 9 this.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.Show_3D_MouseWheel); 10 } 11 //lxw0109 20130314 12 //通過滾輪實現放大縮小的更改 13 private void Show_3D_MouseWheel(object sender, MouseEventArgs e) 14 { 15 if (Global.inxna) 16 { 17 float Mo = 0; 18 if (e.Delta > 0) 19 { 20 Mo = 8; 21 } 22 else 23 { 24 Mo = -8; 25 } 26 if (Global.myCamera.cameraPosition.Y < 90.0f) 27 { 28 Global.myCamera.cameraPosition += 0.01f * Mo * (Global.myCamera.cameraTarget - Global.myCamera.cameraPosition); 29 } 30 else 31 { 32 Global.myCamera.cameraPosition.Y = 89.0f; 33 } 34 } 35 } 36 37 private void Show_3D_MouseEnter(object sender, EventArgs e) 38 { 39 //lxw0109 20130314 滾輪縮放 40 Global.inxna = true; 41 this.Focus(); 42 ... 43 } 44 45 private void Show_3D_MouseLeave(object sender, EventArgs e) 46 { 47 //lxw0109 20130314 滾輪縮放 48 Global.inxna = false; 49 ... 50 } 51 ... 52 }
20130327 補充:
上次做的這個是Form窗體,所以其實在上面的代碼中及時不寫this.Focus();這行代碼也是可行的!但最近我處理了一個Panel控件捕獲鼠標滾輪消息處理縮放的問題:
由於panel控件(此處假設控件名稱為XNAPanel,並且增加了相關的消息處理函數如:XNAPanel_MouseEnter(),XNAPanel_MouseWheel()等,具體方法和上面的一樣)默認不能獲得焦點,所以不能夠捕獲鼠標,這時就必須要增加獲取焦點的代碼.
因此,需要在XNAPanel_MouseEnter() 或者 XNAPanel_MouseClick()中增加如下的代碼:

1 this.XNAPanel.Focus();