事件是C#語言內置的語法,可以定義和處理事件,為使用組件編程提供了良好的基礎。
Windows應用程序和dos程序的最大不同是采用事件驅動方式工作,也叫消息驅動。dos程序如要從鍵盤輸入數據,則要獨占鍵盤等待用戶輸入,如用戶不輸入,則CPU一直執行鍵盤輸入程序,等待用戶輸入,即DOS程序獨占外設和CPU。
Windows操作系統是一個多任務的操作系統,允許同時運行多個程序,它不允許任何一個程序獨占外設,如鍵盤、鼠標等,所有運行程序共享外設和CPU,各個運行程序都要隨時准備從外設接受命令,執行命令。因此必須由Windows操作系統統一管理各種外設。
Windows把用戶對外設的動作都看作事件(消息),如單擊鼠標左鍵,發送單擊鼠標左鍵事件,用戶按下鍵盤,發送鍵盤被按下的事件等。Windows操作系統統一負責管理所有的事件,根據具體情況把事件發送到相應運行程序,而各個運行程序自動用一個函數響應事件,這個函數叫事件處理函數。這種方法叫事件驅動。Windows操作系統在window.h文件中預定義了若干事件。在Form類和控件類中都定義了WndProc方法可截獲Windows消息,這是一個虛函數。在它們的派生類中可重寫WndProc方法,截獲Windows消息,見下例,方法中Message是一個結構,m.Msg為事件編號,m.Wparam和m.LParam是事件的附加信息,事件不同,意義也不同。
protected override void WndProc(ref Message m)
{ base.WndProc(ref m);//調用基類事件處理函數
if(m.Msg==0x0112&&(int)m.WParam==0xf060) {…} //自定義處理事件代碼
}
using System;
public delegate void ChangedEvent(object sender, EventArgs e); //代表類聲明
public class Person
{ public event ChangedEvent Changed;//聲明事件
private string P_name = "張三";//P_name是私有字段
public string Name //定義屬性Name
{ get{ return P_name; }
set{ P_name = value; //修改了屬性Name
OnChanged(EventArgs.Empty); }
}//希望屬性Name被改變後,發出Changed事件
public virtual void OnChanged(EventArgs e)
{ if (Changed != null)//如果Changed代表了事件處理函數
Changed(this, e);//執行Changed代表的函數
}
}
public class Test
{ public static void Main()
{… } //代碼見下節
static void OnePerson_Changed(object sender, EventArgs e)
{Console.WriteLine("修改了數據"); }
}