版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第8章WinForms應(yīng)用程序高級(jí)界面設(shè)計(jì)8.1SDI和MDI簡(jiǎn)介
8.2窗體菜單設(shè)計(jì)
8.3窗體工具欄和狀態(tài)欄設(shè)計(jì)
8.4實(shí)現(xiàn)用戶界面增強(qiáng)功能 8.5綜合案例:瀏覽器制作
本章小結(jié)
練習(xí)與作業(yè)
上機(jī)部分(八)
學(xué)習(xí)目標(biāo)●了解SDI界面和MDI界面的差異●掌握如何創(chuàng)建MDI界面應(yīng)用程序●掌握創(chuàng)建菜單的方法●掌握窗體工具欄和狀態(tài)欄的設(shè)計(jì)方法●了解如何實(shí)現(xiàn)用戶界面增強(qiáng)功能的方法8.1SDI和MDI簡(jiǎn)介
窗體是構(gòu)建MsWindows應(yīng)用程序的基本模塊。傳統(tǒng)上,MsWindows應(yīng)用程序用戶界面樣式主要有單文檔界面(SDI)、多文檔界面(MDI)和資源管理器界面三種。
SDI界面的一個(gè)示例就是MicrosoftWindows中的“寫(xiě)字板”(Notepad)應(yīng)用程序。在NotePad中,只能打開(kāi)一個(gè)文檔,想要打開(kāi)另一個(gè)文檔時(shí),必須先關(guān)上已打開(kāi)的文檔。如圖8-1所示。
SDI一次只能處理一個(gè)文檔,如果想要打開(kāi)第二個(gè)文檔,就必須運(yùn)行一個(gè)新的SDI應(yīng)用程序?qū)嵗?,它與第一個(gè)實(shí)例沒(méi)有任何關(guān)系,對(duì)一個(gè)實(shí)例的任何配置都不會(huì)影響另—個(gè)實(shí)例。例如,在MsPaint的一個(gè)實(shí)例中,可以將繪圖顏色設(shè)置為藍(lán)色,如果打開(kāi)MsPaint的另一個(gè)實(shí)例,繪圖顏色仍是默認(rèn)的黑色。圖8-1單文檔界面MDI類(lèi)似于SDI應(yīng)用程序界面,但用戶可以同時(shí)打開(kāi)多個(gè)文檔,每一個(gè)文檔顯示在應(yīng)用程序主窗口客戶區(qū)的獨(dú)立窗口中??梢酝ㄟ^(guò)是否包含“窗體(Windows)”菜單項(xiàng),且該菜單中是否具有能在窗口或文檔之間進(jìn)行切換的子菜單項(xiàng),就能識(shí)別出MDI應(yīng)用程序。
MDI界面的一個(gè)示例就是WindowsExcel程序,在Excel中,可以同時(shí)打開(kāi)和使用多個(gè)文檔。在PowerPoint中,你也可以同時(shí)創(chuàng)建和打開(kāi)多個(gè)幻燈片應(yīng)用程序,電子表格中也允許用戶同時(shí)對(duì)多個(gè)圖表進(jìn)行編輯,如圖8-2所示。除了以上兩個(gè)最常用的界面樣式SDI與MDI外,第三種界面樣式變得越來(lái)越流行,這就是資源管理器樣式的界面,如圖8-3所示。圖8-2多文檔界面圖8-3資源管理器樣式界面
資源管理器樣式界面是包括有兩個(gè)窗格或者區(qū)域的一個(gè)單獨(dú)的窗口,通常是由左半部分的一個(gè)樹(shù)型的或者層次型的視圖和右半部分的一個(gè)顯示區(qū)所組成,如在MsWindows的資源管理器中所見(jiàn)到的那樣。這種樣式的界面可用于定位或?yàn)g覽大量的文檔、圖片或文件。要決定哪種界面樣式最合適,需要看應(yīng)用程序的目的。一個(gè)處理保險(xiǎn)索賠的應(yīng)用程序可能適合多文檔界面MDI樣式,因?yàn)槁殕T很可能會(huì)同時(shí)處理一個(gè)以上的索賠,或者需要對(duì)兩個(gè)索賠進(jìn)行比較。而日歷程序最好設(shè)成SDI樣式,因?yàn)椴淮笮枰瑫r(shí)打開(kāi)一個(gè)以上的日歷。
SDI樣式是Windows應(yīng)用程序較常用的布局選項(xiàng)。創(chuàng)建MDI應(yīng)用程序有一些需要單獨(dú)考慮的問(wèn)題和技巧。8.1.1多文檔界面(MDI)應(yīng)用程序
MDI允許創(chuàng)建在單個(gè)容器窗體中包含多個(gè)窗體的應(yīng)用程序,它一般包括三個(gè)部分,如圖8-4所示。
(1)主窗口:也可稱(chēng)為“MDI容器”,有可改變大小的邊框、標(biāo)題欄、系統(tǒng)菜單等。一個(gè)MDI應(yīng)用程序一般只有一個(gè)主窗口,主窗口控制著他各類(lèi)窗口。
(2)工作空間:提供對(duì)下屬M(fèi)DI子窗口的管理,每一個(gè)MDI應(yīng)用程序有一個(gè)工作空間。文檔或子窗口被包含在工作空間中,不能超出工作空間的范圍。
(3)子窗口:當(dāng)用戶打開(kāi)或創(chuàng)建一個(gè)文檔時(shí),客戶窗口便為該文檔創(chuàng)建一個(gè)子窗口。每個(gè)子窗口都有可以改變大小的邊框、標(biāo)題欄、系統(tǒng)菜單、最小最大化按鈕等。任何時(shí)刻只有一個(gè)子窗口是活動(dòng)的。圖8-4顯示在MDI主窗體工作空間內(nèi)的子窗體
思考:創(chuàng)建MDI會(huì)涉及到什么問(wèn)題呢?
首先,用戶希望能完成的任務(wù)應(yīng)是他需要一次打開(kāi)多個(gè)文檔的任務(wù);第二,應(yīng)在應(yīng)用程序中提供最常用的工具欄,例如“打開(kāi)”和“保存”文檔工具欄;第三,應(yīng)提供一個(gè)包含“窗體(W)”菜單項(xiàng)的主菜單,讓用戶可以重新定位打開(kāi)的窗口,顯示所有已打開(kāi)窗體的列表(平鋪和層疊);第四,MDI應(yīng)用程序的另一個(gè)功能是如果打開(kāi)了一個(gè)子窗口,該子窗體包含一個(gè)菜單,則該子窗體的菜單就應(yīng)集成到應(yīng)用程序的主菜單中。8.1.2創(chuàng)建MDI應(yīng)用程序要?jiǎng)?chuàng)建MDI應(yīng)用程序,請(qǐng)按照以下步驟執(zhí)行:首先要像創(chuàng)建其他應(yīng)用程序那樣,在VisualStudio中新建一個(gè)Windows應(yīng)用程序項(xiàng)目,布局好窗體。
1.創(chuàng)建MDI主窗體只需把窗體的IsMdiConhiner屬性設(shè)置為T(mén)rue即可,如圖8-5所示。
2.創(chuàng)建應(yīng)用程序的子窗體給工程添加一個(gè)新窗體。將該窗體的MDIParent屬性設(shè)置為主窗口的一個(gè)引用,該窗體就變成一個(gè)MDI的子窗體了。但需要注意:不能通過(guò)Propedies面板設(shè)置這個(gè)屬性,只能通過(guò)代碼來(lái)設(shè)置。圖8-5設(shè)置IsMdiConhiner屬性設(shè)置為T(mén)rue
【例8-1】
創(chuàng)建一個(gè)包含MDI主窗體和子窗體的項(xiàng)目。創(chuàng)建步驟:
(1)新建一個(gè)Windows應(yīng)用程序,將其名稱(chēng)設(shè)置為Demo8-1。
(2)在“解決方案資源管理器”中右擊Form1.cs,在彈出菜單上選擇“重命名”,然后將窗體的名稱(chēng)修改為MDIParent.cs。接下來(lái),將窗體的Text屬性設(shè)置為“MDIParent”,并將它的IsMdiContainer屬性設(shè)置為T(mén)rue。
VisualC#?將客戶區(qū)域變?yōu)榘祷疑?,并呈現(xiàn)下陷效果。這是MDI父窗口的標(biāo)準(zhǔn)外觀。所有可見(jiàn)的子窗口都在該區(qū)域中顯示。
(3)在菜單上選擇“項(xiàng)目”→“增加Windows窗體”,創(chuàng)建一個(gè)新的窗體。將該窗體命名為MDIChild.cs,并將其Text屬性改為Child。(4)在“解決方案資源管理器”中雙擊MDIParent.cs,在設(shè)計(jì)器中顯示父窗口。
(5)添加一個(gè)按鈕到MDIParent窗體中,雙擊按鈕訪問(wèn)它的Click事件,然后添加下列代碼:
privatevoidbutton1_Click(objectsender,EventArgse){MDIChildobjChild=newMDIChild();objChild.MdiParent=this;objChild.Show();}
代碼說(shuō)明:●第一條語(yǔ)句實(shí)例化一個(gè)新的對(duì)象,類(lèi)型為MDIChild?!褡詈笠粭l語(yǔ)句無(wú)模式地顯示該窗體。這里我們感興趣的是第二條語(yǔ)句。它將窗體的MDIParent屬性設(shè)置為當(dāng)前窗體(this總是引用當(dāng)前對(duì)象),當(dāng)前窗體是一個(gè)MDI父窗體,因?yàn)樗腎sMdiContainer屬性設(shè)置為T(mén)rue。當(dāng)顯示這樣的一個(gè)新窗體時(shí),它將作為MDI的一個(gè)子窗體。
(6)單擊工具欄上的“全部保存”。
(7)按F5鍵運(yùn)行程序。注意觀察子窗體如何顯示在父窗體的客戶區(qū)域。如果調(diào)整父窗體的大小使得一個(gè)或多個(gè)子窗體不能顯示,這時(shí)便會(huì)出現(xiàn)滾動(dòng)條(見(jiàn)圖8-6)。如果刪除了設(shè)置MDIParent屬性的語(yǔ)句,則窗體將只是浮動(dòng)在父窗體之上(因?yàn)樗辉偈亲哟绑w),因此不再顯示在父窗體的邊界之內(nèi)。
當(dāng)然,這并不是最吸引人的用戶界面,但它是一個(gè)好的開(kāi)始。在后面的案例中,我們將較全面地講述MDI應(yīng)用程序。如果你還不了解MDI窗體,不要擔(dān)心。作為VisualC#?新手,你編寫(xiě)的大多數(shù)應(yīng)用程序都將是SDI程序。當(dāng)你更熟悉一般的VisualC#?項(xiàng)目的創(chuàng)建時(shí),再開(kāi)始嘗試MDI項(xiàng)目。請(qǐng)記住,不要只是因?yàn)榭梢詣?chuàng)建MDI程序而使用MDI;只有在項(xiàng)目需要時(shí)才使用MDI。圖8-6子窗體只能顯示在主窗體的邊框之內(nèi)8.2窗體菜單設(shè)計(jì)8.2.1菜單概述及屬性菜單是Windows軟件界面設(shè)計(jì)的一個(gè)重要組成方面。它描述了一個(gè)軟件的大致功能和風(fēng)格。所以在程序設(shè)計(jì)中處理好、設(shè)計(jì)好菜單,對(duì)于一個(gè)軟件開(kāi)發(fā)是否成功有著比較重要的意義。通常Windows應(yīng)用程序中的各種任務(wù)都可以通過(guò)菜單中的命令來(lái)實(shí)現(xiàn)。傳統(tǒng)上,菜單有主菜單和快捷菜單(也可以稱(chēng)為上下文菜單)兩種。單擊菜單項(xiàng)將執(zhí)行相應(yīng)的功能,使得軟件的應(yīng)用變得更加簡(jiǎn)單,更加人性化。
VisualStudio.NET2005提供了兩種菜單控件:主菜單(MenuStrip)和上下文菜單(ContextMenuStrip),它們都在工具箱的“菜單和工具欄”下,如圖8-7所示。你可以使用集成開(kāi)發(fā)環(huán)境(IDE)來(lái)創(chuàng)建菜單,也可以編寫(xiě)代碼來(lái)創(chuàng)建菜單。但是只有在充分掌握WindowsForms菜單的實(shí)質(zhì)以后,我們才能在程序設(shè)計(jì)中得心應(yīng)手地進(jìn)行窗體菜單程序的開(kāi)發(fā)。在?.NET類(lèi)庫(kù)中,定義了一個(gè)非常龐大的基礎(chǔ)類(lèi),以供用戶在各種編程中使用。在這些類(lèi)中,有幾個(gè)專(zhuān)為用戶編寫(xiě)菜單程序所用的類(lèi),通過(guò)使用這幾個(gè)類(lèi),你可以設(shè)計(jì)出自己想要的任何菜單。菜單類(lèi)的體系結(jié)構(gòu)如圖8-8所示。圖8-7菜單控件
圖8-8菜單類(lèi)的繼承層次8.2.2MainMenu菜單控件與ContextMenu菜單控件
MenuStrip控件是VisualStudio.NET?2005和?.NETFramework中的新功能,它取代了MainMenu控件并向其中添加了新功能。MenuStrip控件支持多文檔界面(MDI)和菜單合并、工具提示和溢出。你可以通過(guò)添加訪問(wèn)鍵、快捷鍵、選中標(biāo)記、圖像和分隔條,來(lái)增強(qiáng)菜單的可用性和可讀性。表8-1顯示了MenuStrip和關(guān)聯(lián)類(lèi)的一些特別重要的屬性。表8-2顯示了重要的MenuStrip同伴類(lèi)。
ContextMenuStrip控件替換ContextMenu控件并向其添加功能;但是也可選擇保留ContextMenu控件以備向后兼容和將來(lái)使用。快捷菜單(也稱(chēng)為上下文菜單)在用戶單擊鼠標(biāo)右鍵時(shí)會(huì)出現(xiàn)在鼠標(biāo)位置??梢院苋菀椎貙ontextMenuStrip與其他控件關(guān)聯(lián)。表8-1MenuStrip和關(guān)聯(lián)類(lèi)的重要屬性表8-2MenuStrip的同伴類(lèi)1.向窗體中添加主菜單通過(guò)窗體設(shè)計(jì)器向窗體添加主菜單非常簡(jiǎn)單。只需要將MenuStrip控件拖放到窗體即可。添加了該控件后,就可以往主菜單中添加各級(jí)子菜單,最后添加代碼處理菜單項(xiàng)的選擇。
1)添加標(biāo)準(zhǔn)菜單
【例8-2】創(chuàng)建一個(gè)標(biāo)準(zhǔn)菜單。
【第一步】打開(kāi)項(xiàng)目并設(shè)置窗體。
(1)打開(kāi)【例8-1】的“MDIExample”的Windows應(yīng)用程序項(xiàng)目。
(2)在Windows窗體設(shè)計(jì)器中,選擇窗體MDIParent?!镜诙健縿?chuàng)建標(biāo)準(zhǔn)菜單。
(1)在“工具箱”中,展開(kāi)“菜單和工具欄”類(lèi)別。將一個(gè)MenuStrip控件拖放到窗體上的任何地方。
(2)右擊MenuStrip控件,然后選擇“插入標(biāo)準(zhǔn)項(xiàng)”,如圖8-9所示。MenuStrip控件會(huì)用標(biāo)準(zhǔn)菜單項(xiàng)進(jìn)行填充。提示:一定要將一個(gè)MenuStrip控件拖放到窗體上,而不是非窗體的控件上。有的控件(如GroupBox)可以有自己的菜單,如將MenuStrip控件拖放到該控件上,其結(jié)果是為控件創(chuàng)建菜單欄。圖8-9添加標(biāo)準(zhǔn)菜單2)編輯菜單項(xiàng)下面講述如何刪除剛才創(chuàng)建的標(biāo)準(zhǔn)菜單。
(1)在Windows窗體設(shè)計(jì)器中,右擊剛才添加的標(biāo)準(zhǔn)菜單項(xiàng),如“文件(F)”,然后選擇“編輯DropDownItems”,如圖8-10所示,隨后,會(huì)顯示“項(xiàng)集合編輯器”。
(2)在“項(xiàng)集合編輯器”中,逐一點(diǎn)擊菜單項(xiàng),然后單擊,如圖8-11所示,將所有菜單項(xiàng)刪除。提示:可以使用“項(xiàng)集合編輯器”進(jìn)行下列操作:刪除菜單項(xiàng)、添加菜單項(xiàng)、設(shè)置菜單項(xiàng)屬性和將菜單項(xiàng)放置于一個(gè)下拉菜單中。圖8-10選擇“編輯”圖8-11項(xiàng)集合編輯器3)添加主菜單我們繼續(xù)講述主菜單的創(chuàng)建(首先進(jìn)行第一步和第二步拖放MenuStrip控件到窗體上的操作)。
【第三步】添加菜單項(xiàng)。單擊菜單欄上的“請(qǐng)?jiān)诖颂庢I入”標(biāo)注,逐一在適當(dāng)位置輸入菜單項(xiàng)名稱(chēng),如“文件(&F)”,然后按回車(chē),如圖8-12所示。
【第四步】處理菜單項(xiàng)事件。
(1)在Windows窗體設(shè)計(jì)器中,選擇“退出”菜單。
(2)雙擊之;或在“屬性”窗體中單擊【事件】按鈕,選擇Click事件,按回車(chē)?yán)^續(xù)。圖8-12輸入菜單項(xiàng)名,設(shè)計(jì)主菜單(3)在Click方法的主窗體中輸入下列代碼:
privatevoid退出XToolStripMenuItem_Click(objectsender,EventArgse){this.Close();}
這是菜單的第一個(gè)范例,運(yùn)行代碼,運(yùn)行結(jié)果如圖8-13所示,單擊“文件”→“退出”,程序?qū)⑼顺鲞\(yùn)行。圖8-13范例運(yùn)行結(jié)果4)向ToolStripMenuItem添加增強(qiáng)功能可以采用下列方式增強(qiáng)菜單(包括MenuStrip和ContextMenuStrip)控件的可用性,如圖8-14所示?!裉砑舆x中標(biāo)記以指定打開(kāi)或關(guān)閉某項(xiàng)功能(如在“窗口”菜單上顯示哪個(gè)子窗體為當(dāng)前活動(dòng)窗體)。●添加可視化地表示菜單命令的圖像?!耧@示快捷鍵以提供代替鼠標(biāo)執(zhí)行命令的鍵盤(pán)。例如,按Ctrl+C鍵執(zhí)行Copy命令?!耧@示訪問(wèn)鍵以提供代替鼠標(biāo)進(jìn)行菜單導(dǎo)航的鍵盤(pán)。例如,按Alt+F鍵選擇“文件”菜單?!耧@示分隔線以便對(duì)相關(guān)命令進(jìn)行分組,提高菜單的可讀性。圖8-14菜單項(xiàng)增強(qiáng)效果(1)添加選中標(biāo)記。選中菜單項(xiàng),設(shè)置以下屬性:●Checked:設(shè)置為“true”,顯示菜單命令的選中標(biāo)記?!馛heckState:設(shè)置為“true”,默認(rèn)情況下為選中狀態(tài)?!馛heckOnClick:設(shè)置為“true”,顯示隨每次單擊更改狀態(tài)的選中標(biāo)記。
(2)添加圖像。將菜單項(xiàng)Image屬性設(shè)置為圖像的名稱(chēng)。如果此菜單命令的ToolStripItemDisplayStyle屬性設(shè)置為T(mén)ext或None,則無(wú)法顯示該圖像。具體操作方法為:點(diǎn)擊需要添加圖像的菜單項(xiàng),在其屬性窗體中選擇“Image”,點(diǎn)擊,打開(kāi)“選擇資源”窗體,導(dǎo)入圖像,然后單擊“確定”,如圖8-15所示。提示:圖像邊距也可以顯示選中標(biāo)記(如果您選擇)。此外,您還可以將圖像的Checked屬性設(shè)置為T(mén)rue,這樣,在運(yùn)行時(shí)顯示的圖像周?chē)鷮в幸粋€(gè)陰影框。圖8-15選擇資源窗體(3)顯示菜單項(xiàng)的快捷鍵。將菜單項(xiàng)的ShortcutKeys屬性設(shè)置為所需的鍵盤(pán)組合(如Ctrl+O鍵表示“打開(kāi)”菜單命令),并將ShowShortcutKeys屬性設(shè)置為T(mén)rue。為了顯示菜單命令的自定義快捷鍵,你需要將菜單命令的ShortcutKeyDisplayString屬性設(shè)置為所需的鍵盤(pán)組合(如Ctrl+Shift+O,而不是Shift+Ctrl+O),并將ShowShortcutKeys屬性設(shè)置為T(mén)rue。
(4)顯示菜單項(xiàng)的訪問(wèn)鍵。設(shè)置菜單命令的Text屬性時(shí),在您要為其加上下劃線以作為訪問(wèn)鍵的字母前面輸入一個(gè)“and”符(&)。例如,鍵入&Open作為菜單項(xiàng)的Text屬性將使菜單命令顯示為Open。
若要定位到此菜單命令,請(qǐng)按Alt鍵使MenuStrip得到焦點(diǎn),然后按該菜單名的訪問(wèn)鍵。當(dāng)菜單打開(kāi)并顯示帶訪問(wèn)鍵的項(xiàng)時(shí),只需按訪問(wèn)鍵就可選擇菜單命令。注意:避免定義重復(fù)的訪問(wèn)鍵,如在同一個(gè)菜單系統(tǒng)中兩次定義Alt+F。重復(fù)訪問(wèn)鍵的選擇順序無(wú)法保證。
(5)在菜單命令之間顯示分隔線。定義了MenuStrip及其包含的項(xiàng)之后,請(qǐng)使用AddRange或Add方法將菜單命令和ToolStripSeparator控件按所需順序添加到MenuStrip中。5)向MDI主窗體添加“窗體”頂級(jí)菜單
(1)添加頂級(jí)菜單項(xiàng)“窗體”。按照添加菜單項(xiàng)的方法,在菜單控件menuStrip1上添加頂級(jí)菜單項(xiàng)“窗體(&W)”。
(2)設(shè)置菜單控件menuStrip1的MdiWindowListItem。屬性為剛才添加的“窗體ToolStripMenuItem”,如圖8-16所示。
(3)處理菜單項(xiàng)事件,編寫(xiě)“新建”菜單項(xiàng)的代碼。雙擊“新建”菜單項(xiàng),在其Click事件中,編寫(xiě)新建MDI子窗體的如下代碼:
MDIChildobjChild=newMDIChild();objChild.MdiParent=this;objChild.Show();圖8-16MDI窗體的“窗體”菜單6)排列MDI子窗體
MDI應(yīng)用程序常包含對(duì)打開(kāi)的子窗體進(jìn)行操作的命令,如“層疊”、“水平平鋪”、“垂直平鋪”等,可通過(guò)LayoutMdi方法來(lái)實(shí)現(xiàn),該方法的輸入?yún)?shù)即排列的樣式,為枚舉值MDILayout,該枚舉值的成員和說(shuō)明見(jiàn)表8-3所示。
【第一步】為頂級(jí)菜單項(xiàng)“窗體”添加下級(jí)菜單項(xiàng)“層疊”、“水平平鋪”、“垂直平鋪”。
【第二步】處理菜單項(xiàng)事件。
(1)為“層疊”菜單項(xiàng)的Click事件添加如下代碼:
this.LayoutMdi(MdiLayout.Cascade);(2)為“水平平鋪”菜單項(xiàng)的Click事件添加如下代碼:
this.LayoutMdi(MdiLayout.TileHorizontal);(3)為“垂直平鋪”菜單項(xiàng)的Click事件添加如下代碼:
this.LayoutMdi(MdiLayout.TileVertical);表8-3排列MDI子窗體說(shuō)明【第三步】保存,運(yùn)行該項(xiàng)目。
(1)兩次單擊“新建”菜單項(xiàng),創(chuàng)建兩個(gè)MDI子窗體。
(2)單擊菜單“窗體”→“水平平鋪”,將顯示MDI子窗體水平平鋪的效果,如圖8-17所示。
(3)單擊菜單“窗體”→“垂直平鋪”,將顯示MDI子窗體垂直平鋪的效果。
(4)單擊菜單“窗體”→“層疊”,將顯示MDI子窗體層疊的效果。
(5)單擊菜單“窗體”→“1MDIChild”,可以切換當(dāng)前活動(dòng)的MDI子窗體。
2.向窗體中添加快捷菜單右擊計(jì)算機(jī)的桌面打開(kāi)如圖8-18所示的快捷菜單。圖8-17運(yùn)行效果
圖8-18快捷菜單ContextMenuStrip控件提供了與某個(gè)控件關(guān)聯(lián)的快捷菜單??旖莶藛螘?huì)在用戶在窗體中的控件或特定區(qū)域上單擊鼠標(biāo)右鍵時(shí)顯示。快捷菜單通常用于組合來(lái)自窗體的一個(gè)MenuStrip的不同菜單項(xiàng),便于用戶在給定應(yīng)用程序上下文中使用。例如,可以使用分配給TextBox控件的快捷菜單提供菜單項(xiàng),以便更改文本字體,在控件中查找文本或?qū)崿F(xiàn)復(fù)制和粘貼文本的剪貼板功能。還可以在快捷菜單中顯示不位于MenuStrip中的新的ToolStripMenuItem對(duì)象,從而提供與特定情況有關(guān)且不適合在MenuStrip中顯示的命令。許多可視控件(以及Form本身)都有一個(gè)Control.ContextMenuStrip屬性,該屬性將ContextMenuStrip類(lèi)綁定到顯示快捷菜單的控件。多個(gè)控件可使用一個(gè)ContextMenuStrip。
把上下文菜單控件拖放到窗體上,并給它添加菜單項(xiàng),就可以創(chuàng)建一個(gè)上下文菜單,其方式與MenuStrip控件相似,唯一的區(qū)別是上下文菜單上沒(méi)有頂級(jí)菜單項(xiàng)。為了將上下文菜單綁定到窗體的控件上,需要選擇該控件,并設(shè)置它的ContextMenuStrip屬性,使之指向剛才創(chuàng)建的上下文菜單。
【例8-3】創(chuàng)建一個(gè)使用上下文菜單的范例。
(1)新建一個(gè)Windows應(yīng)用程序,將其名稱(chēng)設(shè)置為Demo8-3。
(2)將默認(rèn)創(chuàng)建的窗體名稱(chēng)設(shè)置為frm8_3,將窗體的標(biāo)題設(shè)置為“范例8-3”。(3)在窗體frm8_3上創(chuàng)建兩個(gè)文本框控件,分別命名為txtUserID和txPWD,我們隨后會(huì)將快捷菜單附加到這兩個(gè)文本框,允許用戶清除輸入文本;并將txPWD的“PasswordChar”屬性設(shè)置為“*”。
(4)創(chuàng)建兩個(gè)標(biāo)簽,并將其Text屬性分別設(shè)置為“用戶名:”和“口令:”。
(5)創(chuàng)建上下文菜單,并輸入菜單項(xiàng)。在“工具箱”中,展開(kāi)“菜單和工具欄”類(lèi)別。將一個(gè)ContextMenuStrip控件拖動(dòng)到窗體上的任何地方。窗體底部會(huì)出現(xiàn)一個(gè)名為contextMenuStrip1的ContextMenuStrip對(duì)象,并在窗體頂部顯示另一個(gè)菜單欄,如圖8-19所示。圖8-19ContextMenuStrip控件
注意:這只是快捷菜單的臨時(shí)位置。運(yùn)行時(shí),由用戶鼠標(biāo)右鍵的位置來(lái)決定其實(shí)際顯示位置。選擇ContextMenuStrip1控件,將其命名為“contextMenuTextBox”。選擇窗體上部的ContextMenuStrip菜單的下方,單擊“請(qǐng)?jiān)诖颂庉斎搿睒?biāo)注,輸入“清除文本”,按回車(chē);然后在第2個(gè)“請(qǐng)?jiān)诖颂庉斎搿睒?biāo)注處輸入“退出”,按回車(chē)。
(6)將上下文菜單與文本框關(guān)聯(lián)。
單擊txtUserID控件,在“屬性”窗口中,將“ContextMenuStrip”屬性更改為上下文菜單的名“contextMenuTextBox”。
同樣方法,設(shè)置txtPWD控件的“ContextMenuStrip”為“contextMenuTextBox”。(7)在ContextMenuStrip的Opening事件中添加下列代碼:
privatevoidcontextMenuTextBox_Opening(objectsender,CancelEventArgse){this.Tag=((ContextMenuStrip)sender).SourceControl;}
代碼說(shuō)明:
Sender參數(shù)就是上下文菜單contextMenuTextBox對(duì)象。它包含“SourceControl”屬性,非常有用,它引用了調(diào)用上下文菜單時(shí)正在訪問(wèn)的控件。上述語(yǔ)句的作用是將當(dāng)前文本框的一個(gè)引用存儲(chǔ)到窗體的Tag屬性中。(8)返回設(shè)計(jì)視圖,在“清除文本”菜單項(xiàng)的“Click”事件中添加以下語(yǔ)句:
privatevoid清除文本ToolStripMenuItem_Click(objectsender,EventArgse){if(this.Tag.Equals(txtUserID)){txtUserID.Clear();txtUserID.Focus();}else{txtPWD.Clear();txtPWD.Focus();}}
代碼說(shuō)明:①?if語(yǔ)句是用來(lái)判斷哪個(gè)是文本框,并對(duì)其清除。②文本框的Focus方法使該文本框獲得焦點(diǎn)。需要提醒的是,右擊一個(gè)控件,則不會(huì)使它獲得焦點(diǎn)。
(9)保存項(xiàng)目,并運(yùn)行。運(yùn)行結(jié)果如圖8-20所示。
任意右擊兩個(gè)文本框,會(huì)顯示上下文菜單。
任意在文本框txtUserID上輸入字符,右擊,單擊“清除文本”,則該文本框內(nèi)容會(huì)被清除。圖8-20運(yùn)行結(jié)果8.2.3實(shí)例1:菜單制作以下程序演示菜單的常規(guī)使用。該程序顯示一個(gè)“快樂(lè)的程序員”的標(biāo)簽,可根據(jù)菜單項(xiàng)顯示在窗體的不同位置(居左、中、右),也可設(shè)置標(biāo)簽的顯示顏色。其顯示效果如圖8-21所示。創(chuàng)建步驟:
(1)新建一個(gè)Windows應(yīng)用程序項(xiàng)目,并將其命名為HappyMan。
(2)將Form1.cs重命名為frmHappys.cs;將窗體的Name屬性更改為frmHappy,并將Text屬性更改為“快樂(lè)的程序員”。
(3)單擊“視圖”→“工具箱”,為該窗體添加一個(gè)Label控件,并設(shè)置主要屬性,如表8-4所示;再為該窗體添加一個(gè)openFileDialog控件。圖8-21程序界面表8-4為L(zhǎng)abel控件設(shè)置的主要屬性(4)單擊“視圖”→“工具箱”,展開(kāi)“菜單和工具欄”類(lèi)別。將一個(gè)MenuStrip控件拖動(dòng)到窗體上的任何地方。
(5)單擊菜單欄上的“請(qǐng)?jiān)诖颂庢I入”標(biāo)注,輸入兩個(gè)頂級(jí)菜單項(xiàng),“文件(&F)”和“設(shè)置(&S)”,然后按回車(chē)。
(6)單擊“文件(&F)”菜單項(xiàng)下方顯示的“請(qǐng)?jiān)诖颂庢I入”標(biāo)注,輸入“打開(kāi)”和“關(guān)閉”兩個(gè)菜單項(xiàng);再右擊“文件(F)”菜單項(xiàng),選擇“編輯項(xiàng)”,添加一個(gè)間隔符,并點(diǎn)擊向上的箭頭將其移動(dòng)到兩個(gè)菜單項(xiàng)的中間。
(7)單擊“設(shè)置(S)”菜單項(xiàng)下方顯示的“請(qǐng)?jiān)诖颂庢I入”標(biāo)注,輸入“顏色”和“顯示位置”兩個(gè)菜單項(xiàng)。
(8)單擊“顏色”菜單項(xiàng)右方顯示的“請(qǐng)?jiān)诖颂庢I入”標(biāo)注,輸入“紅”、“藍(lán)”和“綠”三個(gè)菜單項(xiàng),并設(shè)置主要屬性,如表8-5所示。表8-5為三個(gè)菜單項(xiàng)設(shè)置的主要屬性(9)單擊“顯示位置”菜單項(xiàng)右方顯示的“請(qǐng)?jiān)诖颂庢I入”標(biāo)注,輸入“左”、“中”和“右”三個(gè)菜單項(xiàng),并設(shè)置主要屬性,如表8-6所示。
(10)返回設(shè)計(jì)視圖,單擊“打開(kāi)”菜單項(xiàng),在“屬性”窗體中單擊【事件】按鈕,選擇Click事件,雙擊,在Click事件方法中添加以下語(yǔ)句:
privatevoid打開(kāi)OToolStripMenuItem_Click(objectsender,EventArgse){//顯示openFileDialog1對(duì)話框,選定一個(gè)文本文件
this.openFileDialog1.ShowDialog();}表8-6為三個(gè)菜單項(xiàng)設(shè)置的主要屬性(11)在“關(guān)閉”菜單項(xiàng)的Click事件方法中添加以下語(yǔ)句:
privatevoid關(guān)閉CToolStripMenuItem_Click(objectsender,EventArgse){this.Close();}(12)在“紅”菜單項(xiàng)的Click事件方法中添加以下語(yǔ)句:
privatevoidmenuRed_Click(objectsender,EventArgse){//設(shè)置顏色
labCaption.ForeColor=Color.Red;//改變菜單項(xiàng)的Checked屬性
menuRed.Checked=true;menuBlue.Checked=false;menuGreen.Checked=false;}(13)在“藍(lán)”菜單項(xiàng)的Click事件方法中添加以下語(yǔ)句:
privatevoidmenuBlue_Click(objectsender,EventArgse){//設(shè)置顏色
labCaption.ForeColor=Color.Blue;//改變菜單項(xiàng)的Checked屬性
menuRed.Checked=false;menuBlue.Checked=true;menuGreen.Checked=false;}(14)在“綠”菜單項(xiàng)的Click事件方法中添加以下語(yǔ)句:
privatevoidmenuGreen_Click(objectsender,EventArgse){//設(shè)置顏色
labCaption.ForeColor=Color.Green;//改變菜單項(xiàng)的Checked屬性
menuRed.Checked=false;menuBlue.Checked=false;menuGreen.Checked=true;}(15)在“左”菜單項(xiàng)的Click事件方法中添加以下語(yǔ)句:
privatevoidmenuLeft_Click(objectsender,EventArgse){labCaption.TextAlign=ContentAlignment.MiddleLeft;
//改變菜單項(xiàng)的Checked屬性
menuLeft.Checked=true;menuMiddle.Checked=false;menuRight.Checked=false;}(16)在“中”菜單項(xiàng)的Click事件方法中添加以下語(yǔ)句:
privatevoidmenuMiddle_Click(objectsender,EventArgse){labCaption.TextAlign=ContentAlignment.MiddleCenter;//改變菜單項(xiàng)的Checked屬性
menuLeft.Checked=false;menuMiddle.Checked=true;menuRight.Checked=false;}(17)在“右”菜單項(xiàng)的Click事件方法中添加以下語(yǔ)句:
privatevoidmenuRight_Click(objectsender,EventArgse){labCaption.TextAlign=ContentAlignment.MiddleRight;//改變菜單項(xiàng)的Checked屬性
menuLeft.Checked=false;menuMiddle.Checked=false;menuRight.Checked=true;}(18)保存并生成應(yīng)用程序,執(zhí)行應(yīng)用程序。8.3窗體工具欄和狀態(tài)欄設(shè)計(jì)8.3.1工具欄設(shè)計(jì)通過(guò)菜單可以訪問(wèn)應(yīng)用系統(tǒng)中的大多數(shù)功能,把一些菜單項(xiàng)放在工具欄中和放在菜單中作用相同。放置于工具欄中的菜單項(xiàng)一般是用戶常用的選項(xiàng),例如Excel的“新建”、“打開(kāi)”和“保存”等。工具欄提供了單擊訪問(wèn)程序中功能的方式,當(dāng)然,通過(guò)工具欄訪問(wèn)程序的功能要比通過(guò)菜單來(lái)訪問(wèn)程序的功能要少—些,但用戶單擊一個(gè)一直可見(jiàn)的按鈕,要比在菜單中導(dǎo)航方便得多。圖8-22顯示了MsExcel可見(jiàn)的工具欄部分。圖8-22MsExcel工具欄
工具欄上的按鈕通常包含圖標(biāo),不包含文本,但它可以既包含圖標(biāo)又包含文本。包含文本的工具欄按鈕有MSInternetExplorer中的工具欄。如把鼠標(biāo)指針停留在工具欄中的—個(gè)按鈕上,就會(huì)顯示一個(gè)提示,說(shuō)明該按鈕的用途信息。
VisualStudio2005提供ToolStrip控件來(lái)實(shí)現(xiàn)工具欄,它在工具箱的“菜單和工具欄”下,如圖8-7所示。ToolStrip控件可創(chuàng)建易于自定義的常用工具欄,讓這些工具欄支持高級(jí)用戶界面和布局功能,如??俊⑵?、帶文本和圖像的按鈕、下拉按鈕和控件、【溢出】按鈕和ToolStrip項(xiàng)的運(yùn)行時(shí)重新排序等。ToolStrip替換了早期版本的控件并添加了功能,但是仍可以在需要時(shí)選擇保留ToolBar以備向后兼容和將來(lái)使用。與以前的控件相比,ToolStrip控件和類(lèi)提供了以下改進(jìn):●更為一致的事件模型?!癜蝿?wù)列表和項(xiàng)集合編輯器的更加一致的設(shè)計(jì)時(shí)行為?!裢ㄟ^(guò)ToolStripManager和ToolStripRenderer進(jìn)行自定義呈現(xiàn)?!窬哂蠺oolStripContainer和ToolStripPanel的內(nèi)置漂浮(在??繒r(shí)共享工具區(qū)域內(nèi)的水平或垂直空間)?!裢ㄟ^(guò)AllowItemReorder屬性在設(shè)計(jì)時(shí)和運(yùn)行時(shí)對(duì)項(xiàng)重新排序?!裢ㄟ^(guò)CanOverflow屬性將項(xiàng)重定位到溢出菜單?!窬哂蠺oolStripContainer、ToolStripPanel和ToolStripContentPanel的完全可配置的控件位置?!袷褂肨oolStripControlHost承載ToolStrip、傳統(tǒng)控件或自定義控件。●使用ToolStripPanel合并ToolStrip控件。ToolStrip控件是高度可配置的、可擴(kuò)展的控件,它提供了許多屬性、方法和事件,可用來(lái)自定義外觀和行為。表8-7為T(mén)oolStrip控件的重要成員。表8-7ToolStrip控件的重要成員
下面介紹建立工具欄的步驟。
(1)在窗體中加入控件。打開(kāi)項(xiàng)目,從工具箱的“菜單和工具欄”下將ToolStrip控件加入到主窗體中。可以發(fā)現(xiàn),該控件的默認(rèn)位置是窗體頂部。
注意:如窗體已有主菜單,有時(shí)候工具欄位于窗體頂部(在主菜單之上),設(shè)計(jì)器界面無(wú)論怎么拖位置都不改變,你可以通過(guò)在ToolStrip上右鍵“置于頂層”和“置于底層”來(lái)調(diào)整。
(2)為工具欄添加按鈕。加入的工具欄上并無(wú)按鈕,需要用戶自己添加。要添加按鈕,單擊ToolStrip控件,在彈出的圖標(biāo)上點(diǎn)向下箭頭,然后從下拉式菜單中選擇Button可添加按鈕。你還可以選擇其他種類(lèi),如分隔條、下拉框等。添加按鈕的方法如圖8-23所示。圖8-23為工具欄添加按鈕(3)為按鈕添加圖片。選擇要添加圖片的按鈕,設(shè)置其Image屬性即可。
(4)為按鈕添加提示信息。選擇按鈕,設(shè)置其ToolTipText屬性即可。
(5)將按鈕與菜單命令相鏈接。選擇按鈕,在其Click事件中,選擇相應(yīng)菜單項(xiàng)點(diǎn)擊事件。
(6)為按鈕添加事件響應(yīng)代碼。選擇按鈕,在“屬性”窗口中單擊【事件】按鈕,選擇相應(yīng)事件,雙擊進(jìn)入代碼編輯器,輸入相應(yīng)代碼即可。8.3.2狀態(tài)欄設(shè)計(jì)狀態(tài)欄通常位于窗體的底部,用于顯示當(dāng)前的狀態(tài)和一些提示信息,如按鈕和菜單的功能、鼠標(biāo)的位置等。MSWord的狀態(tài)欄如圖8-24所示,狀態(tài)欄中的面板可以用凹陷下去的部分來(lái)區(qū)分。
VisualStudio2005提供StatusStrip控件來(lái)實(shí)現(xiàn)狀態(tài)欄,它在工具箱的“菜單和工具欄”下,如前面圖8-7所示。通常,StatusStrip控件由ToolStripStatusLabel對(duì)象組成,每個(gè)這樣的對(duì)象都可以顯示文本、圖標(biāo)或同時(shí)顯示這二者。StatusStrip還可以包含ToolStripDropDownButton、ToolStripSplitButton和ToolStripProgressBar控件。圖8-24Word的狀態(tài)欄默認(rèn)StatusStrip控件沒(méi)有面板。若要向StatusStrip中添加面板,請(qǐng)使用以下方法:
System.Windows.Forms.ToolStripItemCollection.AddRange(System.Windows.Forms.ToolStripItem[])
重要的StatusStrip成員如表8-8所示。表8-8StatusStrip控件的重要成員
重要的StatusStrip伴生類(lèi)如表8-9所示。表8-9StatusStrip控件的伴生類(lèi)
下面介紹建立狀態(tài)欄的步驟。
(1)在窗體中加入控件。打開(kāi)項(xiàng)目,從工具箱的“菜單和工具欄”下將StatusStrip控件加入到主窗體中。可以發(fā)現(xiàn),該控件的默認(rèn)位置是窗體底部。
(2)為狀態(tài)欄添加子對(duì)象。加入的狀態(tài)欄上并無(wú)子對(duì)象,需要用戶自己添加。要添加子對(duì)象,單擊StatusStrip控件,在彈出的圖標(biāo)上點(diǎn)向下箭頭,然后從下拉式菜單中選擇StatusLabel可添加狀態(tài)文本。你還可以選擇其他種類(lèi),如進(jìn)度條、下拉按鈕等。添加子對(duì)象的方法如圖8-25所示。圖8-25為狀態(tài)欄添加子對(duì)象(3)為StatusLabel子對(duì)象顯示提示信息,如“廣東科學(xué)技術(shù)職業(yè)學(xué)院”。狀態(tài)欄是用于顯示提示信息的,可以通過(guò)直接設(shè)置StatusLabel子對(duì)象的Text屬性來(lái)顯示,也可編寫(xiě)代碼,使其在程序運(yùn)行時(shí)顯示提示信息。如在主窗體的Load事件中加入下列代碼:
ToolStripStatusLabel1.Text=DateTime.Today.ToShortDateString();
這樣,主窗體的狀態(tài)欄將顯示打開(kāi)主窗體的日期。注意:默認(rèn)情況下,多個(gè)提示信息間無(wú)分隔,如需要在狀態(tài)欄上分格,你只要將每個(gè)Item的BorderSides屬性設(shè)置為“右”就可以了。8.3.3實(shí)例2:制作帶工具欄和狀態(tài)欄的應(yīng)用程序以下的程序演示了工具欄和狀態(tài)欄的常規(guī)使用。
【第一步】新建一個(gè)Windows應(yīng)用程序項(xiàng)目,并將其命名為T(mén)ool-status。
【第二步】將Form1.cs重命名為frmToolStatus.cs,將窗體的Name屬性更改為frm-ToolStatus,并將Text屬性更改為“多功能工具欄和狀態(tài)欄”。
【第三步】單擊“視圖”→“工具箱”,為該窗體添加如表8-10所示的控件,并設(shè)置主要屬性。
【第四步】設(shè)置工具欄。
(1)右擊ToolStrip,選擇“插入標(biāo)準(zhǔn)項(xiàng)”。
(2)在屬性窗口中選擇Items,點(diǎn)擊。(3)在項(xiàng)集合編輯器窗體中添加一個(gè)DropDownButton,并設(shè)置它的Text屬性為“顏色”,設(shè)置DisplayStyle為T(mén)ext,如圖8-26所示。
(4)選擇DropDownItems屬性,單擊,將打開(kāi)ToolStripMenuItem的項(xiàng)集合編輯器窗體,然后加入三個(gè)菜單子項(xiàng),如表8-11所示。
(5)返回設(shè)計(jì)視圖,在菜單項(xiàng)的Click事件中添加下列代碼。在菜單項(xiàng)“紅”的Click事件中添加:
privatevoidtsMenuRed_Click(objectsender,EventArgse){rtbEdit.BackColor=Color.Red;}
在菜單項(xiàng)“藍(lán)”的Click事件中添加:
privatevoidtsMenuBlue_Click(objectsender,EventArgse){rtbEdit.BackColor=Color.Blue;}
在菜單項(xiàng)“白”的Click事件中添加:
privatevoidtsMenuWhite_Click(objectsender,EventArgse){rtbEdit.BackColor=Color.White;}表8-10frmToolStatus的控件列表圖8-26為工具欄添加子對(duì)象DropDownButton表8-11frmToolStatus的控件列表【第五步】設(shè)置狀態(tài)欄。
(1)在設(shè)計(jì)視圖中,右擊StatusStrip控件,選擇“編輯項(xiàng)”,將打開(kāi)項(xiàng)集合編輯器窗體。
(2)在項(xiàng)集合編輯器窗體中,加入三個(gè)StatusLabel。
(3)逐一為三個(gè)新添加的StatusLabel設(shè)置以下屬性,見(jiàn)表8-12。表8-12設(shè)置狀態(tài)欄StatusLabel的屬性【第六步】添加代碼,使程序運(yùn)行時(shí)狀態(tài)欄呈現(xiàn)不同的提示信息。
(1)為了讓statusLabTime顯示當(dāng)前時(shí)間件,需要在Timer控件的Tick事件中添加下列代碼:
privatevoidtimer1_Tick(objectsender,EventArgse){//在狀態(tài)欄上顯示系統(tǒng)時(shí)間
DateTimedTime=DateTime.Now;strings=dTime.ToLongTimeString();this.statusLabTime.Text=s;}(2)為了顯示當(dāng)前鼠標(biāo)位置,需要在RichTextBox控件的MouseDown事件中添加下列代碼:
privatevoidrichTextBox1_MouseDown(objectsender,MouseEventArgse){//檢查鼠標(biāo)位置,改變狀態(tài)欄
intx=Cursor.Position.X;inty=Cursor.Position.Y;this.statusLabPosition.Text="鼠標(biāo)位置X="+x.ToString()+"Y="+y.ToString();}(3)為了顯示Ins鍵的按鍵情況,需要在RichTextBox控件的KeyUp事件中添加下列代碼:
privatevoidrichTextBox1_KeyUp(objectsender,KeyEventArgse){//檢查鍵盤(pán)信息,如果是Insert就改變狀態(tài)欄的狀態(tài)
if(e.KeyCode==Keys.Insert){strings=this.statusLabKey.Text;if(s.Equals("INS"))this.statusLabKey.Text="OVR";elsethis.statusLabKey.Text="INS";}}
【第七步】保存并運(yùn)行代碼,程序運(yùn)行結(jié)果如圖8-27所示。
(1)狀態(tài)欄分別顯示鼠標(biāo)位置、當(dāng)前時(shí)間、Ins鍵的按鍵情況。
(2)按下Ins鍵,會(huì)發(fā)現(xiàn)第三欄提示信息改變?yōu)镺VR,再次按下Ins鍵,提示信息恢復(fù)為INS。
(3)單擊鼠標(biāo),會(huì)發(fā)現(xiàn)第一欄提示信息會(huì)顯示相應(yīng)鼠標(biāo)位置。
(4)按住Alt鍵不放,可拖動(dòng)tool-bar中的按鈕。
(5)單擊“顏色”→“紅”,會(huì)發(fā)現(xiàn)富文本框的背景顏色變?yōu)榧t色。圖8-27運(yùn)行結(jié)果8.4實(shí)現(xiàn)用戶界面增強(qiáng)功能8.4.1透明窗體、不規(guī)則窗體的實(shí)現(xiàn)
1.創(chuàng)建透明Windows窗體窗體有一個(gè)很酷的屬性是Opacity屬性,該屬性控制窗體及其所有控件的透明性。缺省的Opacity屬性值是100%,意味著窗體及其控件是完全不透明的(實(shí)心的),而屬性值0%表示創(chuàng)建完全透明的窗體。屬性值50%表示創(chuàng)建一個(gè)透明度在實(shí)心和不可見(jiàn)之間的窗體。
注意:因?yàn)橹挥性赪indows2000或更新的操作系統(tǒng)中才支持透明窗體,所以在較舊的操作系統(tǒng)(如Windows?98)上運(yùn)行時(shí),不論為Opacity屬性設(shè)置的值是什么,Windows窗體都是完全不透明的。
控制Windows窗體的不透明度,你可以在窗體的“屬性”窗口中,將Opacity屬性設(shè)置為一個(gè)介于0.0(完全透明)~1.0(完全不透明)之間的值;也可以編程方式控制Windows窗體的不透明度,將Opacity屬性設(shè)置為一個(gè)介于0.0(完全透明)~1.0(完全不透明)之間的百分?jǐn)?shù),Opacity屬性是Double值類(lèi)型。
【例8-4】
在下面的示例中,我們將創(chuàng)建一個(gè)窗體,點(diǎn)擊【開(kāi)始】按鈕后,該窗體逐漸透明。
(1)新建一個(gè)Windows應(yīng)用程序,將其名稱(chēng)設(shè)置為Demo8-5。
(2)將默認(rèn)窗體的標(biāo)題設(shè)置為“逐漸透明的窗體”。
(3)在主窗口中添加兩個(gè)Button控件、四個(gè)Label、一個(gè)TrackBar和一個(gè)Timer,如表8-13所示。表8-13主窗體控件添加的控件(4)點(diǎn)擊【開(kāi)始】按鈕后,該窗體逐漸透明。在button1控件的Click事件中編寫(xiě)下列代碼:
privatevoidbutton1_Click(objectsender,System.EventArgse){ //計(jì)時(shí)器開(kāi)始計(jì)時(shí)
timer1.Start();}(5)在timer1控件的Tick事件中編寫(xiě)下列代碼:
privatevoidtimer1_Tick(objectsender,System.EventArgse){//如果透明度大于0,則每次減少0.01,否則,透明度重設(shè)為1 if(this.Opacity>0){this.Opacity=(this.Opacity*100-1)/100;doublep=this.Opacity*100;label4.Text=p.ToString()+"%";}else{ this.Opacity=1; label4.Text="100%";}}(6)在button2控件的Click事件中編寫(xiě)下列代碼:
privatevoidbutton2_Click(objectsender,System.EventArgse){//計(jì)時(shí)器停止
timer1.Stop();//窗體透明度屬性還原為1this.Opacity=1;label4.Text="100%";}(7)在trackBar1控件的Scroll事件中編寫(xiě)下列代碼:
privatevoidtrackBar1_Scroll(objectsender,System.EventArgse){ //設(shè)置Timer控件的Interval屬性
timer1.Interval=trackBar1.Value; label2.Text=timer1.Interval.ToString()+"毫秒";}(8)保存項(xiàng)目,并運(yùn)行。運(yùn)行界面如圖8-28所示。圖8-28逐漸透明窗體的運(yùn)行界面2.創(chuàng)建不規(guī)則Windows窗體創(chuàng)建非矩形窗體的過(guò)程有兩個(gè)步驟:創(chuàng)建成形的窗體;編寫(xiě)某些編程邏輯的代碼以允許移動(dòng)和關(guān)閉窗體。第二個(gè)步驟是必要的,因?yàn)樽远x形狀的窗體沒(méi)有標(biāo)題欄,并且它本身不具有任何功能,例如在屏幕中移動(dòng)窗體以及關(guān)閉窗體的能力。因此,編寫(xiě)重現(xiàn)這些功能的代碼是非常必要的。創(chuàng)建非矩形窗體的過(guò)程包含三個(gè)步驟:
(1)創(chuàng)建一個(gè)作為窗體圖面的位圖。
(2)創(chuàng)建Windows應(yīng)用程序項(xiàng)目,將窗體FormBorderStyle屬性設(shè)置為“None”,并使用位圖作為窗體背景。該窗體需要設(shè)置的屬性如表8-14所示。表8-14創(chuàng)建特定形狀窗體需要設(shè)置的屬性(3)輸入重新創(chuàng)建標(biāo)題欄所提供功能的代碼,例如移動(dòng)和關(guān)閉窗體。
注意:如果監(jiān)視器的顏色深度設(shè)置大于24位,則不管TransparencyKey屬性是如何設(shè)置的,窗體的非透明部分都會(huì)產(chǎn)生顯示問(wèn)題。若要避免出現(xiàn)這種問(wèn)題,請(qǐng)確保“顯示”控制面板中的監(jiān)視器顏色深度的設(shè)置小于24位。
【例8-5】創(chuàng)建一個(gè)不規(guī)則窗體。創(chuàng)建步驟:
(1)繪制不規(guī)則窗體位圖。可以使用任意一種你喜歡的作圖工具,制作一個(gè)有形狀的位圖,背景使用一種其他的顏色。這個(gè)顏色在編程中用得著,所以最好使用一種容易記憶的顏色。如圖8-29所示,本例中使用的背景色為黃色(#ffff00/yellow),文件名為bk.bmp。圖8-29背景位圖(2)新建一個(gè)Windows應(yīng)用程序項(xiàng)目,并將其命名為Demo8-5。
(3)將Form1.cs重命名為frmNotRect.cs;將窗體的Name屬性更改為frmNotRect,并設(shè)置以下屬性:●將FormBorderStyle屬性設(shè)置為None。●將窗體的BackgroundImage屬性設(shè)置為先前創(chuàng)建的位圖文件。不必將文件添加到項(xiàng)目系統(tǒng)中,這將在指定該文件作為背景圖像時(shí)自動(dòng)完成。●將TransparencyKey屬性設(shè)置為位圖文件的背景色,本例中為黃色。(此屬性告訴應(yīng)用程序窗體中的哪些部分需要設(shè)置為透明)
這時(shí)你就可以按F5鍵測(cè)試你的程序,可以看到如圖8-29所示的窗體?,F(xiàn)在窗體還不能拖動(dòng),只能通過(guò)結(jié)束程序,或者按Alt+F4鍵關(guān)閉。下面我們編寫(xiě)相應(yīng)的代碼來(lái)實(shí)現(xiàn)標(biāo)題欄的相應(yīng)功能。
(4)設(shè)置窗體的移動(dòng)操作,我們要用到兩個(gè)全局變量:
privatePointmouseOffset; //記錄鼠標(biāo)指針的坐標(biāo)
privateboolisMouseDown=false; //記錄鼠標(biāo)按鍵是否按下
(5)為窗體的MouseDown事件創(chuàng)建一個(gè)事件處理程序。在處理程序中添加下列代碼:
privatevoidfrmNotRect_MouseDown(ob
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 廣東體育職業(yè)技術(shù)學(xué)院《電磁場(chǎng)與微波技術(shù)》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東水利電力職業(yè)技術(shù)學(xué)院《中學(xué)語(yǔ)文教材中的現(xiàn)代名著講讀》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東青年職業(yè)學(xué)院《誤差理論與測(cè)量平差基礎(chǔ)》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東女子職業(yè)技術(shù)學(xué)院《急危重癥護(hù)理學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東南華工商職業(yè)學(xué)院《企業(yè)倫理與會(huì)計(jì)職業(yè)道德》2023-2024學(xué)年第一學(xué)期期末試卷
- 【2021屆備考】2020全國(guó)名校化學(xué)試題分類(lèi)解析匯編:G單元-化學(xué)反應(yīng)速率和化學(xué)平衡
- 【2020秋備課】高中物理教案新人教版必修1-4.2-實(shí)驗(yàn)-探究加速度與力、質(zhì)量的關(guān)系
- 【同步備課】2020年高中物理人教版必修2-章末檢測(cè)卷-第7章機(jī)械能守恒定律5
- 【創(chuàng)新設(shè)計(jì)】2021高考化學(xué)總復(fù)習(xí)(江西版)作業(yè)本:熱點(diǎn)回頭專(zhuān)練3-無(wú)機(jī)化工流程題專(zhuān)項(xiàng)突破
- 人教版數(shù)學(xué)七年級(jí)上冊(cè)期末培優(yōu)專(zhuān)題-數(shù)軸上動(dòng)點(diǎn)問(wèn)題(含答案)
- 甘肅蘭州生物制品研究所筆試題庫(kù)
- 醫(yī)院改擴(kuò)建工程可行性研究報(bào)告(論證后)
- 雙方共同招工協(xié)議書(shū)(2篇)
- 2021-2022學(xué)年第二學(xué)期《大學(xué)生職業(yè)發(fā)展與就業(yè)指導(dǎo)2》學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 期末檢測(cè)試卷(試題)-2024-2025學(xué)年四年級(jí)上冊(cè)數(shù)學(xué)青島版
- 國(guó)家開(kāi)放大學(xué)電大本科《工程經(jīng)濟(jì)與管理》2023-2024期末試題及答案(試卷代號(hào):1141)
- 2024城市河湖底泥污染狀況調(diào)查評(píng)價(jià)技術(shù)導(dǎo)則
- 客車(chē)交通安全培訓(xùn)課件
- 醫(yī)院勞務(wù)外包服務(wù)方案(技術(shù)方案)
- 水工-建筑物課件
- 張克非《公共關(guān)系學(xué)》(修訂版)筆記和課后習(xí)題詳解
評(píng)論
0/150
提交評(píng)論