引言:
微軟的.Net平台堪稱為新一代的互聯網平台。對於技術開發人員來說,.Net平台的兩大特性是非常卓越的,首先是其所提供的公共語言運行時,也就是公用語言運行平台,另一方面就是龐大而全面的統一編程類。
C#語言是微軟公司針對.Net平台才推出來的一門新語言,作為.Net平台的第一語言,它幾乎集中了所有關於軟件開發和軟件工程研究的最新成果。其不但繼承了C++、Java等面向對象的強大功能特性,同時還是繼承了VB、Delphi等編程語言的可視化快速開發功能,其是當前第一個完全面向組件的語言。
.Net平台中的程序設計主要分為以下四個方面:Web Forms、Windows Forms、Web Service及Windows Service,下面我向大家介紹Windows Forms程序的設計。
1、基本知識要點
C#語言:C#語言自C/C++演變而來。它是現代、簡單、完全面向對象和類型安全的。如果您是C/C++程序員,學習曲線將會很平坦。許多C#語句直接借用您所喜愛的語言,包括表達式和操作符。C#是現代的編程語言。C#減少了C++的一些特性,不再有宏、模板和多重繼承。使編程更方便的新功能是嚴格的類型安全、版本控制、垃圾收集(garbage collect)等等。所有的這些功能的目標都是瞄准了開發面向組件的軟件。因此也把C#稱為面向組件的語言。
類:類是一組具有相同數據結構和相同操作的對象的集合。類是對一系列具有相同性質的對象的抽象,是對對象共同特征的描述。比如每一輛汽車是一個對象的話,所有的汽車可以作為一個模板,我們就定義汽車這個類。C#是面向對象的,而且所有的C#代碼都必須放在一個類中,不在有全局變量及全局名稱等。
.Net類庫:微軟為.Net平台設計了非常龐大編程類。這些類包括從操作系統的底層到視窗界面,從數據庫開發到Web服務等,涉及面非常廣。這些類都是在公用語言運行時上,而且是管理、安全的代碼。通過使用.Net提供的“超”類庫,你可非常輕松的開發.Net平台上的四大類程序:即Web Forms、Windows Forms、Web Service及Windows Service。
Windows Forms程序:類似於Windows程序,是指能在微軟公司操作系統平台如Windows 98,Windows NT及Windows2000等平台上面運行的,有著非常漂亮臉蛋(如窗體、菜單、各種控制等)的程序。Windows Forms是在.Net平台中初次出現的概念,也稱為Windows窗體,由於是.Net Windows Forms程序,因此你的視窗系統就必須首先安裝.Net平台,才能運行。
事件:在Windows系統中,我們對窗體的各種操作都將為引發一個事件,如按一個按鈕引發一個點擊(Click),在文本框中輸入內容時將引發文本框的文本改變(Change)事件。事件產生時將要發送消息,並由專門的消息處理程序翻譯並處理消息。
Visual Studio .Net:是微軟.Net平台上的一個功能強大的、集成多種開發語言的軟件開發工具。通過該開發工具,大多數.Net編程語言都可以實現RAD(快速開發)。
2 Windows Forms中的幾個基本概念
啟動程序
Windows Forms程序與一般運用程序不同的是其是通過非常漂亮的外觀窗體及窗體上各種控件與用戶交互。程序不是一步一步的執行,而是有一個消息循環,根據用戶的各種操作所引發的事件選擇執行相應的功能。為了能管理、解釋Windows的各種消息、用戶鍵盤或鼠標輸入並響應各種事件,.Net類庫為我們提供了一個專門用於啟動Windows程序的類:System.Windows.Forms.Application,通過使用Application類,我們可以非常容易就啟動一個Windows Forms程序,並把有關消息的解釋、鍵盤及鼠標的輸入管理、各種事件的響應等都交由Application負責處理。
另外,在Windows應用程序中,與一般的運用程序一樣,程序的入口也一個類中的Main()方法(注意Main要求首字母大寫),同樣必須是static(靜態)方法,否則程序將找不到入口點。
下面,是C#中一個非常簡單的啟動Windows程序的例子:
static public void Main()
{
Application.Run(new Form());
}
另外,Windows Forms程序的結束也是由Application類來進行的。
窗體
Windows操作系統最主要的成功得源於其漂亮的外觀,即窗體。一般的Windows程序都有一個窗體,你可以把各種各樣的控件(如標簽、文本框、命令按鈕等)放置在窗體上,組成一個非常人性的人機界面。在.Net Windows Forms中使用窗體只需從System.Windows.Forms.Form類或其派生類的創建一個對象即可。
下面的代碼,是C#中一個非常簡單的繼承Form(窗體)類的例子:
public class myForm:System.Windows.Forms
{
private System.Windows.Forms.Button button1;
public myForm()
{
}
}
在自定義的窗體類myForm中增加了一個Button(按鈕)對象。
事件
在Windows Forms程序中,幾乎用戶的大多數都將操作都將產生Windows事件,如按一個按鈕引發一個點擊(Click),用戶移動鼠標有相應鼠標移動的事件等;有一些事件是不是用戶操作產生而是系統自動產生的,如數據庫鏈接斷開、時間到達某一時刻或是使用外設時未就緒等。
在Windows Forms中,每一個Windows控件有非常多的事件使其可以達到與用戶交互,事件的監視及管理是由前面所說Application類負責的。在產生一個事件時一般經引發一系列操作,如點擊“刷新”按鈕使用程序重新從讀取數據庫中的數據、點擊窗體上的關閉圖標將關閉窗口或退出程序等。程序員就是通過書寫事件的響應方法(即事件所引發的操作)來達到對程序的控制及交互。
在.Net中,事件的聲明是通過event(事件)關鍵字來聲明的,事件是一個類的成員之一。
.Net中,事件的響應及處理是通過一個新的數據類型delegate(代表)來處理的,delegate(代表)非常類似於C/C++的函數指針,但不同的是, delegate(代表)是安全的、受管理的。
如下面分別用三種語言聲明一個控件Click事件的代碼:
public event EventHandler Click; [C#]
Public Event Click As EventHandler [Visual Basic]
public: __event EventHandler* Click; [C++]
在上面的代碼中,EventHandler是一個代表類型,其在.Net類庫中的聲明如下:
public delegate void EventHandler(object sender,EventArgs e); [C#]
Public Delegate Sub EventHandler(ByVal sender As Object,ByVal e As EventArgs) [Visual Basic]
public __gc __delegate void EventHandler(Object* sender,EventArgs* e); [C++]
事件響應方法
由於事件是解釋及管理是由Application對象進行的,程序員不需要知道用戶何時響應事件或者是響應了什麼事件,只需要為事件添加響應方法即可。通過使用delegate(代表),你可以使用“+=”(加等於)操作符非常容易地為.Net類中的一個事件添加一個甚至多個響應方法,還可以通過非常簡單的“-=”(減等於)操作符取消這些響應方法。如下面,我們為一個按鈕的Click事件添加響應方法的代碼:
button1.Click += new System.EventHandler(MyMethod);
其中,MyMethod函數的定義如下:
void MyMethod(object sender, System.EventArgs e);
這樣當用戶點擊按鈕或者是其它方法引發其Click事件時,MyMethod函數中的代碼將執行。
屬性
我們知道,在面向對象的程序設計中,一個類有很多成員,這些成員包括域(Fields)、構造函數、析構函數、方法(Methods)、事件及屬性(Properties)等。這些成員有的表示對象的一個特征,也有的使用對象執行一個操作。
.Net類中屬性(Properties)非常重要,其主要用於表示對象的特征,如一個窗體的大小、位置、是否可以最大化、是否顯示控制欄及窗體的背景色彩等等。屬性(Properties)對程序員是公開的,你可通過簡單的“=”(賦值號)就可訪問屬性。在.Net類中,有的屬性只能讀、有的只能寫,當然大多數屬性是可以讀寫的,這主要取決於類中對屬性的定義。如下面的代碼在Form(窗體)類中定義了一個控制欄是否顯示的屬性:
public bool ControlBox {get; set;} [C#]
Public Property ControlBox As Boolean[Visual Basic]
有了上面的定義,要使一個窗體不顯示控制欄,用C#只需要使用下面的簡單語句即可:
form1.ControlBox=false;
在Windows Forms程序設計中,我們都是通過設置大量的屬性值,形成一個非常漂亮的窗體的。另外,有了屬性,也增加了語言對RAD(快速開發)的很好支持。
控件:
Windows Forms程序設計中,僅僅有窗體往往是不夠的,還必須有通過眾多的控件來充實窗體的內容,達到友好、人性化的人機操作界面設計。這此,.Net類庫為我們准備了幾乎Windows Forms中會要用到的各種元素類,一般情況下,我們把這些類或其實例稱為控件,窗體就是通過各種各樣的控件充實起來的。
其實,控件這一概念是在RAD(快速開發)工具中運用起來的,這些開發工具把很多常用的類及相關內容非常形象化的放在工具欄或面板中,你只需要通過簡單的鼠標拖放等操作就可以為程序添加各種各樣的控件並設置控件的各種屬性,由開發工具自動生成相應的代碼。通過使用控件,使你的整個開發變得更加簡單了。
在.Net類庫中,基本上所有的控件都是由System.Windows.Forms.Control類繼承而來的,該類主要提供非常基本的、讓類能實現形象化顯示、處理各種鍵盤及鼠標的輸入並響應各種事件等。
由於大多數控件都是從Control類中繼承,而該類中有一個屬性即Controls表示當前控件的所有子控件集合。因此,自己寫代碼把一個控件添加到窗體中非常簡單,只需要把所要添加的控件對象加入當前窗體的Controls屬性集合中即可,如下面的C#代碼:
form1.Controls.Add(new Button());
將在窗體form1上添加一個按鈕控件。
另外,你還可以定義自己的控件,主要通過System.Windows.Forms.UserControl類(該類是Control的派生類),當然使用Control類一樣可以。
3 Windows Forms程序設計簡單步驟
通過前面的介紹,大家可能已經大概知道一個Windows Forms的設計過程了。一般情況下,設計開發一個Windows Forms程序的步驟如下:
第一步:程序需求分析
作為一個成熟的程序員,都會對程序的需求作比較細致詳細的分析,並不斷的與相關人員交流溝通,最終得到一個比較可行的解決方案。需求分析在程序設計中是必不可少的,在此就不過多講述。
第二步:設計你的類及對象
面向對象程序設計中最為關鍵的部份就是對程序處理問題的對象化。因此,在書寫程序代碼前必須花更多的時間在程序所解決問題的對象化及類設計上。並解決問題的各種事務邏輯及流程。
一般情況下,面向對象的設計分為兩個階段,即高層設計和低層設計。
高層設計階段開發系統的結構,構造待開發軟件的總體模型。在這個階段,標識出在具體的計算機環境中進行問題求解所需要的概念,增加了一批需要的類,這些類包括那些使得軟件系統能夠與外部世界進行交互的類。並輸出適合應用軟件要求的類、類之間的關系及應用子系統的視圖規格說明。
低層設計集中於類的詳細設計階段。類設計的目標是形成單一概念的模型,一個獨立的類表示一個概念,以及設計的部件應該是可復用的和可靠的。
類的設計過程中需要采用信息隱蔽、高內聚低耦合等設計原則。在面向對象的技術中,利用即存類的復用是一個很大的優點。
在Windows Forms的類設計過程中,一定要充分運用各種.Net已存在類的復用,並在其基礎上增加自己類所需的部件及功能等。
第三步:界面設計(設計窗體及控件)
由於Windows Forms程序主要講究人機界面的美觀性及友好性。因此,除了書寫效率非常高的代碼及算法實現程序功能外,Windows Forms中還將把界面的設計作為一個重點。
界面設計主要是通過設置控件及窗體的各種位置、大小、形狀、色彩等外觀屬性而實現。當然,要想實現非常友好的用戶界面,完全通過在記事本等軟件進行代碼的錄入及憑感覺調整窗體及各種控件的大小、位置及外觀等是很難完成的(僅管你通過記事本也能寫比較大的程序),我們必須借助各種各樣的開發工具,特別的快速開發(RAD)工具的使用。
當前,有很多可以編寫.Net程序的RAD工具軟件,其中最為完善,功能最為強大,非微軟的Visual Studio .Net莫屬。該軟件是一個集多種語言為一體的快速開發(RAD)工具,提供強大的軟件工程管理、計算機資源管理、智能代碼感知技術及強大的程序試調等功能。使用Visual Studio .Net開發你的各種.Net應用程序,一切都將會變得事半功倍,而且你會發覺編程變得是那麼輕松的事兒。
通過使用Visual Studio .Net,你設計窗體及程序界面變得很簡單了。你只需要單的鼠標拖放、位置調整等操作就可以完成程序的大多數設計。Visual Studio .Net其自動生成的代碼模板及規范化的注釋,還可以通過非常簡單的雙擊控件為其添加各種事件響應函數等。另外使用Visual Studio .Net,還能很好支持.Net的多語言交叉繼承等功能。
第四步:為窗體及控件添加各類事件響應方法
在窗體及界面設計完成後,余下的事就是給程序添加具體的源代碼了。由於,WindowsForms基本上是通過由引發事件到響應事件再到執行事件這樣一個過程來達到與用戶的交互的,因此,我們所寫的源代碼大多數都是控件或窗體的各種事件響應方法,同加上一些公用的函數等,有效組合到一起就可以使你的程序按你的要求辦事了。
如果你使用Visual Studio .Net,那麼,添加事件將是非常簡單的,大多數時候你只需要雙擊控件就可以為控件添加常用的響應方法。其它的事件響應方法也可以通過其智能代碼感知技術的幫助下很快地加入到程序中。
第五步:啟動程序
一切就緒過後,現在可以寫啟動程序的代碼了。當然,如果你使用Visual Studio .Net,可能關於啟動程序的代碼它都為了准備好了。前面介紹過,啟動Windows Forms程序只需要通過Application類即可,該類是一個封裝類,大多數的方法都是表態的,不能創建該類的實例即可以使用。使用Application一般情況下需要一個窗體(不是絕對需要),而全面你所設計的窗體類此時可用上了,直接構造你窗體類的一個實例即可。而Application類將會為你做很多事,包括內存及資源分配,各種底層組件的調用等。
4 一個完整而簡單Windows Forms程序
下面我們將列出一個用C#寫的完整整而非常簡單的Windows Forms程序,該程序通過繼承定義了一個自己的窗體類HelloWorld。啟動程序將看到程序上有一個按鈕控件,點擊按鈕控件將顯示一個彈出菜單。
程序幾乎包括了前面所講的各種要點如窗體、控件、控件屬性、事件、事件響應等。代碼中包括了具體的注釋說明,請大家仔細體會!
////////HelloWorld.cs源程序
using System;//引入System命名空間,其包括了.Net中大多數的基本數據類型,如int,string等
using System.Drawing;//引入System.Drawing命名空間,其中包括了Windows Forms中的各種基本的圖像操作要素
using System.Windows.Forms;//引入System.Windows.Forms命名空間,其定義了Windows Forms程序中所涉及到的大部份類,如窗體、控件、Application類等
public class HelloWorld:System.Windows.Forms.Form //通過繼承Form而定義一個HelloWorld的窗體類,該類具有Form類的所有成員及特性
{
private System.Windows.Forms.Button button1;//定義HelloWorld類的一個成員(一個按鈕)
public HelloWorld()//HelloWorld類的構造函數
{
button1=new Button();//生成一個Button實例,也可以說成初始化HelloWorld類的button1成員
button1.Text="TestButton";//設置按鈕button1的Text屬性值
button1.Location=new Point(100,100);//設置按鈕button1的Location值
button1.Click+=new System.EventHandler(MyMethod);//為按鈕button1的Click事件添加響應方法
this.Text="Hello World!";//設置自定義窗體的文本(Text)屬性,該屬性將成為窗體的標題
this.Controls.Add(button1);//把按鈕窗體添加到窗體中,使窗體可以顯示。
}
public static void Main()//程序入口
{
Application.Run(new HelloWorld());//生成HelloWorld實例並通過Application.Run()靜態方法啟動程序,
}
private void MyMethod(object sender,System.EventArgs e)//定義事件響應函數,請注意參數的使用,其與System.EventHandler代表中的參數要一致
{
MessageBox.Show("You have clicked the Button","Information");//使用彈出框彈出提示信息。
}
}
編譯該程序的方法,直接把代碼拷到記事本中,保存為HelloWorld.cs文件,然後在命令行輸入csc HelloWorld.cs即可編譯(我們假設HelloWorld.cs在當前目錄上)。編譯完成後將生成一個名為HelloWorld.exe的文件,些時直接在命令行輸入HelloWorld程序即可運行程序。