版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第五章本書學(xué)習(xí)情境:書店管理系統(tǒng)界面設(shè)計(jì)
5.1學(xué)習(xí)情境引入
我們學(xué)習(xí)了C#語言的基本語法,就可以開始用計(jì)算機(jī)能“理解”的語言表達(dá)我們的邏輯思想了,在不斷的運(yùn)用中,逐漸熟練掌握這些語法。開發(fā)單機(jī)用的“書店管理系統(tǒng)”,除了要用計(jì)算機(jī)語言描述程序邏輯并寫出一段程序外,還要設(shè)計(jì)程序的用戶界面。書店管理系統(tǒng)就是由一個(gè)一個(gè)的窗體界面組成的,也就是Windows程序窗體界面。友好的窗體界面可以極大地提高人機(jī)對(duì)話能力,因此窗體界面的設(shè)計(jì)對(duì)應(yīng)用程序而言是極其重要的5.1.1項(xiàng)目需求
根據(jù)書店管理系統(tǒng)項(xiàng)目需求分析,該項(xiàng)目包括登錄窗口、主窗體、采購管理、銷售管理、倉儲(chǔ)管理等界面。1.登錄窗口要保證系統(tǒng)的安全性,就需要在使用系統(tǒng)前進(jìn)行安全身份驗(yàn)證。一般通過輸入用戶名和密碼的形式進(jìn)行驗(yàn)證,并在登錄后記錄當(dāng)前用戶及其角色。2.主窗體界面作為一個(gè)書店管理系統(tǒng),結(jié)合實(shí)際需求分析可知,它要完成的主要業(yè)務(wù)有采購、倉儲(chǔ)、銷售、財(cái)務(wù)。系統(tǒng)應(yīng)具有供店員完成進(jìn)書及銷售等一系列工作的操作,以及對(duì)書店財(cái)務(wù)賬目的操作和管理的功能模塊,并且每個(gè)模塊下又有許多子功能。3.采購管理采購模塊供采購人員使用,完成圖書信息錄入、打印入庫單的工作,并可以查詢以往采購的圖書信息和入庫單信息。為了在多次采購?fù)悎D書時(shí),避免重復(fù)錄入煩瑣的圖書信息,要在采購模塊中設(shè)置書目管理子模塊,對(duì)采購的圖書信息進(jìn)行管理,包括錄入、查詢、修改圖書信息等功能。在填寫入庫單時(shí),只需調(diào)用已有的書目信息,即可避免重復(fù)錄入。入庫單管理子模塊包括填寫、打印入庫單等功能。對(duì)已經(jīng)打印、填寫錯(cuò)誤的出庫單,只要倉庫管理員未執(zhí)行出庫,銷售人員還可以修改,但不允許刪除。4.銷售模塊銷售模塊包含銷售統(tǒng)計(jì)和出庫單管理兩個(gè)子模塊,供銷售人員填寫、打印出庫單,并進(jìn)行銷售統(tǒng)計(jì)。對(duì)已經(jīng)打印、填寫錯(cuò)誤的出庫單,只要倉庫管理員未執(zhí)行出庫,銷售人員還可以修改,但不允許刪除。銷售統(tǒng)計(jì)是指統(tǒng)計(jì)某個(gè)時(shí)段的暢銷書和滯銷書等,需要訪問出庫單表獲取銷售信息并訪問庫存表獲取價(jià)格信息。5.倉儲(chǔ)管理庫存模塊供倉庫管理員憑入庫單/出庫單執(zhí)行入庫/出庫以及庫存查詢功能。5.1.2展示
1.登錄窗口圖5?1登錄窗口界面設(shè)計(jì)書店登錄窗口的主要作用是接收用戶的相關(guān)信息,用于驗(yàn)證用戶的身份并為用戶創(chuàng)建相應(yīng)的用戶書店管理目錄環(huán)境。所以界面中加有兩個(gè)文本框和兩個(gè)按鈕及兩個(gè)標(biāo)簽,如圖5-1所示2.書店管理系統(tǒng)主界面建立書店管理系統(tǒng)的主界面,界面中加有菜單欄,如圖5-2所示。3.書店管理系統(tǒng)添加圖書信息界面添加圖書信息界面中有標(biāo)簽、文本框、按鈕、圖片框等控件,主要完成圖書信息的錄入,如圖5-3所示。5.1.3技術(shù)分解
項(xiàng)目展示的3個(gè)窗體界面從技術(shù)上講每一個(gè)界面就是一個(gè)控件,界面內(nèi)的每一個(gè)元素又是一個(gè)控件。在這里窗體界面是其他控件的一個(gè)容器,在這個(gè)容器中包含了其他控件。如圖5-4所示的登錄窗體界面,主界面是Form控件,F(xiàn)orm控件內(nèi)有Label控件(歡迎使用書店管理系統(tǒng)、用戶名:密碼:)、TextBox控件(界面中的輸入文本框)、Button控件(確定、取消按鈕),如圖5-4所示。同樣道理的書店管理系統(tǒng)的其他界面也是由控件組成的,只是所用的控件不同而已。從某種意義上講,書店管理系統(tǒng)界面設(shè)計(jì),就是如何合理地使用控件來完成所設(shè)計(jì)功能的過程。通過本章的學(xué)習(xí),我們可以設(shè)計(jì)由多個(gè)窗體組成的書店管理信息系統(tǒng)。開發(fā)平臺(tái)為我們提供了很多控件,各控件有不同的屬性、事件、方法,但是書店管理系統(tǒng)用到的控件種類有限。希望初學(xué)者注意從最常用的開始學(xué)習(xí),逐漸舉一反三,并培養(yǎng)自己利用MSDN來學(xué)習(xí)其他更多控件使用方法的良好習(xí)慣。本章需要了解的基本知識(shí)如下?!?控件的基本概念?!?窗體的方法、屬性及事件?!?常用的幾類控件的方法、屬性及事件?;局R(shí)1:控件類
5.2.1控件類的屬性、方法和事件控件(Controls)是完成用戶交互的組件??丶梢蕴峁┨幚頂?shù)據(jù)、接收用戶輸入、對(duì)事件做出響應(yīng)或執(zhí)行連接用戶和應(yīng)用程序等其他功能??丶举|(zhì)上是具有圖形接口的組件,所以它能提供組件所提供的功能并與用戶進(jìn)行交互。VS.NET2008提供了豐富的窗體控件,“工具箱”中的“所有Windows窗體”里面包含了所有Windows窗體的標(biāo)準(zhǔn)控件,像標(biāo)簽控件(Label)、按鈕控件(Button)、文本框控件(TextBox)等,工具箱中的每個(gè)控件都對(duì)應(yīng)一個(gè)類,這些類均派生自System.Windows.Forms.Control類。作為各種窗體控件的基類,Control類實(shí)現(xiàn)了所有窗體交互控件的基本功能,如處理鍵盤輸入、處理消息驅(qū)動(dòng)、限制控件大小等。.NET已經(jīng)為我們?cè)O(shè)計(jì)好工具箱中的控件類,初學(xué)者的任務(wù)是學(xué)會(huì)使用這些類的公開成員,并將各種不同的控件,組合在一個(gè)窗體中,也就是設(shè)計(jì)一個(gè)新的窗體類。學(xué)習(xí)窗體和其他控件的使用,就是學(xué)習(xí)它們的屬性、方法和事件。1.屬性如上一章所述,屬性公開了類的數(shù)據(jù)成員。比如控件的名稱,數(shù)據(jù)成員公開為Name屬性。獲取某個(gè)控件的Name也就得到了控件的名稱;給某個(gè)控件的Name賦值,也就更改了控件的名稱??丶膶傩院芏?,如Text屬性對(duì)應(yīng)控件上顯示的文字、ForeColor屬性對(duì)應(yīng)控件上文字的顯示顏色等。C#是強(qiáng)類型語言,對(duì)屬性值的操作必須類型匹配。例如,設(shè)置textBox1控件的Text屬性。textBox1.Text="Helloworld!";//這是正確的。textBox1.Text=123;//這是錯(cuò)誤的,因?yàn)?23是Int32類型,而TextBox控件的Text屬性是String類型的。因此,要了解屬性的含義及其數(shù)據(jù)類型。圖5?5Windows窗體的屬性面板在VisualStudio.NET中,可以直接在屬性面板上更改屬性的值。屬性面板一般在窗口右邊,可以按F4鍵顯示,或操作菜單“視圖|屬性窗口”,如圖5-5所示。2.方法方法是一個(gè)執(zhí)行對(duì)象的行為的成員。程序員要實(shí)現(xiàn)用戶要求的邏輯功能,經(jīng)常會(huì)調(diào)用某個(gè)類的方法,來使對(duì)象完成某種行為。方法有一個(gè)形式參數(shù)列表(可能為空)和一個(gè)返回?cái)?shù)值(或void),并且可以是靜態(tài)也可以是非靜態(tài)。靜態(tài)方法要通過類來訪問。非靜態(tài)方法,也稱為實(shí)例方法,要通過類的實(shí)例(對(duì)象)來訪問。方法可以被重載,這意味著多個(gè)方法可能有相同的名稱。程序員應(yīng)主要掌握常用方法的參數(shù)和返回值。3.事件控件的事件,對(duì)應(yīng)著控件從初始化到和用戶交互以至最后銷毀,所經(jīng)歷的各個(gè)發(fā)展階段??丶拿總€(gè)事件,都對(duì)應(yīng)著特定的時(shí)機(jī)。比如Button類控件的Click事件,在用戶單擊此按鈕時(shí)發(fā)生;再如Form類的Load事件,在窗體初始化后、還未顯示時(shí)發(fā)生。每個(gè)事件發(fā)生時(shí),都會(huì)自動(dòng)執(zhí)行關(guān)聯(lián)的一個(gè)(或多個(gè))方法,這個(gè)方法稱為事件委托函數(shù),該函數(shù)的參數(shù)是事件發(fā)生時(shí)的環(huán)境參數(shù)。當(dāng)然,前提是程序員事先編好了這樣的方法,并指定了此方法和某個(gè)事件關(guān)聯(lián)。選擇合適的事件,編寫事件委托函數(shù),是Windows窗體程序設(shè)計(jì)的工作線索。例如,要求在窗體顯示之前用程序設(shè)置窗體的標(biāo)題欄為“歡迎”,我們應(yīng)該選擇Form的Load事件,而不是Button的Click事件。程序員要了解事件發(fā)生的時(shí)機(jī)和事件的參數(shù)。在VisualStudio.NET2008的可視化設(shè)計(jì)界面中,把選中對(duì)象的所有事件都列了出來,集中在屬性面板的事件列表中,如圖5-6所示。在這個(gè)事件列表中,左邊是這個(gè)對(duì)象支持的事件,右邊是這個(gè)事件發(fā)生時(shí)要執(zhí)行的方法。如果是空的,那么這個(gè)對(duì)象將不對(duì)這個(gè)事件做出反應(yīng)。因此,事件和方法可以通過這里連接起來。在.NET中,只要雙擊事件的名稱,系統(tǒng)就會(huì)把這個(gè)事件默認(rèn)的處理方法和這個(gè)事件關(guān)聯(lián)起來,即前述的事件委托。比如,雙擊Click事件,屬性欄就會(huì)變?yōu)槿鐖D5-7所示的形式。在Form1.Designer.cs文件中,窗體設(shè)計(jì)器生成的代碼里,則會(huì)自動(dòng)出現(xiàn)以下語句,該語句和圖5-7中的事件表格是一致的:刪除此句,屬性面板中的“Form1_Load”就會(huì)自動(dòng)消失;清除屬性面板中的“Form1_Load”,下面的語句就會(huì)被自動(dòng)刪除。
this.Load+=newSystem.EventHandler(this.Form1_Load);出現(xiàn)上面的語句時(shí),Load事件和Form1_Load方法就關(guān)聯(lián)起來,即建立了委托關(guān)系。也就是程序運(yùn)行時(shí),在發(fā)生窗體Form1被用戶Load的事件時(shí),就會(huì)自動(dòng)執(zhí)行Form1_Load方法。與此同時(shí),系統(tǒng)會(huì)在Form1.cs文件中自動(dòng)添加Form1_Load方法的聲明,代碼如下。privatevoidForm1_Load(objectsender,EventArgse){}該方法有兩個(gè)參數(shù),第一個(gè)是object類型,代表發(fā)生事件的對(duì)象,此處為Form1對(duì)象;第二個(gè)是EventArgs類型,代表發(fā)生Load事件時(shí)的環(huán)境參數(shù)。只要在此方法中寫入:this.Text=”歡迎”;就可以實(shí)現(xiàn)在窗體顯示之前,用程序設(shè)置窗體的標(biāo)題欄為“歡迎”的功能了。5.2.2自測(cè)
1.思考題(1)在VisualStudio.NET中,如何設(shè)置控件的屬性?(2)在VisualStudio.NET中,如何應(yīng)用控件的事件?并舉例說明?;局R(shí)2:Form類
C#中的Windows應(yīng)用程序是以窗體(Form)為基礎(chǔ)的。Windows窗體是組成應(yīng)用程序用戶界面的窗口或?qū)υ捒?,可用來向用戶顯示信息并接受用戶的輸入。窗體可以是標(biāo)準(zhǔn)窗口、多文檔界面(MDI)窗口、對(duì)話框等。新建Windows應(yīng)用程序模板的項(xiàng)目時(shí),IDE(IntegratedDevelopmentEnvironment)將自動(dòng)建立一個(gè)Form1類的窗體,它派生自Form類。窗體類可以有靜態(tài)成員,但從Form類繼承的多數(shù)屬性和方法都是實(shí)例方法,比如窗體的尺寸屬性、顯示窗體的方法等。所以,在程序運(yùn)行時(shí)顯示出的窗體是由該類創(chuàng)建的實(shí)例。在程序中,用this關(guān)鍵字引用當(dāng)前窗體實(shí)例。窗體是與用戶交互的主要載體,是整個(gè)Windows應(yīng)用程序的控件容器,其他界面元素(控件等)都可以放置在這個(gè)容器中。每向窗體中拖曳一個(gè)控件,設(shè)計(jì)器就為其添加一個(gè)字段的聲明和初始化,通過組合不同的控件集、設(shè)置窗體的屬性以及編寫相應(yīng)的事件、方法代碼,可以滿足用戶對(duì)應(yīng)用程序的要求。下面我們就對(duì)窗體的一些重要屬性、方法和事件進(jìn)行介紹,之后會(huì)發(fā)現(xiàn)窗體是一個(gè)功能非常強(qiáng)大的對(duì)象。5.3.1類的繼承
C#允許一個(gè)類繼承其他類的屬性和方法。被繼承的類稱為父類(也可稱其為基類),繼承的類稱為派生或子類。子類不僅可以繼承基類的屬性和方法,還可以根據(jù)需要定義新的屬性和方法,增加新的功能。這樣可使用戶重用基類的代碼,專注于子類的新代碼,提高類的可重用性。繼承的好處是能共享代碼,繼承后,父類的所有字段和方法都將存在于子類中,每一個(gè)子類都具有父類的非私有特性。在有些語言中,子類可以從不止一個(gè)父類中派生,稱為多繼承。但在C#中,子類僅能派生于一個(gè)父類。1.繼承的定義
如果要聲明一個(gè)類派生于另一個(gè)類,可以使用下面的語法:[修飾符]class派生類名:基類名{//派生類成員}修飾符:可選擇public、internal、abstract、sealed、new、private、protected修飾符,使用時(shí)根據(jù)需要確定。派生類名:必須是一個(gè)有效的C#標(biāo)識(shí)符,一般采用Pascal大小寫命名規(guī)則,單詞的第一個(gè)字母大寫?;惷罕焕^承的類的名。類體:用于定義派生類的成員。繼承意味著一個(gè)類隱藏了除了構(gòu)造函數(shù)和析構(gòu)函數(shù)外基類的所有成員。關(guān)于繼承,需要注意以下幾點(diǎn)?!?繼承是可傳遞的。如果C從B中派生,B又從A中派生,那么C不僅繼承了B中聲明的成員,同樣也繼承了A中的成員。Object類是所有類的基類?!?派生類應(yīng)當(dāng)是對(duì)基類的擴(kuò)展。派生類可以添加新的成員,但不能除去基類的成員的定義。● 構(gòu)造函數(shù)和析構(gòu)函數(shù)不能被繼承。除此以外的其他成員,不論對(duì)它們定義了怎樣的訪問方式,都能被繼承?!?派生類如果定義了與繼承而來的成員同名的新成員,可以覆蓋已繼承的成員。但這并不是在派生類中刪除了這些成員,而只是不能再訪問這些成員?!?類可以定義虛方法、虛屬性以及虛索引指示器,它的派生類能夠重載這些成員,從而實(shí)現(xiàn)類的多態(tài)性?!?派生類的成員有兩個(gè)來源:一個(gè)是從基類中繼承來的;另一個(gè)是在派生類中重新定義的?!纠?-1】下面的例子演示了繼承的定義。usingSystem;namespaceExample5_1{//定義基類
publicclassUser{protectedstringname;//姓名,保護(hù)成員
protectedstringpassWord;//用戶密碼,保護(hù)成員
privatestringrole;//身份,私有成員
publicPerson(stringu_name,stringu_passWord,stringu_role)//構(gòu)造函數(shù)
{passWord=u_passWord;name=u_name;role=u_role;}}//派生類定義
publicclassEmployee:User{publicstringid;//在派生類中填加用戶的編號(hào)公共成員
publicEmployee(stringu_name,stringu_passWord,stringu_role,stringe_id):base(u_name,u_passWord,u_role)//構(gòu)造函數(shù)
{id=e_id;}
}classClass1{[STAThread]staticvoidMain(string[]args){//用派類創(chuàng)建對(duì)象
EmployeeliMing=newEmployee("liMing","123","經(jīng)理","8888");
}}}程序分析如下。基類User定義了兩個(gè)數(shù)據(jù)成員,一個(gè)構(gòu)造函數(shù),對(duì)基類不做重點(diǎn)分析,重點(diǎn)分析Employee派生類。publicclassEmployee:User的含義是:public表示公共的;class是類關(guān)鍵字;Employee是派生類名稱;“::”表示派生于;User是基類名。類體部分:增加一個(gè)公共成員id(表示雇員的編號(hào)),增加一個(gè)構(gòu)造函數(shù)初始化對(duì)象的成員(注意派生類的構(gòu)造函數(shù)的定義)。在Employee派生類的類體部分看不到基類的代碼,但是派生類Employee已經(jīng)繼承了基類User的成員,也就是說基類的成員也是派生類的成員。2.定義派生類的構(gòu)造函數(shù)
由于派生類是繼承基類的成員,因此,在創(chuàng)建一個(gè)派生類對(duì)象時(shí),不僅要對(duì)派生類中新增加的成員進(jìn)行初始化,還要對(duì)基類中的數(shù)據(jù)進(jìn)行初始化。定義派生的類的構(gòu)造函數(shù)的一般形式如下。[修飾符]派生類類名(參數(shù)表1):base(參數(shù)表2){//派生類初始代碼}由于派生類是繼承基類的成員,因此,在創(chuàng)建一個(gè)派生類對(duì)象時(shí),不僅要對(duì)派生類中新增加的成員進(jìn)行初始化,還要對(duì)基類中的數(shù)據(jù)進(jìn)行初始化。定義派生的類的構(gòu)造函數(shù)的一般形式如下。[修飾符]派生類類名(參數(shù)表1):base(參數(shù)表2){//派生類初始代碼}參數(shù)表1:指明參數(shù)的名稱和類型,包含派生類新增參數(shù)及基類的參數(shù),也可以無參數(shù)。base:基類關(guān)鍵字表示基類,關(guān)鍵字base為調(diào)用基類的成員提供了一個(gè)簡(jiǎn)便的方法,調(diào)用基類成員采用的格式為base.成員名。參數(shù)表2:指明基類參數(shù)的名稱無需類型說明,這些參數(shù)應(yīng)包含在參數(shù)表1中。派生類初始代碼:由語句組成,用于所要執(zhí)行的操作。【例5-2】下面的示例說明了派生類的構(gòu)造函數(shù)定義。publicclassMyRole//基類MyRole{privateintx;privateinty;publicMyRole(intxx,intyy)//基類構(gòu)造函數(shù)
{x=xx;y=yy;}}publicclassMyDerived:MyRole//派生MyDerived{privateintz;publicMyDerived(intxx,intyy,intzz):base(xx,yy)//派生類構(gòu)造函數(shù)
{z=zz;}}在派生類的構(gòu)造函數(shù)MyDerived(intxx,intyy,intzz)中,用參數(shù)xx、yy調(diào)用基類的構(gòu)造函數(shù)初始化基類的數(shù)據(jù),而用參數(shù)zz初始化派生類中的數(shù)據(jù)成員。派生類的構(gòu)造函數(shù)有如下特點(diǎn)。(1)派生類的構(gòu)造函數(shù)可以重載,以調(diào)用基類的不同構(gòu)造函數(shù)。(2)派生類的構(gòu)造函數(shù)體內(nèi)一般只初始化派生類的數(shù)據(jù)函數(shù),而不直接初始化基類成員,即使能直接訪問它們。注意:在創(chuàng)建對(duì)象時(shí),調(diào)用派生類的構(gòu)造函數(shù)MyDerived(intxx,intyy,intzz),不必帶有:base(xx,yy),MyDerivedmyTest=newMyDerived(1,2,3)。3.使用new修飾符隱藏基類成員
使用new修飾符可以顯式隱藏從基類繼承的成員,這樣在使用派生類的對(duì)象的方法時(shí),調(diào)用的是派生類重寫的與派生類相同的新方法。若要隱藏繼承的成員,使用相同名稱在派生類中聲明該成員,并用new修飾符修飾它即可。看下面的類。publicclassMyBase{publicintx;publicvoidMyVoke(){Console.WriteLine("ThisisMybase”);}}在派生類中用MyVoke名稱聲明成員會(huì)隱藏基類中的MyVoke方法。publicclassMyDerived:MyBase{newpublicvoidMyVoke(){Console.WriteLine("ThisisMyDerived”);}}注意:在同一成員上同時(shí)使用new和override是錯(cuò)誤的。要調(diào)用隱藏的基類中的方法用下列方法:base.基類隱藏的方法。4.密封類和密封方法
C#允許把類和方法聲明為sealed。對(duì)于類來說,這表示不能繼承該類;對(duì)于方法來說,這表示不能重寫該方法。sealedclassFinalClass{//代碼}classDerivedClass:FinalClass//這將給出編譯錯(cuò)誤,因密封類不能派生{//代碼}在把類或方法標(biāo)記為sealed時(shí),最可能的情形是:如果要對(duì)庫、類或自己編寫的其他類進(jìn)行操作,則重寫某些功能會(huì)導(dǎo)致錯(cuò)誤。也可以因商業(yè)原因把類或方法標(biāo)記為sealed,以防第三方以違反注冊(cè)協(xié)議的方式擴(kuò)展該類。但一般情況下,在把類或方法標(biāo)記為sealed時(shí)要小心,因?yàn)檫@么做會(huì)嚴(yán)重限制它的使用。即使不希望能繼承一個(gè)類或重寫類的某個(gè)成員,仍有可能在將來的某個(gè)時(shí)刻,有人會(huì)遇到我們沒有預(yù)料到的情形。.NET基類庫大量使用了密封類,使希望從這些類中派生出自己的類的第三方開發(fā)人員無法訪問這些類。例如string就是一個(gè)密封類。把方法聲明為sealed也可以實(shí)現(xiàn)類似的目的,但很少這么做。5.抽象類和抽象函數(shù)C#允許把類和函數(shù)聲明為abstract,抽象類不能實(shí)例化,而抽象函數(shù)沒有執(zhí)行代碼,函數(shù)括號(hào)后跟一個(gè)分號(hào),必須在非抽象的派生類中重寫。如果類包含抽象函數(shù),該類也是抽象的,必須聲明為抽象的。abstractclassBuilding{publicabstractdecimalCalculateHeatingCost(); //abstractmethod}5.3.2Form類的常用屬性、方法和事件
1.Form類的常用屬性屬性就是一組設(shè)置值,用于描述某類對(duì)象(如窗體Form)的外觀、形狀、大小、位置等。對(duì)于窗體(Form類),許多屬性可以在設(shè)計(jì)時(shí)用屬性窗口(如圖5-8所示)來設(shè)置,幾乎所有屬性都可以在運(yùn)行過程中通過代碼動(dòng)態(tài)設(shè)置。下面我們介紹窗體的一些常用的屬性。注意:當(dāng)在屬性窗口選中某屬性時(shí),在屬性窗口的底部窗格就會(huì)顯示該屬性的簡(jiǎn)要描述。● Text屬性。Text屬性主要用來設(shè)置窗體標(biāo)題欄中顯示的文本。它可以通過屬性窗口來設(shè)置(如圖5-9中設(shè)置為“窗體的標(biāo)題”),也可以在窗體運(yùn)行時(shí)為Text屬性設(shè)置屬性值,代碼如下。this.Text=”窗體的標(biāo)題”;可以把以上代碼放在窗體的構(gòu)造函數(shù)(該過程創(chuàng)建窗體的對(duì)象實(shí)例,具體參見“構(gòu)造函數(shù)”)中或者窗體的Load事件中。運(yùn)行效果如圖5-9所示?!?FormBorderStyle屬性。FormBorderStyle屬性用來指示窗體的邊框和標(biāo)題欄的外觀和行為,如圖5-10所示。在FormBorderStyle屬性窗口中有7個(gè)枚舉值,它們的具體含義如表5-1所示。枚舉常量窗口的特性Fixed3D固定的三維邊框FixedDialog固定的對(duì)話框樣式的粗邊框FixedSingle固定的單行邊框續(xù)表枚舉常量窗口的特性FixedToolWindow不可調(diào)整大小的工具窗口邊框None無邊框Sizable可調(diào)整大小的邊框SizableToolWindow可調(diào)整大小的工具窗口邊框● Name屬性。圖5?11Name屬性的可視化設(shè)置該屬性為String類型的值,用于獲取或設(shè)置窗體的名稱,該名稱主要用于在程序中引用該窗體對(duì)象。我們知道,VS默認(rèn)給新建的窗體命名為Form1、Form2等。我們可以修改窗體的Name屬性,一般在設(shè)計(jì)階段即應(yīng)為所有的窗體擬定合適的名稱,并在窗體新建的第一時(shí)間就將Name屬性改定,以免中途改名帶來種種麻煩,如圖5-11所示。除了以上幾個(gè)常用屬性外,窗體屬性(例如窗體圖標(biāo)、背景顏色、顯示方式等)還有很多,這里就不一一介紹了,請(qǐng)讀者在實(shí)驗(yàn)時(shí)自行練習(xí)。2.Form類的常用方法
下面是一些最常用的窗體的方法及其用途描述?!?Show:向用戶顯示窗體控件。● ShowDialog:將窗體顯示為模式對(duì)話框?!?Close:關(guān)閉窗體?!?Hide:對(duì)用戶隱藏窗體控件。.Form類的常用事件
在.NET開發(fā)環(huán)境下設(shè)計(jì)窗體時(shí),有以下一些Form類的常用事件(含順序)?!?Init事件。初始化窗體時(shí)觸發(fā)的事件。初始化是窗體生存周期的第一步,在該事件的生存周期內(nèi)不應(yīng)該訪問其他控件,因?yàn)檫@些控件可能尚未生成?!?Load事件。在第一次顯示窗體前觸發(fā)Load事件。● Activated事件。當(dāng)使用代碼激活或用戶激活窗體時(shí),就會(huì)觸發(fā)Activated事件?!?Mouse事件:MouseMove/Enter/Hover/Down/Up/Leave/Wheel等事件。這些都是與鼠標(biāo)操作有關(guān)的事件,分別在鼠標(biāo)指針移到窗體上、鼠標(biāo)指針進(jìn)入窗體、鼠標(biāo)指針在窗體內(nèi)保持靜止、鼠標(biāo)鍵按下、鼠標(biāo)鍵釋放、鼠標(biāo)移出窗體、移動(dòng)鼠標(biāo)滾輪時(shí)發(fā)生。● 鍵盤事件:KeyDown/Press/Up等(非字符鍵不引發(fā)KeyPress事件)。在窗體上按下鍵或釋放鍵時(shí)發(fā)生。● Closing事件。在關(guān)閉窗體時(shí)發(fā)生。● Closed事件。關(guān)閉窗體后發(fā)生。5.3.3兩個(gè)Form之間的數(shù)據(jù)傳遞
上面一節(jié)介紹了Form窗體類的主要屬性、方法和事件,下面我們來看一下如何在一個(gè)窗體上單擊一個(gè)按鈕以顯示另一個(gè)窗體。在建立好了項(xiàng)目之后,系統(tǒng)會(huì)自動(dòng)新建一個(gè)窗體Fom1,我們可以在上面添加控件、編寫程序。當(dāng)我們的應(yīng)用程序需要多個(gè)窗體時(shí),該如何添加第2個(gè)窗體?如何控制第2個(gè)窗體呢?設(shè)計(jì)一個(gè)Windows窗體程序,首先要建立Windows應(yīng)用程序項(xiàng)目,分析本項(xiàng)目需要哪些數(shù)據(jù)和控件,然后進(jìn)行設(shè)計(jì)窗體程序的“三部曲”工作:固定工具箱,在窗體上組織控件并布局;隱藏工具箱、顯示屬性面板,設(shè)計(jì)各控件的各屬性初始值;指定控件的事件委托,編寫事件委托函數(shù)及相關(guān)函數(shù)代碼。上述三步可以簡(jiǎn)單概括為布置界面、設(shè)置屬性、編寫事件委托函數(shù)。【例5-3】?jī)蓚€(gè)Form的窗體程序小案例。①第一步啟動(dòng)C#應(yīng)用程序,新建一個(gè)項(xiàng)目,進(jìn)入編輯環(huán)境,這樣系統(tǒng)會(huì)自動(dòng)給我們新建一個(gè)窗體Fom1,如圖5-12所示。②從“項(xiàng)目”菜單中選擇“添加Windows窗體”項(xiàng),打開添加新項(xiàng)界面,選擇“Windows窗體”。在名稱欄內(nèi),默認(rèn)的名稱是Form2,可以根據(jù)需要來修改它的名稱。修改好后單擊“添加”按鈕,這樣設(shè)計(jì)窗口內(nèi)就有了第2個(gè)窗體,如圖5-13所示。③選中Form2窗體,從左邊的“工具箱”中拖曳控件,并為所拖曳的控件設(shè)置屬性,編寫相關(guān)的事件代碼。如拖曳一個(gè)Button控件,默認(rèn)為“button1”,在右邊的“屬性”面板中,將button1的“Text”屬性改為“顯示窗體Form2”。然后,雙擊“button1”,切換到代碼頁,系統(tǒng)自動(dòng)生成如下語句。privatevoidbutton1_Click(objectsender,EventArgse){
}編寫button1的Click事件代碼如下。privatevoidbutton1_Click(objectsender,EventArgse){Form2myForm=newForm2();myForm.Show();}這樣就可以了。當(dāng)程序運(yùn)行后,首先出現(xiàn)的是Form1窗口,其上有一個(gè)按鈕,單擊該按鈕后,出現(xiàn)了Form2窗口,如圖5-14所示。5.3.4演練
1.實(shí)驗(yàn)題目Form類。2.實(shí)驗(yàn)?zāi)康摹?掌握利用Form對(duì)象的基本屬性控制Form的外觀。● 了解利用Form對(duì)象的基本方法。3.實(shí)驗(yàn)內(nèi)容(1)建立一個(gè)Windows應(yīng)用程序項(xiàng)目,包含F(xiàn)orm1和Form2兩個(gè)窗體。Form1中有一個(gè)按鈕“顯示Form2”,要求單擊該按鈕時(shí)才顯示Form2;Form2上也有一個(gè)按鈕“關(guān)閉Form1”,單擊這個(gè)按鈕,將關(guān)閉Form1,也就關(guān)閉了整個(gè)應(yīng)用程序。(2)選做:在(1)基礎(chǔ)上,當(dāng)單擊Form1的標(biāo)題欄的關(guān)閉按鈕時(shí),顯示Form2,隱藏Form1。4.實(shí)驗(yàn)步驟由讀者寫出。5.實(shí)驗(yàn)總結(jié)由讀者寫出。5.3.5自測(cè)
1.選擇題(1)如果將窗體的FormBorderStyle屬性設(shè)置為None,則
。a.窗體沒有邊框并不可調(diào)整大小。b.窗體沒有邊框但可以調(diào)整大小。c.窗體有邊框但不可調(diào)整大小。d.窗體是透明的。(2)如果將窗體設(shè)置為透明的,則
。a.要將窗體的FormBorderStyle屬性設(shè)置為None。b.要將Locked屬性設(shè)置為True。c.要將Opacity屬性設(shè)置小于100%。d.要將Enable屬性設(shè)置為True。(3)下面描述錯(cuò)誤的是
。a.窗體也是控件。b.窗體也是類。c.控件是從窗體繼承來的。d.窗體的父類是控件類。(4)要使窗體剛運(yùn)行時(shí),顯示在屏幕的中央,應(yīng)設(shè)置窗體的
屬性。a.WindowsStateb.StartPostionc.CenterScreend.CenterParenr基本知識(shí)3:基本控件
VisualStudio.NET提供了很多Windows窗體控件,而且每個(gè)控件都有大量的屬性和事件。這些控件及其屬性和事件使得我們可以快速地設(shè)計(jì)出內(nèi)容豐富的Windows窗體。本節(jié)將介紹幾個(gè)最基本的控件。5.4.1Label類控件
標(biāo)簽(Label)控件是一種最簡(jiǎn)單的控件,通常用于需要靜態(tài)文字提示的場(chǎng)合,是最常用的控件之一。Label控件還可用于顯示應(yīng)用程序運(yùn)行時(shí)的信息,也可用于為窗體添加描述性文字,以便為用戶提供幫助信息。在應(yīng)用Label控件前,我們先來了解一下Label控件的幾個(gè)主要屬性。1.控件外觀● Text屬性。Label控件所顯示的提示性文字保存在Text屬性中。它的設(shè)置方法為,首先從“工具箱”中的“所有Windows窗體”中拖曳一個(gè)Label控件放在一個(gè)窗體中,選中所生成的Label1,再在其屬性面板中把Text屬性改為所要顯示的文本即可,如圖5-15所示。運(yùn)行效果如圖5-16所示。注意:TextAlign屬性只有在Label控件的AutoSize屬性值為False時(shí)有效● TextAlign屬性。為了設(shè)置Label控件中文字的排列方式,Label控件還定義了一個(gè)TextAlign屬性。該屬性同樣采用了可視化設(shè)置,如圖5-17所示,用戶可以很方便地設(shè)置Label控件中文字的排列方式?!?Image屬性。為了美化Label控件的顯示效果,還可以通過Image屬性為Label控件指定一幅圖片在為背景。可以作為Label控件背景的圖片類型包括jpg、bmp、gif、png等,操作如圖5-18所示。說明:VS2008提供的一些常用的圖標(biāo)圖片存放的默認(rèn)安裝位置為“C:\ProgramFiles\MicrosoftVisualStudio9.0\Common7\VS2008ImageLibrary”路徑下● ForeColor和BackColor屬性。分別表示文字顏色(前景色)和背景色,屬性類型都為Color結(jié)構(gòu)類型,可以進(jìn)行可視化設(shè)置。通過Label控件的BackColor屬性可以設(shè)置標(biāo)簽的背景顏色。在屬性面板中,系統(tǒng)提供了幾十種顏色可供選擇。另外還可以通過程序代碼來修改BackColor屬性,例如:Label1.BackColor=Color.Transparent;是將標(biāo)簽設(shè)為透明?!?Font屬性。表示文本的字體,包含豐富的字體設(shè)置,屬性類型是System.Drawing.Font類,可以通過可視化的方法進(jìn)行設(shè)置,如圖5-19所示。單擊Font屬性后面的“省略號(hào)”,即可彈出字體對(duì)話框,如圖5-20所示。2.控件布局屬性
● AutoSize屬性。表示控件大小是否自動(dòng)適應(yīng)文字內(nèi)容,為bool類型,屬性值默認(rèn)為True?!?Left、Top、Width、Height屬性和Location、Size屬性。表示控件在父容器中的定位和尺寸,其中Left、Top表示定位,在屬性面板中顯示為Location屬性,Width和Height表示尺寸,在屬性面板中顯示為Size屬性。Left、Top、Width、Height屬性是int類型,Location是Point結(jié)構(gòu)類型,Size是Size結(jié)構(gòu)類型。3.其他
● Enabled屬性。表示該控件是否可供用戶使用,為bool類型,默認(rèn)為True(所有控件都有此屬性)。若設(shè)置此屬性值為False,則該控件在運(yùn)行時(shí)狀態(tài)為灰色顯示(即為不可用)。5.4.2TextBox類控件
文本框(TextBox)用于獲取用戶輸入或顯示的文本,是最常用的控件之一。在應(yīng)用該控件前,我們先介紹一些他的常用屬性和方法事件。1.常用屬性
● Text屬性。保存用戶通過文本框輸入的信息,可以在界面設(shè)計(jì)時(shí)指定一個(gè)初始值,這樣在程序運(yùn)行時(shí),該初始值將自動(dòng)顯示在該文本框中。在程序中可以通過讀取該屬性的值來獲取用戶的輸入信息?!?ReadOnly屬性。指定文本框是否為只讀控件,默認(rèn)值為False。默認(rèn)情況下,文本框中的內(nèi)容可以被編輯。如果將ReadOnly屬性的值設(shè)為True后,則該控件不可用?!?MultiLine屬性??刂凭庉嬁丶奈谋臼欠衲軌蚩缭蕉嘈校J(rèn)值為False。在默認(rèn)的情況下,文本框可以最多輸入2
048個(gè)字符。如果將MultiLine屬性的值設(shè)為True,則最多可以容納32KB的文本。同樣,在多行輸入的情況下,也可以通過讀取該屬性的值來獲取用戶的輸入信息?!?TabIndex/TabStop屬性。按Tab鍵時(shí)的焦點(diǎn)順序,要想哪個(gè)TextBox獲得焦點(diǎn),把它的TabStop屬性設(shè)為True即可。2.常用事件
【例5-4】文本框TextChanged事件的應(yīng)用演示。其大體步驟為,首先從“工具箱”中的“所有Windows窗體”中拖曳一個(gè)TextBox控件放在一個(gè)窗體中,雙擊所生成的TextBox1,進(jìn)入代碼編輯文件,輸入如下代碼。privatevoidtextBox1_TextChanged(objectsender,System.EventArgse){MessageBox.Show("文本已改變,請(qǐng)注意存盤!");}程序運(yùn)行后,如果我們對(duì)文本框中的文本作任何改動(dòng),都會(huì)彈出一個(gè)對(duì)話框,如圖5-21所示。說明:上例是一個(gè)典型的選取事件不恰當(dāng)?shù)姆蠢?,?yīng)該用文本框的Leave事件完成此功能,請(qǐng)讀者通過此題進(jìn)一步體會(huì)事件發(fā)生時(shí)機(jī)的含義。5.4.3Button類控件
按鈕(Button)控件允許用戶通過單擊來執(zhí)行操作。當(dāng)該按鈕被單擊后,它看起來像是被按下然后釋放。它是最常用的控件之一。在應(yīng)用該控件前,我們先介紹一些它的常用屬性和方法事件。1.常用屬性
● Text屬性。Button控件所顯示的提示性的文字保存在Text屬性中。它的設(shè)置方法為,首先從“工具箱”中的“所有Windows窗體”中拖曳一個(gè)Button控件放在一個(gè)窗體中,選中所生成的button1,再在其屬性面板中把Text屬性改為所要顯示的文本即可?!?FlatStyle屬性。C#允許改變按鈕的外觀,一般設(shè)置FlatStyle屬性的不同值,就可以改變它的平面顯示風(fēng)格,該屬性可以取如下的值?!?Flat:按鈕總是以平面方式顯示?!?Popup:鼠標(biāo)移動(dòng)到按鈕上時(shí),以三維方式顯示按鈕,其他情況同F(xiàn)lat。● Standard:按鈕總是以三維方式顯示。2.常用事件
● Click事件。對(duì)于Button控件,我們常用的事件是Click事件,是單擊按鈕時(shí)所引發(fā)的處理操作?!纠?-5】按鈕Click事件的應(yīng)用演示。下面我們通過一個(gè)小例子,來演示一下Click事件的應(yīng)用。其大體步驟為,首先從“工具箱”中的“所有Windows窗體”中拖曳一個(gè)Button控件放在一個(gè)窗體中,如圖5-22所示,
雙擊所生成的button1,進(jìn)入代碼編輯區(qū)域,輸入如下代碼。privatevoidbutton1_Click(objectsender,System.EventArgse){MessageBox.Show("你單擊了一下按鈕哦!");}程序運(yùn)行結(jié)果如圖5-23所示:3.其他事件
對(duì)于Button控件,我們還經(jīng)常用KeyDown、KeyPress、KeyUp事件來響應(yīng)鍵盤的一些操作,用MouseDown、MouseEnter、MouseHover、MouseLeave、MouseMove事件來響應(yīng)鼠標(biāo)的一些操作。Button控件還有很多事件,有興趣的讀者可以自己試驗(yàn)一下,看看有什么有趣的事件發(fā)生.注意:Form類還有AcceptButton和CancelButton兩個(gè)屬性與Button按鈕有關(guān),設(shè)置窗體的AcceptButton屬性值為某一個(gè)按鈕(例如Button1),相當(dāng)于運(yùn)行該窗體時(shí)用戶按Enter鍵時(shí)所單擊的窗體上的Button1按鈕;設(shè)置窗體的CancelButton屬性值為某一個(gè)按鈕(例如Button2),相當(dāng)于運(yùn)行該窗體時(shí)用戶按Esc鍵時(shí)所單擊的窗體上的Button2按鈕。5.4.4演練
1.實(shí)驗(yàn)題目基本控件2.實(shí)驗(yàn)?zāi)康摹?掌握利用Label、TextBox、Button類控件的基本屬性?!?了解利用Label、TextBox、Button的基本方法。3.實(shí)驗(yàn)?zāi)康模?)設(shè)計(jì)一個(gè)窗體,包含一個(gè)Label,一個(gè)TextBox,一個(gè)Button。Label對(duì)象顯示“請(qǐng)輸入文本”,TextBox對(duì)象可以接受多行輸入,Button對(duì)象的顯示文本是“保存”。若文本框中文本改變過而未按保存按鈕,當(dāng)窗體關(guān)閉時(shí),顯示消息框“您還未保存!”,且取消關(guān)閉操作;文本框文本未改變或已經(jīng)按過保存,則不提示,執(zhí)行關(guān)閉。(2)選做:設(shè)計(jì)書店管理系統(tǒng)登錄框,當(dāng)輸入正確的用戶名密碼并單擊登錄時(shí),用提示框提示登錄成功,當(dāng)輸入錯(cuò)誤的用戶名密碼時(shí),提示登錄失敗。4.實(shí)驗(yàn)步驟由讀者寫出。5.實(shí)驗(yàn)總結(jié)由讀者寫出。5.4.5自測(cè)1.填空題(1)表示控件是否可以對(duì)用戶交互做出響應(yīng)的屬性是
。(2)表示是否顯示控件的屬性是
。(3)按鈕控件的常用事件是
。(4)如果想在文本框中輸入密碼,常指定
屬性。2.選擇題(1)當(dāng)TextBox控件文本(Text)屬性發(fā)生改變時(shí)會(huì)引發(fā)控件的
事件。a.TextChangedb.SizeChangedc.StyleChangedd.LocationChanged(2)設(shè)置TextBox控件只讀屬性應(yīng)設(shè)置
。a.Textb.ReadOnlyc.MultiLined.WordWrap(3)Label控件中設(shè)置中文字的排列方式的屬性
。a.Textb.TextAlignc.Sized.Tag(4)要使TextBox控件中的輸入顯示一系列的“*”,應(yīng)設(shè)置該控件的
屬性。a.Nameb.Textc.PasswordChard.ReadOnly基本知識(shí)4:菜單相關(guān)控件
菜單條、狀態(tài)條和工具條是Windows窗體程序中用戶界面的一個(gè)重要部分,是應(yīng)用非常普遍的桌面元素。在.NETFramework3.5中,菜單條、狀態(tài)條、工具條都由新增的ToolStrip控件提供高度一致和高度靈活的處理。5.5.1ToolStrip控件ToolStrip控件為Windows工具欄對(duì)象提供支持。它是多種工具條項(xiàng)(工具條子控件)的容器。1.ToolStrip控件的主要屬性● Name屬性。獲取或設(shè)置控件的名稱?!?Items屬性。獲取菜單條中的工具條項(xiàng)的集合。說明:Items是集合屬性,有Add、Remove等集合屬性具有的方法;Items屬性類型為ToolStripItemCollection類型,其中每個(gè)元素是ToolStripItem類型,而ToolStripItem僅僅是一個(gè)個(gè)ToolStripButton、ToolStripTextBox、ToolStripLabel等的基類型;即,實(shí)際包含在ToolStrip的Items屬性中的元素是ToolStripButton、ToolStripTextBox、ToolStripLabel等子控件;這些子控件都是窗體類的字段,可以用this.toolStripLabel1來直接訪問,而不用this.toolStrip1.Items[0]的方式來訪問?!?ShowItemToolTips屬性。獲取或設(shè)置一個(gè)值,該值指示是否顯示MenuStrip的工具提示。【例5-6】演示工具欄ToolStrip控件的應(yīng)用。①啟動(dòng)VS2008,建立一個(gè)項(xiàng)目,進(jìn)入窗體設(shè)計(jì)的主界面。②從左邊的“工具箱”中拖曳一個(gè)ToolStrip控件,默認(rèn)為“toolStrip1”,單擊智能按鈕,選擇“Button”選項(xiàng),如圖5-24所示,然后在其“屬性”面板中,單擊“Image”屬性后的“…”按鈕,打開“選擇資源”對(duì)話框,如圖5-25所示,單擊“導(dǎo)入”按鈕,導(dǎo)入相應(yīng)的圖片資源后單擊“確定
圖5?24ToolStrip控件的智能按鈕圖5?25選擇資源對(duì)話框③重復(fù)步驟②,添加“保存”、“剪切”、“粘貼”和分隔欄,如圖5-26所示。在添加分隔欄時(shí),選擇的是智能按鈕中的“Separator”項(xiàng)。④雙擊“打開”按鈕,切換到代碼頁,系統(tǒng)自動(dòng)生成如下語句。privatevoidtoolStripButton1_Click(objectsender,EventArgse){}編寫“打開”按鈕的Click事件代碼如下。privatevoidtoolStripButton1_Click(objectsender,EventArgse){//此處添加相應(yīng)代碼}重復(fù)本步驟,添加“保存”、“剪切”、“粘貼”項(xiàng)的代碼。⑤按F5鍵(或用菜單操作“調(diào)試|啟動(dòng)”),進(jìn)行調(diào)試,調(diào)試成功的效果如圖5-27所示。
圖5?26添加工具欄圖片按鈕
圖5?27工具欄的運(yùn)行效果5.5.2
MenuStrip控件
MenuStrip控件表示窗體菜單結(jié)構(gòu)的容器。此控件容納ToolStripMenuItem、ToolStripComboBox、ToolStripSeparator和ToolStripTextBox對(duì)象。MenuStrip控件主要用來容納ToolStripMenuItem控件,該控件表示一個(gè)菜單項(xiàng)。ToolStripSeparaor只是一個(gè)占位間隔。用戶可以將ToolStripMenuItem對(duì)象添加到MenuStrip中。每個(gè)ToolStripMenuItem也可以是其他子菜單項(xiàng)的父菜單。MenuStrip控件的屬性和ToolStrip類似,其功能主要是由ToolStripMenuItem控件實(shí)現(xiàn)的。1.ToolStripMenuItem控件的主要屬性● Name屬性。獲取或設(shè)置控件的名稱?!?Text。獲取或設(shè)置菜單項(xiàng)的顯示文本?!?ShortcutKeys。獲取或設(shè)置與ToolStripMenuItem關(guān)聯(lián)的快捷鍵2.ToolStripMenuItem控件的主要事件● Click事件。在單擊ToolStripItem時(shí)發(fā)生。【例5-7】菜單條及菜單項(xiàng)的應(yīng)用。①啟動(dòng)VS2008,建立一個(gè)項(xiàng)目,進(jìn)入窗體設(shè)計(jì)的主界面。②從左邊的“工具箱”中拖曳一個(gè)MenuStrip控件,默認(rèn)為“menuStrip1”,單擊智能按鈕,選擇“MenuItem”選項(xiàng),如圖5-28所示,然后在右邊的“屬性”面板中,將“Text”屬性改為“文件”(或者選擇“MenuItem”選項(xiàng)后單擊該項(xiàng)直接輸入文本也可以修改其“Text”屬性值)。③重復(fù)步驟②,添加“打開”、“保存”和分隔欄,如圖5-29所示。在添加分隔欄時(shí),選擇的是智能按鈕中的“Separator”項(xiàng)。
圖5?28MenuStrip控件的智能按鈕
圖5?29添加子菜單
④雙擊“打開”菜單項(xiàng),切換到代碼頁,系統(tǒng)自動(dòng)生成如下語句。privatevoid打開ToolStripMenuItem_Click(objectsender,EventArgse){}編寫“打開”菜單項(xiàng)的Click事件代碼如下。privatevoid打開ToolStripMenuItem_Click(objectsender,EventArgse){MessageBox.Show("您單擊的是打開項(xiàng)!");}重復(fù)本步驟,添加保存項(xiàng)的代碼。⑤按F5鍵(或用菜單操作“調(diào)試|啟動(dòng)”),進(jìn)行調(diào)試,調(diào)試成功的效果如圖5-30所示。⑥單擊“打開”項(xiàng)后,會(huì)彈出一個(gè)消息框,如圖31所示。圖5?30菜單運(yùn)行顯示
圖5?31消息框
5.5.3ContextMenuStrip控件
在Windows操作系統(tǒng)、Office辦公軟件等這類軟件中,用戶在某個(gè)界面元素上單擊鼠標(biāo)右鍵,都可以彈出一個(gè)快捷菜單,幫助用戶實(shí)現(xiàn)一些功能的快捷操作。在開發(fā)Windows應(yīng)用程序時(shí)實(shí)現(xiàn)這一功能,將大大方便用戶。那么如何來實(shí)現(xiàn)這一功能呢?在.NET中,利用ContextMenuStrip控件即可完成此功能。ContextMenuStrip控件的主要屬性和MenuStrip控件相同,容納的工具條項(xiàng)也相同,它們?cè)谑褂蒙系牟煌幹饕牵篊ontextMenuStrip需要與某個(gè)界面元素建立關(guān)聯(lián),即需要設(shè)置某個(gè)宿主控件的ContextMenuStrip屬性為一個(gè)ContextMenuStrip控件的實(shí)例。【例5-8】上下文菜單條ContextMenuStrip的使用。
圖5?32ContextMenuStrip控件的智能按鈕下面我們通過一個(gè)小例子來演示一下快捷菜單的應(yīng)用。①啟動(dòng)VS2008,建立一個(gè)項(xiàng)目,進(jìn)入窗體設(shè)計(jì)的主界面。②從左邊的“工具箱”中拖曳一個(gè)ContextMenuStrip控件,默認(rèn)為“contextMenuStrip1”,單擊智能按鈕,選擇“MenuItem”選項(xiàng),如圖5-32所示,然后在右邊的“屬性”面板中,將“Text”屬性改為“最大化”。③重復(fù)步驟②,添加“最小化”、“關(guān)閉”和分隔欄,如圖5-33所示。在添加分隔欄時(shí),選擇的是智能按鈕中的“Separator”項(xiàng)。圖5?32ContextMenuStrip控件的智能按鈕④雙擊“最大化”菜單項(xiàng),切換到代碼頁,系統(tǒng)自動(dòng)生成如下語句。privatevoid最大化ToolStripMenuItem_Click(objectsender,EventArgse){}編寫“最大化”菜單項(xiàng)的Click事件代碼。privatevoid最大化ToolStripMenuItem_Click(objectsender,EventArgse){WindowState=FormWindowState.Maximized;}重復(fù)本步驟,添加最小化項(xiàng)和關(guān)閉項(xiàng)的代碼。privatevoid最小化ToolStripMenuItem_Click(objectsender,EventArgse){WindowState=FormWindowState.Minimized;}privatevoid關(guān)閉ToolStripMenuItem_Click(objectsender,EventArgse){this.Close();}⑤設(shè)置Form1的ContextMenuStrip屬性為contextMenuStrip1。⑥按F5鍵(或用菜單操作“調(diào)試|啟動(dòng)”),進(jìn)行調(diào)試,調(diào)試成功的效果如圖5-34所示。
圖5?33添加快捷菜單圖5?34彈出式快捷菜單演示5.5.4StatusStrip控件
StatusStrip控件可以顯示正在Form上查看的對(duì)象的相關(guān)信息、對(duì)象的組件或與該對(duì)象在應(yīng)用程序中的操作相關(guān)的上下文信息。通常,StatusStrip控件由StatusLabel對(duì)象組成,每個(gè)這樣的對(duì)象都可以顯示文本、圖標(biāo)或同時(shí)顯示這二者。StatusStrip還可以包含DropDownButton、SplitButton和ProgressBar控件。StatusStrip控件的屬性和ToolStrip類似,其功能主要是由StatusLabel控件實(shí)現(xiàn)的。StatusLabel控件的主要屬性如下?!?Name。獲取或設(shè)置項(xiàng)的名稱?!?Text。獲取或設(shè)置要顯示在項(xiàng)上的文本?!?Spring。獲取或設(shè)置一個(gè)值,該值指示在調(diào)整窗體大小時(shí),StatusLabel是否自動(dòng)填充StatusStrip上的可用空間。StatusStrip控件的使用,跟前面所述的MenuStrip控件、ContextMenuStrip控件、ToolStrip控件類似,這里就不一一贅述,請(qǐng)讀者參照上述控件自己學(xué)習(xí)。5.5.5演練
1.實(shí)驗(yàn)題目工具條等控件2.實(shí)驗(yàn)?zāi)康摹?掌握ToolStrip、MenuStrip、ContextMenuStrip、StatusStrip控件的基本屬性。● 掌握ToolStripLabel、ToolStripButton的常用屬性和事件。3.實(shí)驗(yàn)內(nèi)容設(shè)計(jì)一個(gè)窗體,包含兩個(gè)文本框、一個(gè)ToolStrip、一個(gè)MenuStrip、一個(gè)ContextMenuStrip、一個(gè)StatusStrip,ToolStrip中包含一個(gè)ToolStripButton,MenuStrip和ContextStrip中各包含一個(gè)菜單項(xiàng),菜單項(xiàng)和按鈕都完成一個(gè)功能:用戶單擊時(shí)在StatusStrip中顯示被單擊的控件的名稱。4.實(shí)驗(yàn)步驟由讀者寫出。5.實(shí)驗(yàn)總結(jié)由讀者寫出。5.6基本知識(shí)5:其他常用控件
除了上述基本控件、菜單控件以外,.NET還提供了很多其他Windows窗體控件,而且每個(gè)控件都有大量的屬性和事件。本節(jié)將再介紹幾個(gè)比較常用的控件。5.6.1RadioButton類、CheckBox類控件、GroupBox類控件1.RadioButton控件RadioButton控件通常成組出現(xiàn),用于為用戶提供由兩個(gè)或多個(gè)互斥選項(xiàng)組成的選項(xiàng)集。當(dāng)用戶選擇單選按鈕時(shí),同一組中的其他單選按鈕不能同時(shí)被選中。即在這組選項(xiàng)中,你能且只能選擇一個(gè)。(1)RadioButton控件主要是Checked屬性。● Checked屬性。表示單選按鈕是否被選中,默認(rèn)值為False,默認(rèn)情況下接受單擊會(huì)自動(dòng)被選中,同一容器的其他RadioButton對(duì)象的Checked屬性的值也會(huì)隨之改變。在同一Form窗體上,可以用若干GroupBox控件容納RadioButton,以實(shí)現(xiàn)對(duì)RadioButton分組,如圖5-35所示。(2)RadioButton控件的常用事件?!?CheckedChanged事件。當(dāng)RadioButton控件的Checked屬性值改變時(shí)發(fā)生。下面利用RadioButton控件及前幾節(jié)介紹的Label及Button控件,設(shè)計(jì)一個(gè)類似查詢分析器登錄框的示例。新建一個(gè)項(xiàng)目,本示例的具體操作步驟如下。第1步(布置界面),選中Form1窗體,從工具箱中拖曳一個(gè)GroupBox,然后再在GroupBox控件中拖曳兩個(gè)RadioButton、兩個(gè)Label標(biāo)簽、兩個(gè)TextBox文本框,在Form窗體中再拖曳三個(gè)Button按鈕。第2步(設(shè)置屬性),如圖5-36所示,修改各控件的Name屬性和Text屬性,此外還要設(shè)置Text屬性值為“Windows身份驗(yàn)證”的RadioButton的Checked屬性值為True,兩個(gè)Label和兩個(gè)TextBox的Enabled屬性值為False。第3步(編寫事件委托函數(shù)),雙擊Text屬性值為“SQLServer身份驗(yàn)證”的RadioButton,進(jìn)入代碼文件,編寫其發(fā)生CheckedChanged事件時(shí)調(diào)用的委托函數(shù),具體代碼如下。
圖5?35單選按鈕的運(yùn)行效果圖5?36界面的布置效果privatevoidradioButtonSqlServer_CheckedChanged(objectsender,EventArgse){if(radioButtonSqlServer.Checked){labelName.Enabled=true;labelPwd.Enabled=true;textBoxName.Enabled=true;textBoxPwd.Enabled=true;}else{labelName.Enabled=false;labelPwd.Enabled=false;textBoxName.Enabled=false;textBoxPwd.Enabled=false;}}按F5運(yùn)行程序,開始時(shí),兩個(gè)Label和兩個(gè)TextBox都是灰顯(不可用)狀態(tài)。當(dāng)選中“SQLServer身份驗(yàn)證”的RadioButton按鈕時(shí),它們都變?yōu)榭捎茫划?dāng)選中“Windows身份驗(yàn)證”的RadioButton按鈕時(shí),它們又都變?yōu)椴豢捎谩?.CheckBox類控件
CheckBox類控件(復(fù)選框)常用于為用戶提供多項(xiàng)選擇。在同一窗體中,不同的復(fù)選框是相互獨(dú)立的,復(fù)選框之間互不影響,這和前面的RadioButton單選按鈕是明顯不同的??梢猿山M地使用復(fù)選框以顯示多重選項(xiàng),使用戶可以從中選擇一項(xiàng)或多項(xiàng)。圖5?37CheckAlign屬性的可視化設(shè)置對(duì)于CheckBox控件,經(jīng)常使用的屬性如下● Checked屬性。表示復(fù)選框是否被選中,默認(rèn)值為False。當(dāng)復(fù)選框被選中時(shí),其Checked屬性被設(shè)置為True,當(dāng)Checked屬性值更改時(shí),將引發(fā)CheckedChanged事件。圖5?37CheckAlign屬性的可視化設(shè)置●
CheckAlign屬性。用來確定控件中小方框相對(duì)于文本的位置。對(duì)于這個(gè)屬性,系統(tǒng)采用了可視化設(shè)置,如圖5-37用戶可以方便地進(jìn)行設(shè)置。對(duì)于CheckBox控件,經(jīng)常使用的事件為CheckedChanged事件,這跟RadioButton控件相同。3.GroupBox類控件GroupBox控件稱為成組框,它的作用是將一些控件捆綁成一個(gè)組,使用戶界面清晰明了。值得注意的是,當(dāng)RadioButton控件分組使用時(shí),一定要將每組分別放在一個(gè)GroupBox控件內(nèi),才能起到分組單選的作用。設(shè)計(jì)該控件時(shí),要將GroupBox控件拖入Windows窗體內(nèi),然后再向框內(nèi)加入其他控件。GroupBox控件一般只修改其Text屬性,Text是框頭的提示性文字。很少為GroupBox控件編寫事件處理程序。5.6.2ListBox類、ComboBox類控件
1.ListBox控件ListBox控件可以顯示一組選項(xiàng)的列表,用戶可以單擊選擇這些項(xiàng)。ListBox類還提供了一些方法,用以添加、刪除項(xiàng),以及在列表的項(xiàng)內(nèi)查找文本。(1)主要屬性?!?Items屬性。列表項(xiàng),集合中的元素是object類型,一般是string?!?SelectedIndex屬性。獲取或設(shè)置ListBox中當(dāng)前選定項(xiàng)的從零開始的索引?!?SelectedItem屬性。獲取或設(shè)置ListBox中的當(dāng)前選定項(xiàng)?!?SelectedItems/SelectedIndices屬性。分別是多項(xiàng)選中的選中項(xiàng)集合和選中索引集合,屬性類型分別為SelectedObjectCollection和SelectedIndexCollection類型?!?SelectionMode屬性。獲取或設(shè)置在ListBox中選擇項(xiàng)所用的方式,SelectionMode屬性值為枚舉類型:None、One、MultiSimple(單擊即選中,再單擊即取消選中),MultiExtend。(2)主要事件?!?SelectedIndexChanged事件。該事件當(dāng)SelectedIndex屬性值更改時(shí)發(fā)生。關(guān)于ListBox控件的使用,可以采用可視化的設(shè)計(jì)方法,也可以采用編寫代碼的方法來設(shè)計(jì)。下面通過一個(gè)例題程序來演示ListBox控件的使用?!纠?-9】設(shè)計(jì)一個(gè)窗體,實(shí)現(xiàn)單擊Text屬性值為“〉〉”的按鈕可以將一個(gè)列表框(稱為源列表框)中的選中項(xiàng)加入到另一個(gè)列表框(稱為目標(biāo)列表框),并且單擊Text屬性值為“〈〈”的按鈕可以將目標(biāo)列表框中的選中項(xiàng)刪除的功能。各控件功能如表5-2所示。表5?2 各控件的功能表類型NameTextItemsClick事件功能ListBox源ListBox經(jīng)典著作社會(huì)科學(xué)歷史地理政治法律外國文學(xué)ListBox目標(biāo)ListBoxButton添加Button>>將“源ListBox”的選中項(xiàng)添加到“目標(biāo)ListBox”中Button去掉Button<<將“目標(biāo)ListBox”的選中項(xiàng)刪除圖5?38窗體布置效果本示例的具體操作步驟如下。①第1步(布置界面),按照上述表格,在Form窗體上拖曳兩個(gè)ListBox和兩個(gè)Button按鈕,界面設(shè)計(jì)效果如圖5-38所示。②第2步(設(shè)置屬性),按照上述表格描述,分別設(shè)置各控件的對(duì)應(yīng)屬性值。③第3步(編寫事件委托函數(shù)),分別雙擊兩個(gè)Button按鈕,進(jìn)入代碼文件,編寫兩個(gè)Button按鈕被單擊發(fā)生Click事件時(shí)調(diào)用的委托函數(shù),具體函數(shù)代碼如下。privatevoid添加Button_Click(objectsender,EventArgse){
目標(biāo)ListBox.Items.Add(源ListBox.SelectedItem);}privatevoid去掉Button_Click(objectsender,EventArgse){
目標(biāo)ListBox.Items.Remove(目標(biāo)ListBox.SelectedItem);}圖5?38窗體布置效果④按F5運(yùn)行程序,當(dāng)選中源ListBox中的“經(jīng)典著作”項(xiàng),單擊“>>”按鈕,將其添加到目標(biāo)ListBox中去,同樣操作把“社會(huì)科學(xué)”和“政治法律”選項(xiàng)也添加到目標(biāo)ListBox中,操作效果如圖5-39所示。
⑤當(dāng)選中目標(biāo)ListBox中的“社會(huì)科學(xué)”項(xiàng)后,單擊“<<”按鈕,把該選中項(xiàng)刪除,操作效果如圖5-40所示。
圖5?39窗體運(yùn)行效果
圖5?40單擊“<<”按鈕的效果2.ComboBox類控件ComboBox控件通常稱為組合框,可以看作是把一個(gè)TextBox控件和一個(gè)ListBox控件組合在一起的控件。因此它具有上述兩種控件的特點(diǎn):用戶既可以在ComboBox控件中進(jìn)行輸入,就像在TextBox控件中一樣,也可以在其附帶的下拉列表框中選取某項(xiàng)內(nèi)容。通常ComboBox控件的下拉列表部分折疊顯示。ComboBox控件的屬性大部分都來自于文本框和列表框,用法上基本也沒什么區(qū)別。下面就介紹ComboBox控件的一個(gè)常用屬性?!?DropDownStyle。獲取或設(shè)置指定組合框樣式的值。該屬性可取的值為下列值之一?!?DropDown:文本部分可編輯,用戶必須單擊箭頭按鈕來顯示列表部分?!?DropDownList:用戶不能直接編輯文本部分,必須單擊箭頭按鈕來顯示列表部分。● Simple:文本部分可編輯,列表部分總可見。ComboBox控件的方法和事件也大部分來自文本框和列表框,這里就不再贅述,請(qǐng)讀者自學(xué)練習(xí)使用。5.6.3OpenFileDialog類控件
“打開”對(duì)話框主要用于已經(jīng)存在的文件,如圖5-41所示,其作用一般僅僅為獲取用
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度廣告代理合同終止協(xié)議范文
- 二零二五年度汽車交易傭金合同電子版
- 2025年度新型抹灰材料研發(fā)班組勞務(wù)分包合同4篇
- 2025年度高級(jí)拍賣師專業(yè)聘用合同書
- 2025年度店鋪商鋪?zhàn)赓U合同租賃場(chǎng)地裝修及改造協(xié)議2篇
- 2025年度個(gè)人生活技能培訓(xùn)服務(wù)合同范本2篇
- 二零二五年度派遣企業(yè)IT運(yùn)維工程師合同3篇
- 二零二五年度出國勞務(wù)人員工資支付及福利保障合同3篇
- 2025年度智能車庫使用權(quán)轉(zhuǎn)讓合同
- 二零二五年度木工班組承包安全生產(chǎn)管理合同3篇
- 2025屆河北省衡水市衡水中學(xué)高考仿真模擬英語試卷含解析
- 新修訂《保密法》知識(shí)考試題及答案
- 電工基礎(chǔ)知識(shí)培訓(xùn)課程
- 住宅樓安全性檢測(cè)鑒定方案
- 廣東省潮州市潮安區(qū)2023-2024學(xué)年五年級(jí)上學(xué)期期末考試數(shù)學(xué)試題
- 市政道路及設(shè)施零星養(yǎng)護(hù)服務(wù)技術(shù)方案(技術(shù)標(biāo))
- 選擇性必修一 期末綜合測(cè)試(二)(解析版)2021-2022學(xué)年人教版(2019)高二數(shù)學(xué)選修一
- 《論語》學(xué)而篇-第一課件
- 《寫美食有方法》課件
- 學(xué)校制度改進(jìn)
- 各行業(yè)智能客服占比分析報(bào)告
評(píng)論
0/150
提交評(píng)論