鼠標滾輪實現窗體圖形縮放MouseWheel


        功能描述:在鼠標進入一個用於繪制圖形的窗體(如:Show_3D)時,滾動鼠標滾輪,使窗體中的內容能夠進行放大縮小.此處以繪制XNA圖形為例.

         滾動鼠標的滾輪,觸發的是窗體或控件上的 MouseWheel 事件。但是在VS2008以及其他版本中,窗體和控件的事件列表中並不包含 MouseWheel 事件,因此對於這個事件的事件處理函數須手動創建和實現。
首先在窗體的構造函數中,添加如下代碼:

1 this.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.Panel_MouseWheel);
View Code

這樣只是使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;
                 }          
 }
View Code

添加了以上代碼后,運行上述的程序,發現無論是在窗體內還是在窗體外鼠標滾輪都會對窗體中內容進行縮放。解決方法是可以通過窗體的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 }
View Code

20130327 補充:

  上次做的這個是Form窗體,所以其實在上面的代碼中及時不寫this.Focus();這行代碼也是可行的!但最近我處理了一個Panel控件捕獲鼠標滾輪消息處理縮放的問題:

  由於panel控件(此處假設控件名稱為XNAPanel,並且增加了相關的消息處理函數如:XNAPanel_MouseEnter(),XNAPanel_MouseWheel()等,具體方法和上面的一樣)默認不能獲得焦點,所以不能夠捕獲鼠標,這時就必須要增加獲取焦點的代碼.

  因此,需要在XNAPanel_MouseEnter() 或者 XNAPanel_MouseClick()中增加如下的代碼:

 

1 this.XNAPanel.Focus();
View Code

 

 


免責聲明!

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



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