|
C#是微軟.NET架構(gòu)的主力開發(fā)語(yǔ)言,它功能廣泛而強(qiáng)大,Web開發(fā)人員應(yīng)該毫不猶豫地 擁抱它。本文就通過(guò)一個(gè)攝氏溫度與華氏溫度間相互轉(zhuǎn)換的例子對(duì)C# 的GUI編程進(jìn)行介紹,旨在帶領(lǐng)你快速步入C#之強(qiáng)大與神奇的編程世界。 準(zhǔn)備條件 要理解本文所舉例程,首先要對(duì)C#和面向?qū)ο蟮木幊逃幸粋(gè)基本的了解。關(guān)于 C#的基本 知識(shí),請(qǐng)參閱 C#入門 這篇文章。要編譯并運(yùn)行舉例的應(yīng)用程序,就需 下載 .NET Framework SDK,它當(dāng)前的一個(gè)版本是Beta 1。 作為程序開發(fā)者,我們都知道創(chuàng)建一個(gè)典型的基于 windows 的應(yīng)用程序應(yīng)該包含以下這 些基本步驟:創(chuàng)建一個(gè)適當(dāng)?shù)谋韱;向表單中增加控件;最后增加響?yīng)用戶事件的代碼 。 C#和 .NET 框架出現(xiàn)后,完成這些步驟所需要的工具都可以在System.WinForms 名子空 間中找到。 第一步 創(chuàng)建一個(gè)表單 這非常簡(jiǎn)單,只需要?jiǎng)?chuàng)建一個(gè)從 System.WinForms.Form 類中衍生出來(lái)的類,并對(duì)適當(dāng) 的屬性進(jìn)行初始化就可以。在我們的例子中,類定義是這樣開始的: public class TempConverter : System.WinForms.Form { . . . } 以下是我們希望的主窗口(表單)視圖: 我們希望表單具備如下特征: - 窗口大小為 180乘 90象素 - 不給用戶改變窗口大小的能力 - 標(biāo)題欄中顯示的標(biāo)題是 +C -> +F / +F -> +C - 初始狀態(tài)下表單顯示在屏幕的中心 - 不想要幫助按鈕(應(yīng)用程序太簡(jiǎn)單,不需要幫助按鈕) - 不給用戶提供將應(yīng)用程序最大化的能力 (因?yàn)樵诮o定的窗口尺寸內(nèi),一切都是可視的,因此不需要最大化) 將表單初始化成給定的規(guī)格涉及到對(duì) TempConverter 對(duì)象的某些屬性進(jìn)行設(shè)置。有些屬 性有改變值的方法,而其它屬性則要通過(guò)更新適當(dāng)?shù)膶?shí)例變量來(lái)直接修改。下面是有關(guān) 代碼。如果想要得到關(guān)于WinForms 類的屬性和方法的更多信息,那么 .NET Framework SDK 所提供的文檔可以算是一個(gè)很 好的參考資料。 this.SetSize(180,90); this.BorderStyle = FormBorderStyle.FixedDialog; this.Text = " +C -> +F /+F -> +C "; this.StartPosition = FormStartPosition.CenterScreen; this.HelpButton = false; this.MaximizeBox = false; 現(xiàn)在把這些代碼放在一起進(jìn)行編譯和運(yùn)行,看看表單運(yùn)行后是什么樣子。這里要使用類 定義,創(chuàng)建一個(gè)構(gòu)造器(其中要包含以上的代碼來(lái)初始化主窗口的外觀),并且要?jiǎng)?chuàng)建 一個(gè)主方法來(lái)創(chuàng)建類的一個(gè)例示。以下是完成這一工作的代碼: public class TempConverter : System.WinForms.Form { public TempConverter() { this.SetSize(180,90); this.BorderStyle = FormBorderStyle.FixedDialog; this.Text =" +C -> +F /+F -> +C "; this.StartPosition = FormStartPosition.CenterScreen; this.HelpButton = false; this.MaximizeBox = false; } public static void Main() { Application.Run( new TempConverter() ); } } 以上只有 Main() 方法所在行是新的代碼。 Application.Run(new TempConverter()); 上面這一行的意思是用新表單來(lái)啟動(dòng)應(yīng)用程序。 假設(shè)源文件叫做TempConverter.cs,那么執(zhí)行以下的命令編譯代碼: csc /r:System.dll/r:Microsoft.Win32.Interop.dll /r:System.WinForms.dl l TempConverter.cs 這里不再詳細(xì)講解編譯命令,因?yàn)楫?dāng)Visual Studio .NET可用時(shí),就不必要發(fā)出命令行 的編譯命令了。
第二步 向表單中增加控件 接著的一步是向表單中增加控件。我們?yōu)槊總(gè)控件創(chuàng)建一個(gè)實(shí)例變量,對(duì)這些新實(shí)例變 量進(jìn)行初始化,最后把每個(gè)控件都放在表單中。這里是增加了控件之后表單的樣子,以 及更新過(guò)的代碼: public class TempConverter : System.WinForms.Form { Label lTempFah = new Label(); Label lTempCel = new Label(); TextBox tTempFah = new TextBox(); TextBox tTempCel = new TextBox(); ButtonbnCtoF = new Button(); ButtonbnFtoC = new Button(); public TempConverter() { this.SetSize(180,90); this.BorderStyle = FormBorderStyle.FixedDialog; this.Text =" +C -> +F /+F -> +C "; this.StartPosition = FormStartPosition.CenterScreen; this.HelpButton = false; this.MaximizeBox = false; tTempCel.TabIndex = 0; tTempCel.SetSize(50,25); tTempCel.SetLocation(13,5); lTempCel.TabStop = false; lTempCel.Text = "+C "; lTempCel.SetSize(25, 25); lTempCel.SetLocation(65,5); tTempFah.TabIndex = 1; tTempFah.SetSize(50,25); tTempFah.SetLocation(90,5); lTempFah.TabStop = false; lTempFah.Text = "+F "; lTempFah.SetSize(25,25); lTempFah.SetLocation(142,5); bnCtoF.TabIndex = 2; bnCtoF.Text = "+C to +F "; bnCtoF.SetSize(70,25); bnCtoF.SetLocation(13,35); bnFtoC.TabIndex = 3; bnFtoC.Text = "+F to+C "; bnFtoC.SetSize(70,25); bnFtoC.SetLocation(90,35); this.Controls.Add(tTempCel); this.Controls.Add(lTempCel); this.Controls.Add(tTempFah); this.Controls.Add(lTempFah); this.Controls.Add(bnCtoF); this.Controls.Add(bnFtoC); } 以上代碼首先創(chuàng)建兩個(gè)標(biāo)簽、兩個(gè)文本框和兩個(gè)按鈕,然后對(duì)每個(gè)控件進(jìn)行初始化并將 其加入表單中。具體的含義如下: - SetSize() 初始化控件的尺寸 - SetLocation() 初始化表單中控件的位置 - 設(shè)置控件的TabStop 屬性為false表示這個(gè)控件從不被聚焦 - 設(shè)置TabIndex 為 X 表示當(dāng)敲擊TAB鍵x次后聚焦此控件 - 控件的text 屬性表示顯示在其上的文字信息 - this.Controls.Add() 表示在表單上放置一個(gè)控件,要快速地添加每個(gè)控件,可以這 么書寫:this.Controls = new Control[] { tTempCel, lTempCel, tTempFar?.}
第三步 增加響應(yīng)用戶事件代碼 還有最后一步就可以大功告成了,就是增加一個(gè)方法來(lái)捕捉按鈕點(diǎn)擊事件。這里就是指 從攝氏到華氏的按鈕點(diǎn)擊代碼: private void bnCtoF_Click(Object sender, EventArgs e) { double dTempCel = 0; double dTempFah = 0; try { dTempCel = tTempCel.Text.ToDouble(); } catch(Exception) { tTempCel.Clear(); tTempFah.Clear(); return; } dTempFah = 1.8*dTempCel+32; tTempFah.Text = dTempFah.ToString(); tTempFah.Focus(); tTempFah.SelectionStart = 0; tTempFah.SelectionLength = 0; tTempCel.Focus(); tTempCel.SelectionStart = 0; tTempCel.SelectionLength = 0; } 第四行到第八行(也就是try 區(qū)中的一切)取回Celsius(攝氏)文本框中的數(shù)值。如果 它是一個(gè)雙字節(jié)數(shù),就將其存儲(chǔ)在dTempCel中,否則就清除兩個(gè)文本框并退出。接著, 用存儲(chǔ)在dTempCel 中的值,我們用第9 行中的公式將相同的溫度存儲(chǔ)在Fahrenheit中。將這個(gè)新的數(shù)值在 Fahrenheit(華氏)文本框中顯示, 然后將光標(biāo)放在每個(gè)文本框中,以便將指針設(shè)置 到開頭。(如果不將指針設(shè)置到開頭,我們就會(huì)看到一個(gè)長(zhǎng)長(zhǎng)的數(shù)字的結(jié)尾,要看開頭 就必須滾動(dòng)鼠標(biāo))。 以下是Fahrenheit按鈕的代碼,它將完成同樣的任務(wù),只不過(guò)是相反的處理: private void bnFtoC_Click(Object sender, EventArgs e) { double dTempCel = 0; double dTempFah = 0; try { dTempFah = tTempFah.Text.ToDouble(); } catch(Exception) { tTempCel.Clear(); tTempFah.Clear(); return; } dTempCel = (dTempFah-32)/1.8; tTempCel.Text = dTempCel.ToString(); tTempCel.Focus(); tTempCel.SelectionStart = 0; tTempCel.SelectionLength = 0; tTempFah.Focus(); tTempFah.SelectionStart = 0; tTempFah.SelectionLength = 0; } 接著,我們需要將適當(dāng)?shù)狞c(diǎn)擊事件捕捉方法與按鈕的 Click事件聯(lián)系起來(lái)。要完成這一 步,我們將以下兩行放在類的構(gòu)造器中: bnCtoF.Click += new EventHandler(this.bnCtoF_Click); bnFtoC.Click += new EventHandler(this.bnFtoC_Click);
最后,請(qǐng)看完整的代碼: using System; using System.WinForms; public class TempConverter : System.WinForms.Form { Label lTempFah = new Label(); Label lTempCel = new Label(); TextBox tTempFah = new TextBox(); TextBox tTempCel = new TextBox(); ButtonbnCtoF = new Button(); ButtonbnFtoC = new Button(); public TempConverter() { this.SetSize(180,90); this.BorderStyle = FormBorderStyle.FixedDialog; this.Text = " +C -> +F /+F -> +C "; this.StartPosition = FormStartPosition.CenterScreen; this.HelpButton = false; this.MaximizeBox = false; tTempCel.TabIndex = 0; tTempCel.SetSize(50,25); tTempCel.SetLocation(13,5); lTempCel.TabStop = false; lTempCel.Text = "C"; lTempCel.SetSize(25, 25); lTempCel.SetLocation(65,5); tTempFah.TabIndex = 1; tTempFah.SetSize(50,25); tTempFah.SetLocation(90,5); lTempFah.TabStop = false; lTempFah.Text = "F"; lTempFah.SetSize(25,25); lTempFah.SetLocation(142,5); bnCtoF.TabIndex = 2; bnCtoF.Text = "C to F"; bnCtoF.SetSize(70,25); bnCtoF.SetLocation(13,35); bnCtoF.Click += new EventHandler(this.bnCtoF_Click); bnFtoC.TabIndex = 3; bnFtoC.Text = "F to C"; bnFtoC.SetSize(70,25); bnFtoC.SetLocation(90,35); bnFtoC.Click += new EventHandler(this.bnFtoC_Click); this.Controls.Add(tTempCel); this.Controls.Add(lTempCel); this.Controls.Add(tTempFah); this.Controls.Add(lTempFah); this.Controls.Add(bnCtoF); this.Controls.Add(bnFtoC); //= new Control [] { tTempCel, lTempCel, tTempFah, lTempFah, bnCtoF, bnFtoC }; } public static void Main() { Application.Run( new TempConverter() ); } private void bnCtoF_Click(Object sender, EventArgs e) { double dTempCel = 0; double dTempFah = 0; try { dTempCel = tTempCel.Text.ToDouble(); } catch(Exception) { tTempCel.Clear(); tTempFah.Clear(); return; } dTempFah = 1.8*dTempCel+32; tTempFah.Text = dTempFah.ToString(); tTempFah.Focus(); tTempFah.SelectionStart = 0; tTempFah.SelectionLength = 0; tTempCel.Focus(); tTempCel.SelectionStart = 0; tTempCel.SelectionLength = 0; } private void bnFtoC_Click(Object sender, EventArgs e) { double dTempCel = 0; double dTempFah = 0; try { dTempFah = tTempFah.Text.ToDouble(); } catch(Exception) { tTempCel.Clear(); tTempFah.Clear(); return; } dTempCel = (dTempFah-32)/1.8; tTempCel.Text = dTempCel.ToString(); tTempCel.Focus(); tTempCel.SelectionStart = 0; tTempCel.SelectionLength = 0; tTempFah.Focus(); tTempFah.SelectionStart = 0; tTempFah.SelectionLength = 0; } } 結(jié) 語(yǔ) 到此為止,你看到了如何用C#進(jìn)行編程的一個(gè)完整過(guò)程。這個(gè)例子雖然很簡(jiǎn)單,但是麻 雀雖小,五臟俱全,理解其中的原理后,就可以大顯身手,充分發(fā)揮C#的強(qiáng)
|