在程序運行中,產生事件的主體有很多,其中尤其以鍵盤和鼠標為最多。本文就來探討一下在C#中和這二個主體相關的事件的處理過程。
一.本文介紹的程序設計和運行的軟件環境:
(1).微軟公司視窗2000服務器版
(2)..Net FrameWork SDK Beta 2
二.C#中處理鼠標相關的事件:
鼠標相關的事件大致有六種,分別是 :
"MouseHover"、"MouseLeave"、"MouseEnter"、"MouseMove"、"MouseDown"和"MouseUp"。
(1).如何在C#程序中定義這些事件:
在C#中是通過不同的Delegate來描述上述事件,其中描述"MouseHover"、"MouseLeave"、"MouseEnter"事件的Delegate是"EventHandler",而描述後面的三個事件的Delegate是"MouseEventHandler"來描述。這二個Delegate分別被封裝在不同的命名空間,其中"EventHandler"被封裝在"System"命名空間;"MouseEventHandler"被封裝在"Syetem.Windows.Froms"命名空間中的。在為"MouseHover"、"MouseLeave"、"MouseEnter"事件通過數據的類是"EventArgs",他也被封裝在"System"命名空間中;而為後面的三個事件提供數據的類是"MouseEventArgs",他卻被封裝在"Syetem.Windows.Froms"命名空間。以上這些就決定了在C#中定義這些事件和響應這些事件有著不同的處理辦法。下面就來介紹這些不同點。
對於上述的前三個事件,是用以下語法來定義的:
"組件名稱"."事件名稱"+= new System.EventHandler("事件名稱");
下面是程序中具體實現代碼:
button1.MouseLeave += new Syetem.EvenHandler(button1_MLeave);
在完成了事件的定義以後,就要在程序中加入響應此事件的代碼,否則程序編譯的時候會報錯。下面是響應上面事件的基本結構。
private void button1_MLeave ( object sender , System.EventArgs e ) { 此處加入響應此事件的代碼 }
定義"MouseMove"、"MouseDown"和"MouseUp"事件的語法和前面介紹的三個事件大致相同,具體如下:
"組件名稱"."事件名稱"+= new System.Windows.Forms. MouseEventHandler("事件名稱");
下面是程序中具體實現代碼:
button1.MouseMove += new System.Windows.Forms.MouseEventHandler(button1_MMove);
下面是響應上面事件的基本結構:
private void button1_MMove ( object sender , System.Windows.Forms. MouseEventArgs e ) { 此處加入響應此事件的代碼 }
注釋:在上述程序中的"button1"是定義的一個按鈕組件。
(2).鼠標相關事件中的典型問題處理辦法:在掌握了C#中定義和鼠標相關的事件,我們就來探討一下和鼠標相關事件的典型問題。其一是讀取鼠標的當前位置;其二是判定到底是那個鼠標按鍵按動。
判定鼠標的位置可以通過事件"MouseMove"來處理,在"MouseEventArgs"類中提供了二個屬性"X"和"Y",來判定當前鼠標縱坐標和橫坐標。而判定鼠標按鍵的按動情況,可以通過事件"MouseDown"來處理,並且在"MouseEventArgs"類中也提供了一個屬性"Button"來判定鼠標按鍵情況。根據這些知識,可以得到用C#編寫的讀取鼠標當前位置和判定鼠標按鍵情況的程序代碼。下面就是此代碼(mouse.cs)和此代碼編譯後運行界面:
圖01:用C#讀取鼠標位置和鼠標按鍵的程序運行界面
mouse.cs的源程序代碼如下:
using System ; using System.Drawing ; using System.Collections ; using System.ComponentModel ; using System.Windows.Forms ; using System.Data ; public class Form1 : Form { private System.ComponentModel.Container components = null ; public Form1 ( ) { file://初始化窗體中的各個組件 InitializeComponent ( ) ; } file://清除程序中使用過的資源 protected override void Dispose ( bool disposing ) { if ( disposing ) { if (components != null) { components.Dispose ( ) ; } } base.Dispose ( disposing ) ; } private void InitializeComponent ( ) { this.AutoScaleBaseSize = new System.Drawing.Size ( 6 , 14) ; this.ClientSize = new System.Drawing.Size ( 292 , 273 ) ; this.Name = "Form1" ; this.Text = "C#處理鼠標按動事件!" ; file://為鼠標按動定義一個事件處理過程"Form1_MouseDown" this.MouseDown += new MouseEventHandler ( Form1_MouseDown ) ; file://為鼠標移動定義一個事件處理過程"Form1_MouseMove" this.MouseMove += new MouseEventHandler ( Form1_OnMouseMove ) ; } static void Main ( ) { Application.Run ( new Form1 ( ) ) ; } private void Form1_OnMouseMove ( object sender , MouseEventArgs e ) { this.Text = "當前鼠標的位置為:( " + e.X + " , " + e.Y + ")" ; } private void Form1_MouseDown ( object sender , MouseEventArgs e ) { file://響應鼠標的不同按鍵 if ( e.Button == MouseButtons.Left ) { MessageBox.Show ( "按動鼠標左鍵!" ) ; } if ( e.Button == MouseButtons.Middle ) { MessageBox.Show ( "按動鼠標中鍵!") ; } if ( e.Button == MouseButtons.Right ) { MessageBox.Show ( "按動鼠標右鍵!") ; } } }