版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第7章WinForms應(yīng)用程序?qū)υ捒蛟O(shè)計(jì)7.1對(duì)話框特點(diǎn)與分類
7.2使用系統(tǒng)定義的對(duì)話框 7.3創(chuàng)建自定義對(duì)話框7.4綜合案例:寫(xiě)字板制作 245
本章小結(jié)
練習(xí)與作業(yè)
上機(jī)部分(七)
學(xué)習(xí)目標(biāo)●了解對(duì)話框特點(diǎn)與分類●掌握系統(tǒng)定義的對(duì)話框:打開(kāi)文件對(duì)話框、保存文件對(duì)話框、字體對(duì)話框、顏色對(duì)話框等●掌握創(chuàng)建自定義對(duì)話框的方法7.1對(duì)話框特點(diǎn)與分類對(duì)話框是用戶與應(yīng)用程序之間交換信息的有效途徑之一。它是在另一個(gè)窗口中顯示的窗口,在繼續(xù)執(zhí)行程序流之前,可以讓用戶輸入一些數(shù)據(jù)。一般意義而言,有兩種形式的對(duì)話框,即模式對(duì)話框和無(wú)模式對(duì)話框,但實(shí)際使用的對(duì)話框絕大多數(shù)是有模式對(duì)話框。模式對(duì)話框是指在繼續(xù)執(zhí)行該應(yīng)用程序之前,要求用戶先響應(yīng)對(duì)話框。模式對(duì)話框通常用來(lái)顯示重要的消息,如Word的“頁(yè)面設(shè)置”對(duì)話框即是模式的。無(wú)模式的對(duì)話框在對(duì)話框顯示時(shí),允許在當(dāng)前應(yīng)用程序的其他地方繼續(xù)工作。Word中的“查找與替換”對(duì)話框就是一個(gè)無(wú)模式對(duì)話框的實(shí)例,它適用于顯示頻繁使用的命令與信息。
有模式對(duì)話框具有以下特點(diǎn):
●在一般情況下,用戶沒(méi)有必要改變對(duì)話框的大小,因此其邊框是固定的。
●為了退出對(duì)話框,必須單擊其中的某個(gè)按鈕,不能通過(guò)單擊對(duì)話框外部的某個(gè)地方關(guān)閉對(duì)話框。
●在對(duì)話框中不能有最大化按鈕(MaxButton)和最小化按鈕(MinButton),以免被意外地?cái)U(kuò)大或縮成圖標(biāo)。
●對(duì)話框中不是應(yīng)用程序的主要工作區(qū),只是臨時(shí)使用,使用后就關(guān)閉。
●對(duì)話框中控件的屬性可以在設(shè)計(jì)階段設(shè)置,但在有些情況下,必須在運(yùn)行時(shí)(即在代碼中)設(shè)置控件的屬性,因?yàn)槟承傩栽O(shè)置取決于程序中的條件判斷。
本質(zhì)上來(lái)說(shuō),對(duì)話框是一個(gè)FormBorderStyle屬性為FixedDialog的窗體。因此可以用前面所講的設(shè)計(jì)窗體的方法定制對(duì)話框;在
.NETFramework也包括預(yù)定義的對(duì)話框,如圖7-1所示。
除PrintPreviewDialog外,其余對(duì)話框類都派生于抽象基類CommonDialog,該基類定義了表7-1所示的主要方法和事件,它們對(duì)于所有的預(yù)定義對(duì)話框類來(lái)說(shuō)都是適用的。
PrintPreviewDialog是一個(gè)例外,其基類為Form,控制打印預(yù)覽,所以它并不是一個(gè)真正的對(duì)話框。OpenFileDialog和SaveFileDialog類派生于抽象基類FileDialog,該基類提供了對(duì)于打開(kāi)和關(guān)閉文件對(duì)話框來(lái)說(shuō)都相同的文件功能。圖7-1預(yù)定義的對(duì)話框表7-1CommonDialog主要的方法和事件
注意:對(duì)于公司開(kāi)發(fā)的應(yīng)用程序,應(yīng)考慮重用通用對(duì)話拒,并且應(yīng)建立定制對(duì)話框的樣式規(guī)則。盡量使建立和使用的對(duì)話框保持一致。
在
.NETFramework中,提供了Windows預(yù)定義對(duì)話框的組件,主要放在工具箱的“對(duì)話框”下。預(yù)定義對(duì)話框的組件名和意義如表7-2所示。表7-2預(yù)定義對(duì)話框的組件名和意義7.2使用系統(tǒng)定義的對(duì)話框7.2.1打開(kāi)文件對(duì)話框
OpenFileDialog組件是一個(gè)預(yù)先配置的對(duì)話框。它與Windows操作系統(tǒng)所公開(kāi)的“打開(kāi)文件”對(duì)話框相同。該控件從CommonDialog類繼承。
在基于Windows的應(yīng)用程序中可將該組件用作簡(jiǎn)單的文件選擇解決方案,而不用配置您自己的對(duì)話框。利用標(biāo)準(zhǔn)的Windows對(duì)話框,您可以創(chuàng)建其基本功能可立即為用戶所熟悉的應(yīng)用程序。但應(yīng)注意,使用OpenFileDialog組件時(shí),必須編寫(xiě)您自己的文件打開(kāi)邏輯。
將OpenFileDialog組件添加到窗體后,它出現(xiàn)在Windows窗體設(shè)計(jì)器底部的欄中,可使用ShowDialog方法在運(yùn)行時(shí)顯示該對(duì)話框;您也可以在需要時(shí)(如單擊按鈕),編寫(xiě)下列語(yǔ)句:
OpenFileDialogdlg=newOpenFileDialog();dlg.ShowDialog();
運(yùn)行這兩行代碼,得到如圖7-2所示的運(yùn)行結(jié)果??梢钥闯觯覀?cè)谡{(diào)用ShowDialog之前沒(méi)有改變類的屬性,因此出現(xiàn)了一個(gè)標(biāo)準(zhǔn)的打開(kāi)文件對(duì)話框,我們也可改變對(duì)話框的操作方式和外觀,或限制可以打開(kāi)的文件。下面介紹OpenFileDialog的公共屬性,如表7-3所示。圖7-2打開(kāi)文件對(duì)話框的運(yùn)行結(jié)果表7-3OpenFileDialog的公共屬性
使用Multiselect屬性可使用戶選擇多個(gè)要打開(kāi)的文件。另外,可使用ShowReadOnly屬性確定在對(duì)話框中是否出現(xiàn)只讀復(fù)選框。ReadOnlyChecked屬性指示是否選中只讀復(fù)選框。最后,F(xiàn)ilter屬性設(shè)置當(dāng)前文件名篩選字符串,該字符串確定出現(xiàn)在對(duì)話框的“文件類型”框中的選擇。
1.對(duì)話框的標(biāo)題
OpenFileDialog的默認(rèn)標(biāo)題是“打開(kāi)”。設(shè)置Title
屬性可以改變對(duì)話框的標(biāo)題。例如,VisualStudio2005本身為文件打開(kāi)對(duì)話框就設(shè)置了不同的標(biāo)題。
下面的代碼說(shuō)明了如何設(shè)置不同的標(biāo)題:
OpenFileDialogdlg=newOpenFileDialog();dlg.Title="文本文件";dlg.ShowDialog();2.指定目錄默認(rèn)情況下,對(duì)話框?qū)⒋蜷_(kāi)用戶在上一次運(yùn)行應(yīng)用程序時(shí)所打開(kāi)的目錄,并顯示該目錄的文件。設(shè)置InitialDirectory屬性可以改變這種設(shè)置。InitialDirectory的默認(rèn)值是一個(gè)空字符。通常情況下,在應(yīng)用程序中不應(yīng)使用硬編碼的目錄字符串,因?yàn)檫@個(gè)目錄可能在用戶的系統(tǒng)上不存在。為了獲取特定的系統(tǒng)文件夾,可以使用System.Environment類的靜態(tài)方法GetFolderPath()。該方法接受一個(gè)Environment.SpecialFolder枚舉,其中可定義要返回路徑的那個(gè)系統(tǒng)目錄。在下面的代碼范例中,把InitialDirectory設(shè)置為通用用戶目錄:
stringdir=Environment.GetFolderPath(Environment.SpecialFolder.Templates);dlg.InitialDirectory=dir;dlg.ShowDialog();3.文件過(guò)濾器
Filter屬性用來(lái)設(shè)置當(dāng)前文件名篩選器字符串,該字符串確定打開(kāi)文件對(duì)話框中的“文件類型”列表框中出現(xiàn)的選擇內(nèi)容,如圖7-3所示。下面是一個(gè)簡(jiǎn)單的篩選器字符串的示例:
文本文件|*.txt|C#文件|*.cs|所有文件|*.*"
對(duì)于每個(gè)篩選選項(xiàng),篩選器字符串都包含篩選器說(shuō)明,后接一垂直線條(|)和篩選器模式;篩選器說(shuō)明確定“文件類型”列表框顯示的“文件種類名稱”,篩選器模式表示文件的擴(kuò)展文件名。因此,照上述示例,打開(kāi)文件組件顯示3個(gè)文件類型,如圖7-3所示。圖7-3過(guò)濾器設(shè)置
需打開(kāi)的文件類型可以有多個(gè),可使用FilterIndex屬性設(shè)置第一個(gè)顯示給用戶的篩選選項(xiàng)。
FilterIndex屬性用于獲取或設(shè)置文件對(duì)話框中當(dāng)前選定篩選器的索引。在程序中設(shè)置過(guò)濾器,可使用如下代碼:
dlg.Filter="文本文件|*.txt|C#文件|*.cs|所有文件|*.*";4.有效性檢驗(yàn)
試圖打開(kāi)一個(gè)文件前,OpenFileDialog組件可執(zhí)行文件的有效性驗(yàn)證。輸入無(wú)效的文件名,則會(huì)顯示如圖7-4和圖7-5所示的提示信息。
圖7-4文件名檢驗(yàn)(1)
圖7-5文件名檢驗(yàn)(2)
有效性檢驗(yàn)需要對(duì)三個(gè)屬性進(jìn)行設(shè)置,將其全部設(shè)置為T(mén)rue。這三個(gè)屬性是:●?ValidateNames指示對(duì)話框是否只接受有效的Win32文件名。●?CheckFileExists指示如果用戶指定不存在的文件名,對(duì)話框是否顯示警告?!?CheckPathExists指示如果用戶指定不存在的路徑,對(duì)話框是否顯示警告。
5.結(jié)果
OpenFileDialog類的ShowDialog()方法返回一個(gè)DialogResult枚舉。該枚舉定義的成員有:Abort、Cancel、Ignore、No、None、OK、Retry和Yes。
默認(rèn)值是None,用戶單擊按鈕,將返回對(duì)應(yīng)的結(jié)果。對(duì)OpenFileDialog而言,則只返回DialogResult.Ok和DialogResult.Cancel。
如果用戶單擊【打開(kāi)】按鈕,選中的文件名可以使用FileName屬性來(lái)訪問(wèn);如果用戶單擊【取消】按鈕,F(xiàn)ileName屬性為一個(gè)空字符串。
6.打開(kāi)文件
用戶選定要打開(kāi)的文件后,可以使用兩種機(jī)制來(lái)打開(kāi)文件。如果希望使用文件流,則可以創(chuàng)建StreamReader類的實(shí)例。另一種方法是使用OpenFile方法打開(kāi)選定的文件。
提示:如果你希望詳細(xì)了解文件流的有關(guān)概念,請(qǐng)查閱MSDN有關(guān)文檔。
1)?使用OpenFileDialog組件以流方式打開(kāi)文件
【例7-1】下面的示例使用Button控件的Click事件處理OpenFileDialog組件的打開(kāi)文件事件。當(dāng)用戶選定某個(gè)文件并單擊“確定”后,將打開(kāi)對(duì)話框中選定的文件。文件內(nèi)容顯示在一個(gè)消息框中。
(1)新建一個(gè)Windows應(yīng)用程序,將其名稱設(shè)置為Demo7-1。
(2)將默認(rèn)創(chuàng)建的窗體名稱設(shè)置為frm7_1,將窗體的標(biāo)題設(shè)置為“范例7-1”。
(3)在主窗口中添加一個(gè)Button控件和一個(gè)OpenFileDialog控件;Button控件命名為“btnOpen”,Text屬性設(shè)置為“打開(kāi)文件”。(4)在btnOpen控件的Click事件中編寫(xiě)下列代碼:
privatevoidbtnOpen_Click(objectsender,System.EventArgse){if(openFileDialog1.ShowDialog()==DialogResult.OK){System.IO.StreamReadersr=newSystem.IO.StreamReader(openFileDialog1.FileName);MessageBox.Show(sr.ReadToEnd());sr.Close();}}
2)使用OpenFileDialog組件以文件方式打開(kāi)文件使用ShowDialog方法顯示對(duì)話框,并使用OpenFile方法打開(kāi)文件。OpenFileDialog組件的OpenFile方法返回構(gòu)成文件的字節(jié)。這些字節(jié)為您提供了一個(gè)可從中讀取的流。
【例7-2】在下面的示例中,將實(shí)例化一個(gè)具有“cursor”篩選器的OpenFileDialog組件,使用戶只能選擇具有.cur文件擴(kuò)展名的文件。如果選擇了一個(gè).cur文件,該窗體的光標(biāo)將設(shè)置為選定的光標(biāo)。
(1)新建一個(gè)Windows應(yīng)用程序,將其名稱設(shè)置為Demo7-2。
(2)將默認(rèn)創(chuàng)建的窗體名稱設(shè)置為frm7_2,將窗體的標(biāo)題設(shè)置為“范例7-2”。
(3)在主窗口中添加一個(gè)Button控件;該Button控件命名為“btnCursor”,Text屬性設(shè)置為“設(shè)置窗體光標(biāo)”。(4)?在btnCursor控件的Click事件中編寫(xiě)下列代碼:
privatevoidbtnCursor_Click(objectsender,System.EventArgse){//顯示OpenFileDialog組件,讓用戶選擇“光標(biāo)”文件
OpenFileDialogopenFileDialog1=newOpenFileDialog();openFileDialog1.Filter="CursorFiles|*.cur";openFileDialog1.Title="SelectaCursorFile";//如用戶選擇了“光標(biāo)”文件,則打開(kāi)它
if(openFileDialog1.ShowDialog()==DialogResult.OK){//對(duì)窗體的Cursor屬性設(shè)置為選定的光標(biāo)
this.Cursor=newCursor(openFileDialog1.OpenFile());}}7.2.2保存文件對(duì)話框
SaveFileDialog組件的用法類似于OpenFileDialog組件的用法,它們有很多相同的屬性。我們下面討論SaveFileDialog特有的屬性和方法。
1.文件擴(kuò)展名文件擴(kuò)展名用于把文件和應(yīng)用程序關(guān)聯(lián)起來(lái)。最好給文件添加一個(gè)擴(kuò)展名,否則Windows就不知道打開(kāi)該文件時(shí)應(yīng)使用哪個(gè)應(yīng)用程序,最終很可能用戶也會(huì)忘記應(yīng)使用何種應(yīng)用程序來(lái)打開(kāi)該文件。
AddExtension屬性是一個(gè)布爾屬性,它指示如果用戶省略擴(kuò)展名,對(duì)話框是否自動(dòng)在文件名中添加擴(kuò)展名。如果用戶已經(jīng)輸入了一個(gè)文件擴(kuò)展名,就不會(huì)添加其他擴(kuò)展名了。如果用戶輸入了文件名test,就保存文件test.txt;如果輸入了test.txt,保存的文件仍是test.txt,而非test.txt.txt。如果用戶沒(méi)有輸入文件擴(kuò)展名,則采用DefaultExt
屬性設(shè)置文件擴(kuò)展名。如果這個(gè)屬性為空,就使用當(dāng)前選擇的Filter中定義的文件擴(kuò)展名。
2.結(jié)果保存
用戶可以使用SaveFileDialog組件瀏覽文件系統(tǒng)并選擇要保存的文件。該對(duì)話框返回用戶在對(duì)話框中選定的文件的路徑和名稱。不過(guò),你必須編寫(xiě)代碼才能真正地將文件寫(xiě)入磁盤(pán)。
你可以使用SaveFileDialog組件的OpenFile方法保存文件。此方法提供了一個(gè)可以寫(xiě)入文件的Stream對(duì)象。
【例7-3】以下示例使用DialogResult屬性獲取文件的名稱,并使用OpenFile方法保存文件。
(1)新建一個(gè)Windows應(yīng)用程序,將其名稱設(shè)置為Demo7-3。
(2)將默認(rèn)創(chuàng)建的窗體名稱設(shè)置為frm7_3,將窗體的標(biāo)題設(shè)置為“范例7-3”。
(3)在主窗口中添加一個(gè)Button控件;該Button控件命名為“btnImage”,Text屬性設(shè)置為空。Image屬性設(shè)置為
.jpeg文件(也可為
.gif、.bmp類型的文件),Dock屬性設(shè)置為“Fill”,程序界面如圖7-6所示。圖7-6程序界面(4)在btnImage控件的Click事件中編寫(xiě)下列代碼:
privatevoidbtnImage_Click(objectsender,System.EventArgse){SaveFileDialogsaveFileDialog1=newSaveFileDialog();saveFileDialog1.Filter="JPegImage|*.jpg|BitmapImage|*.bmp|GifImage|*.gif";saveFileDialog1.Title="保存圖片文件";saveFileDialog1.ShowDialog();//如保存的文件名非空
if(saveFileDialog1.FileName!=""){//通過(guò)調(diào)用OpenFile方法創(chuàng)建的文件流來(lái)保存圖片
System.IO.FileStreamfs=(System.IO.FileStream)saveFileDialog1.OpenFile();//根據(jù)不同文件類型來(lái)保存圖片
switch(saveFileDialog1.FilterIndex){case1:this.btnImage.Image.Save(fs,System.Drawing.Imaging.ImageFormat.Jpeg);break;case2:this.btnImage.Image.Save(fs,System.Drawing.Imaging.ImageFormat.Bmp);break;case3:this.btnImage.Image.Save(fs,System.Drawing.Imaging.ImageFormat.Gif);break;}fs.Close();}}
代碼說(shuō)明:?jiǎn)螕魣D片按鈕時(shí),使用一個(gè)允許.gif、.jpeg和.bmp類型文件的篩選器實(shí)例化SaveFileDialog組件。如果在“保存文件”對(duì)話框中選定了此類型的文件,那么將保存按鈕的圖像。
注意:某些控件,如RichTextBox控件,具有保存文件的能力。7.2.3字體對(duì)話框
FontDialog組件是標(biāo)準(zhǔn)的Windows“字體”對(duì)話框,用于顯示系統(tǒng)上當(dāng)前安裝的字體。用戶可以使用FontDialog組件選擇字體,并可以更改字體顯示方式,例如粗細(xì)和大小。默認(rèn)情況下,該對(duì)話框顯示字體、字體樣式和字體大小的列表框;刪除線和下劃線等效果的復(fù)選框;腳本的下拉列表以及字體外觀的示例(腳本是指給定字體可用的不同字符腳本,如希伯來(lái)語(yǔ)或日語(yǔ)),如圖7-7所示。圖7-7字體對(duì)話框外觀1.顯示字體對(duì)話框
若要顯示字體對(duì)話框,請(qǐng)調(diào)用ShowDialog方法。
2.字體對(duì)話框的主要屬性
FontDialog組件具有若干可配置其外觀的屬性。用于設(shè)置對(duì)話框選擇內(nèi)容的屬性包括Font和Color,如表7-4所示。對(duì)話框中選定的字體在Font屬性中返回。因此,使用用戶選定的字體就像讀取屬性一樣簡(jiǎn)單。
字體對(duì)話框主要的公共屬性如表7-5所示。表7-4設(shè)置對(duì)話框選擇內(nèi)容的主要屬性表7-5字體對(duì)話框的主要公共屬性
【例7-4】在下面的示例中,Button控件的Click事件處理程序打開(kāi)一個(gè)FontDialog組件。當(dāng)用戶選定字體并單擊“確定”時(shí),窗體上的TextBox控件的Font屬性被設(shè)置為選定的字體。
(1)新建一個(gè)Windows應(yīng)用程序,將其名稱設(shè)置為Demo7-4。
(2)將默認(rèn)創(chuàng)建的窗體名稱設(shè)置為frm7_4,將窗體的標(biāo)題設(shè)置為“范例7-4”。
(3)在主窗口中添加一個(gè)
Button控件、一個(gè)TextBox控件、一個(gè)FontDialog組件。將Button控件的Name屬性設(shè)置為“btnFont”,Text屬性設(shè)置為“設(shè)置字體”;將TextBox控件的Text屬性設(shè)置為“學(xué)習(xí)fontDialog”。(4)在btnFont件的Click事件中編寫(xiě)下列代碼:
privatevoidbtnFont_Click(objectsender,System.EventArgse)
{
if(fontDialog1.ShowDialog()==DialogResult.OK)
{
textBox1.Font=fontDialog1.Font;
}
}
7.2.4顏色對(duì)話框
ColorDialog組件允許用戶從調(diào)色板選擇顏色以及將自定義顏色添加到該調(diào)色板。
對(duì)話框中選擇的顏色在Color屬性中返回。
對(duì)話框包括兩部分:一部分顯示基本顏色,另一部分允許用戶自定義顏色。用戶還可以通過(guò)設(shè)置ColorDialog的屬性來(lái)更改對(duì)話框的外觀,ColorDialog組件的主要屬性如表7-6所示。表7-6ColorDialog的主要屬性
ColorDialog組件的外觀設(shè)置如圖7-8所示。
使用ColorDialog組件與使用其他對(duì)話框的方法類似:
使用ShowDialog方法顯示對(duì)話框。
使用DialogResult屬性確定如何關(guān)閉對(duì)話框。
使用ColorDialog組件的Color屬性設(shè)置選定的顏色。
【例7-5】在下面的示例中,Button控件的Click事件處理程序打開(kāi)一個(gè)ColorDialog組件。當(dāng)用戶選定顏色并單擊“確定”后,Button控件的背景色將設(shè)置為選定的顏色。
(1)新建一個(gè)Windows應(yīng)用程序,將其名稱設(shè)置為Demo7-5。
(2)將默認(rèn)創(chuàng)建的窗體名稱設(shè)置為frm7_5,將窗體的標(biāo)題設(shè)置為“范例7-5”。(3)在主窗口中添加一個(gè)Button控件和一個(gè)ColorDialog組件。將Button控件的Name屬性設(shè)置為“btnColor”,Text屬性設(shè)置為“改變背景顏色”。
(4)在btnFont控件的Click事件中編寫(xiě)下列代碼:
privatevoidbtnColor_Click(objectsender,System.EventArgse){if(colorDialog1.ShowDialog()==DialogResult.OK){btnColor.BackColor=colorDialog1.Color;}}圖7-8ColorDialog組件的外觀7.2.5其他對(duì)話框(MessageBox)
除了上述預(yù)定義對(duì)話框外,我們還經(jīng)常使用其他預(yù)定義對(duì)話框,包括消息框(MessageBox)、選擇文件夾對(duì)話框(FolderBrowserDialog)等。
1.消息框
MessageBox用于向用戶顯示與應(yīng)用程序相關(guān)的信息。同時(shí),消息框也用于請(qǐng)求來(lái)自用戶的信息。
(1)在消息框中向用戶顯示信息。
調(diào)用MessageBox類的Show方法可向用戶顯示信息,代碼如下:
publicvoidPerformCalculations()
{
MessageBox.Show("電費(fèi)計(jì)算完成!");}
(2)消息框也可接受輸入。
MessageBox類的Show方法返回可用于確定用戶所做選擇的值。下列代碼演示如何調(diào)用MessageBox方法檢索來(lái)自用戶的信息,然后確定所選的值:
publicvoidExitApplication(){if(MessageBox.Show("真的要退出應(yīng)用程序嗎?","演示消息框",MessageBoxButtons.YesNo,MessageBoxIcon.Question)==DialogResult.Yes){Application.Exit();}}2.選擇文件夾對(duì)話框
FolderBrowserDialog組件用于瀏覽和選擇文件夾的模式對(duì)話框。也可以從Folder-BrowserDialog組件內(nèi)創(chuàng)建新文件夾。
同其他對(duì)話框類似,使用ShowDialog方法可在運(yùn)行時(shí)顯示FolderBrowserDialog組件。設(shè)置RootFolder屬性可確定將出現(xiàn)在對(duì)話框樹(shù)視圖內(nèi)的頂級(jí)文件夾和任何子文件夾。在顯示對(duì)話框后,您就可以使用SelectedPath屬性獲取所選文件夾的路徑。
【例7-6】
在下面的示例中,用戶可以編輯文件夾名稱,也可點(diǎn)擊按鈕后選擇輸入,文件夾名稱隨后顯示在窗體上的TextBox控件中。
(1)新建一個(gè)Windows應(yīng)用程序,將其名稱設(shè)置為Demo7-6。
(2)將默認(rèn)創(chuàng)建的窗體名稱設(shè)置為frm7_6,將窗體的標(biāo)題設(shè)置為“范例7-6”。(3)在主窗口中添加1個(gè)Button控件、1個(gè)TextBox控件和1個(gè)FolderBrowserDialog組件。將Button控件的Name屬性設(shè)置為“btnSelectFolder”,Text屬性設(shè)置為“…”;將TextBox控件的Name屬性設(shè)置為“txtPath”。
(4)在btnSelectFolder控件的Click事件中編寫(xiě)下列代碼:
privatevoidbtnSelectFolder_Click(objectsender,EventArgse){if(folderBrowserDialog1.ShowDialog()==DialogResult.OK){txtPath.Text=folderBrowserDialog1.SelectedPath;}}
(5)保存項(xiàng)目,并運(yùn)行。7.2.6實(shí)例1:對(duì)話框應(yīng)用下面通過(guò)一個(gè)實(shí)例,全面介紹上述對(duì)話框的應(yīng)用。該實(shí)例包括一個(gè)主窗口,可打開(kāi)文件、另存文件、打印預(yù)覽和打印文件,其他設(shè)置信息顯示在窗體的標(biāo)簽內(nèi)。
(1)新建一個(gè)Windows應(yīng)用程序,將其名稱設(shè)置為T(mén)estWinDialog。
(2)將默認(rèn)創(chuàng)建的窗體名稱設(shè)置為frmMain,將窗體的標(biāo)題設(shè)置為“全面掌握C#?中的對(duì)話框組件!”,這個(gè)窗體將作為主窗口。主窗體需要設(shè)置的屬性如表7-7所示。表7-7設(shè)置主窗體屬性(3)在主窗口中添加兩個(gè)Label控件和五個(gè)Button控件,分別取名為lblOutputData、lblCaption和btnOpenFileDialog、btnSaveFileDialog、btnColorDialog、btnFontDialog、btnPrintDialog,它們的屬性設(shè)置如表7-8所示,界面如圖7-9所示。再添加下列控件:PrintDocument、PrintPreviewDialog和PrintDialog,用于“打印預(yù)覽”和“打印”。圖7-9程序界面表7-8設(shè)置對(duì)話框中的控件屬性(4)程序變量申明如下:
privateFontfnt;privateColorclr;privateStringfName;privateStreamReadersr;(5)打文件,另存文件的源代碼如下:
privatevoidbtnOpenFileDialog_Click(objectsender,System.EventArgse){//定義一個(gè)“打開(kāi)文件對(duì)話框”
OpenFileDialogopenFileDialog1=newOpenFileDialog();//定義此對(duì)話框的初始化目錄
openFileDialog1.InitialDirectory="c:\\";//定義此對(duì)話框文件過(guò)濾類型
openFileDialog1.Filter="txtfiles(*.txt)|*.txt|Allfiles(*.*)|*.*";//此對(duì)話框缺省過(guò)濾類型為第2個(gè)
openFileDialog1.FilterIndex=2;openFileDialog1.RestoreDirectory=true;if(openFileDialog1.ShowDialog()==DialogResult.OK){fName=openFileDialog1.FileName;showInfo(); sr=newStreamReader(fName);}}
代碼說(shuō)明:●?ShowInfo()在后面說(shuō)明,顯示文件名。●最后一條語(yǔ)句,用指定的文件名初始化StreamReader類的新實(shí)例。
privatevoidbtnSaveFileDialog_Click(objectsender,System.EventArgse){StreammyStream;SaveFileDialogsaveFileDialog1=newSaveFileDialog();saveFileDialog1.Filter="txtfiles(*.txt)|*.txt|Allfiles(*.*)|*.*";saveFileDialog1.FilterIndex=2;saveFileDialog1.RestoreDirectory=true;if(saveFileDialog1.ShowDialog()==DialogResult.OK){if((myStream=saveFileDialog1.OpenFile())!=null){//設(shè)定“sr”對(duì)象的指針指向讀取文件流的開(kāi)始位置
sr.BaseStream.Seek(0,SeekOrigin.Begin);inti;//判斷“sr”中的指針是否指向文件流的結(jié)尾位置
while((i=sr.BaseStream.ReadByte())!=-1){//不斷地往文件中寫(xiě)入字節(jié)
myStream.WriteByte((byte)i);}myStream.Close();sr.BaseStream.Seek(0,SeekOrigin.Begin);}}}(6)在btnColorDialog的Click事件中編寫(xiě)下列代碼:
privatevoidbtnColorDialog_Click(objectsender,System.EventArgse){ColorDialogColorDialog1=newColorDialog();ColorDialog1.AllowFullOpen=true;ColorDialog1.FullOpen=true;//設(shè)定此顏色對(duì)話框存在【幫助】按鈕,缺省是沒(méi)有的
ColorDialog1.ShowHelp=true;//設(shè)定此顏色對(duì)話框的初始顏色,如果在對(duì)話框中選擇“取消”,則此對(duì)話框會(huì)重新
//設(shè)定顏色
ColorDialog1.Color=Color.DarkBlue;if(ColorDialog1.ShowDialog()!=DialogResult.Cancel){clr=ColorDialog1.Color;showInfo();}}(7)在btnFontDialog的Click事件中編寫(xiě)下列代碼:
privatevoidbtnFontDialog_Click(objectsender,System.EventArgse){FontDialogfontDialog1=newFontDialog();fontDialog1.ShowColor=true;fontDialog1.AllowScriptChange=true;fontDialog1.ShowColor=false;if(fontDialog1.ShowDialog()!=DialogResult.Cancel){fnt=fontDialog1.Font;showInfo();}}(8)在btnPrintDialog的Click事件中編寫(xiě)下列代碼:
privatevoidbtnPrintDialog_Click(objectsender,EventArgse){if(printDialog1.ShowDialog()!=DialogResult.Cancel){try{ this.printDocument1.Print();}catch(Exceptionex){ MessageBox.Show(ex.Message);}}}(9)在btnPrintPreView的Click事件中編寫(xiě)下列代碼:
privatevoidbtnPrintPreView_Click(objectsender,EventArgse){try{printPreviewDialog1.ShowDialog();} catch(Exceptionexp){System.Console.WriteLine(exp.Message.ToString());}}(10)在btnPrintPreView的Click事件中編寫(xiě)下列代碼:
privatevoidprintDocument1_PrintPage(objectsender,PrintPageEventArgse){floatlinesPerPage=0;floatyPosition=0;intcount=0;floatleftMargin=e.MarginBounds.Left;floattopMargin=e.MarginBounds.Top;stringline=null;FontprintFont=this.fnt;SolidBrushmyBrush=newSolidBrush(Color.Black);
//計(jì)算每頁(yè)的行數(shù)
linesPerPage=e.MarginBounds.Height/printFont.GetHeight(e.Graphics);//逐行打印
while(count<linesPerPage&&((line=sr.ReadLine())!=null)){//計(jì)算下一行的位置,字體高度
yPosition=topMargin+(count*printFont.GetHeight(e.Graphics));//畫(huà)出下一行
e.Graphics.DrawString(line,printFont,myBrush,leftMargin,yPosition,newStringFormat());count++;}//如還有更多的行,再打印一頁(yè)
if(line!=null)e.HasMorePages=true;elsee.HasMorePages=false;myBrush.Dispose();}(11)編寫(xiě)ShowInfo方法:
privatevoidshowInfo(){lblOutputData.Text="選擇文件:"+fName.ToString()+"\n\r\n\r";lblOutputData.Text=lblOutputData.Text+"選擇顏色:"+clr.ToString()+"\n\r\n\r";lblOutputData.Text=lblOutputData.Text+"選擇字體:"+fnt+"\n\r\n\r";}(12)保存項(xiàng)目,并運(yùn)行之。打開(kāi)一個(gè)文本文檔后,運(yùn)行界面如圖7-10所示,單擊“打印預(yù)覽”后,運(yùn)行界面如圖7-11所示。圖7-10程序運(yùn)行界面
圖7-11打印預(yù)覽界面7.3創(chuàng)建自定義對(duì)話框7.3.1自定義對(duì)話框介紹自定義對(duì)話框就是用戶所創(chuàng)建的含有控件的窗體,該窗體的FormBorderStyle屬性設(shè)置為FixedDialog,因此可以用前面所講的設(shè)計(jì)窗體的方法定制對(duì)話框的屬性。窗體上放置的控件包括命令按鈕、選取按鈕和文本框等,它們可以為應(yīng)用程序接收信息,滿足特定需求。自定義對(duì)話框的創(chuàng)建過(guò)程與普通窗體的創(chuàng)建過(guò)程基本相同,只是需要設(shè)置不同的屬性和應(yīng)用不同的方法。1.對(duì)話框窗體外觀設(shè)置定義自定義對(duì)話框的外觀具有很大的自由度。它可以是固定的或可移動(dòng)的、模式的或無(wú)模式的。它可以包含不同類型的控件。然而,對(duì)話框通常不包括菜單欄、窗口滾動(dòng)條、最小化與最大化按鈕、狀態(tài)條、或者尺寸可變的邊框。下面介紹創(chuàng)建典型類型的對(duì)話框方法。通過(guò)設(shè)置FormBorderStyle、ControlBox、MaxButton和MinButton屬性,可以刪除菜單欄等項(xiàng)目。例如,我們可以使用表7-9所示的屬性設(shè)置。表7-9典型類型的對(duì)話框的屬性設(shè)置2.顯示對(duì)話框顯示對(duì)話框的方法與顯示窗體的方法一樣。只需要編寫(xiě)加載并顯示對(duì)話框窗體的代碼。在?.NET中,窗體有一個(gè)ShowDialog方法,它可以用來(lái)顯示一個(gè)自定義對(duì)話框,使窗體符合對(duì)話框的第一個(gè)特性,語(yǔ)法如下:
FormObject.ShowDialog[owner]ShowObject是指對(duì)話框的名稱,參數(shù)Owner可以指定對(duì)話框所屬的父窗體。如果指定了父窗體,當(dāng)父窗體關(guān)閉時(shí),對(duì)話框ShowObject就會(huì)一起關(guān)閉。但參數(shù)Owner可以默認(rèn)。
例如,可以在用于顯示對(duì)話框的按鈕單擊事件中添加如下代碼:
privatevoidbutton1_Click(objectsender,System.EventArgse)
{
Form2dlg1=newForm2();
dlg1.ShowDialog();
}
3.關(guān)閉對(duì)話框
設(shè)置對(duì)話框窗體上按鈕的DialogResult屬性,可以在用戶單擊按鈕時(shí)關(guān)閉對(duì)話框并根據(jù)按鈕的DialogResult屬性設(shè)置對(duì)話框窗體的DialogResult屬性。
通常情況下,在對(duì)話框窗體上需要添加兩個(gè)按鈕,一個(gè)為【確定】或【是】按鈕,將其DialogResult屬性設(shè)置為Ok或Yes,用于執(zhí)行對(duì)話框中的代碼;另一個(gè)為【取消】或【否】按鈕,將其DialogResult屬性設(shè)置為Cancel或No,用于關(guān)閉對(duì)話框。在某些情況下,需要暫停對(duì)話框的關(guān)閉,可以將DialogResult屬性設(shè)置為DialogResult.None,代碼如下:
privatevoidbutton1_Click(objectsender,System.EventArgse)
{
this.DialogResult=DialogResult.None;
}4.檢索對(duì)話框結(jié)果關(guān)閉對(duì)話框之后,就可以從對(duì)話框獲得調(diào)用結(jié)果,調(diào)用結(jié)果有兩種:如何關(guān)閉對(duì)話框和從對(duì)話框獲取數(shù)據(jù)。
1)判斷對(duì)話框關(guān)閉原因關(guān)閉對(duì)話框后,可以通過(guò)對(duì)話框的DialogResult屬性,或引用Form.ShowDialog方法的返回值,判斷單擊哪個(gè)按鈕返回。
privatevoidbutton1_Click(objectsender,System.EventArgse)
{
Form2dlg1=newForm2();
if(dlg1.ShowDialog()==DialogResult.OK) { //所做處理
}
}2)從對(duì)話框獲取數(shù)據(jù)對(duì)話框關(guān)閉后并未從內(nèi)存中移出,因此仍然可以訪問(wèn)對(duì)話框的公共方法和屬性。例如,我們要獲取“查找對(duì)話框中”用戶輸入的字符串,可以定義一個(gè)只讀的公共屬性來(lái)返回該“查找字符串”。
PublicstringSearchString
{
get { returntextBox1.Text;
}
}
然后調(diào)用者可通過(guò)下面代碼獲取用戶的輸入字符串:
privatevoidbutton1_Click(objectsender,System.EventArgse)
{
Form2dlg1=newForm2();
if(dlg1.ShowDialog()==DialogResult.OK) { MessageBox.Show("你要查找的字符串為:"+dlg1.SearchString);
}
}7.3.2實(shí)例2:自定義對(duì)話框下面通過(guò)一個(gè)實(shí)例介紹自定義對(duì)話框的創(chuàng)建過(guò)程。該實(shí)例包括一個(gè)主窗口和一個(gè)對(duì)話框,并在主窗口中設(shè)置一個(gè)按鈕用于打開(kāi)對(duì)話框,步驟如下:
(1)新建一個(gè)Windows應(yīng)用程序,將其名稱設(shè)置為T(mén)estDialog。圖7-12程序運(yùn)行界面
(2)將默認(rèn)創(chuàng)建的窗體名稱(Name屬性)設(shè)置為frmMain,將窗體的標(biāo)題(Text屬性)設(shè)置為“主窗口”。
(3)在主窗口中添加兩個(gè)Label控件和一個(gè)Button控件,分別取名為L(zhǎng)abel1、Label2和btnDialog,其中Label1的Text屬性值為“查找范圍:”,Label2的Text屬性值為空,btnDialog的Text屬性值為“顯示選擇對(duì)話框”,界面如圖7-12所示。圖7-12程序運(yùn)行界面(4)創(chuàng)建第二個(gè)窗體作為對(duì)話框,并在“名稱”文本框中輸入frmSelect.cs。
(5)利用工具箱在第二個(gè)窗體中添加兩個(gè)Label控件、兩個(gè)DateTimePicker控件和兩個(gè)Button控件,它們的屬性設(shè)置如表7-10所示,界面如圖7-12所示。
(6)設(shè)置第二個(gè)窗體的幾個(gè)相關(guān)屬性,使其具有對(duì)話框的基本特性,具體設(shè)置內(nèi)容如表7-11所示。界面如圖7-13所示。表7-10設(shè)置對(duì)話框中的控件屬性表7-11設(shè)置第二個(gè)窗體屬性圖7-13程序運(yùn)行界面(7)為frmSelect對(duì)話框添加兩個(gè)子定義屬性:StartDate和EndDate,其中StartDate用來(lái)設(shè)置或返回起始日期的屬性,EndDate用來(lái)設(shè)置或返回結(jié)束日期的屬性。StartDate和EndDate的源代碼如下:
//定義StartDate屬性
publicSystem.DateTimeStartDate
//返回用戶在FromStart控件中選擇的日期
{
get {returnfromStart.Value.Date;}
set {
fromStart.Value=value; }
}//定義EndDate屬性publicSystem.DateTimeEndDate{
get
{
returntoEnd.Value.Date;
}
set
{
toEnd.Value=value;
}}
(8)返回到frmMain窗體,雙擊【顯示選擇對(duì)話框】按鈕,打開(kāi)代碼窗口,編寫(xiě)按鈕的Click事件,顯示自定義對(duì)話框,代碼如下:
privatevoidbtnDialog_Click(objectsender,EventArgse)
{
frmSelectdlg1=newfrmSelect();
if(dlg1.ShowDialog()==DialogResult.Yes)
{
label2.Text=dlg1.StartDate.ToShortDateString()+"--"+dlg1.EndDate.ToShortDateString();
}
else
{
label2.Text="按鍵否...";
}
}(9)按下F5鍵對(duì)上面的窗體和代碼進(jìn)行調(diào)試,出現(xiàn)“主窗口”窗口之后單擊【顯示選擇對(duì)話框】按鈕,可打開(kāi)“選擇查詢范圍”對(duì)話框,選擇起始和結(jié)束日期并單擊【確定】按鈕之后,就返回到“主窗口”窗口中,用戶選擇的日期范圍就出現(xiàn)在“查找范圍”標(biāo)簽下面。注意,當(dāng)激活“選擇查詢范圍”對(duì)話框時(shí),用戶只能在該對(duì)話框中操作,不能操作“主窗口”窗口。7.4綜合案例:寫(xiě)字板制作在上述內(nèi)容中,我們講述了文件對(duì)話框(FileDialog)、字體對(duì)話框(FontDialog)和顏色對(duì)話框(ColorDialog),其中文件對(duì)話框(FileDialog)又有:打開(kāi)文件對(duì)話框(OpenFileDialog)、保存文件對(duì)話框(SaveFileDialog)這兩個(gè)對(duì)話框。有了上述基礎(chǔ),就可以很容易地寫(xiě)出一個(gè)簡(jiǎn)單的寫(xiě)字板。下面介紹簡(jiǎn)易寫(xiě)字板的創(chuàng)建過(guò)程。具體步驟如下:
(1)新建一個(gè)Windows應(yīng)用程序,將其名稱設(shè)置為7-WordPad。
(2)將默認(rèn)創(chuàng)建的窗體名稱(Name屬性)設(shè)置為frmWordPad,將窗體的標(biāo)題(Text屬性)設(shè)置為“RichTextBox簡(jiǎn)易文本編輯器”,這個(gè)窗體將作為主窗口。(3)向窗體中添加如表7-12所示控件,工具欄的使用方法見(jiàn)第8章,本章不詳細(xì)闡述。程序的主界面如圖7-14所示。表7-12窗體frmNote中添加的控件圖7-14簡(jiǎn)易文本編輯器主界面(4)打開(kāi)代碼編輯器。
(5)程序變量聲明如下:
//變量用來(lái)保存搜索的初始位置
privateintsearchStartPosition=0;
//變量用來(lái)保存上一次搜索的字符串
privatestringstrOriginalSearch="";(6)文件新建、打開(kāi)和保存實(shí)現(xiàn)源代碼如下:
privatevoidbtnNew_Click(objectsender,EventArgse)
溫馨提示
- 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áng)區(qū)實(shí)驗(yàn)學(xué)校2024-2025學(xué)年九年級(jí)上學(xué)期第二次月考道德與法治試卷(含答案)
- Lesson 1 ~ Lesson 2 綜合測(cè)評(píng)卷(含答案)-2024-2025學(xué)年科普版(三起)英語(yǔ)五年級(jí)上冊(cè)
- 《糖尿病講義》課件
- 【名師一號(hào)】2020-2021學(xué)年高中地理湘教版必修二-第三章-區(qū)域產(chǎn)業(yè)活動(dòng)-單元檢測(cè)3
- 五年級(jí)數(shù)學(xué)(小數(shù)乘除法)計(jì)算題專項(xiàng)練習(xí)及答案匯編
- 《課時(shí)講練通》人民版歷史必修三學(xué)案-專題四-第1課-孫中山的三民主義
- 《鈦晶網(wǎng)吧策劃書(shū)》課件
- 【金版學(xué)案】2021-2022學(xué)年高一岳麓版歷史必修1習(xí)題:第5課-愛(ài)琴文明與古希臘城邦制度-
- 微信年度總結(jié)報(bào)告
- 2025年0174湖南園代碼網(wǎng)絡(luò)科技有限公司
- 2024年新疆生產(chǎn)建設(shè)兵團(tuán)第十三師淖毛湖經(jīng)濟(jì)技術(shù)開(kāi)發(fā)區(qū)管委會(huì)招聘筆試沖刺題
- 市級(jí)實(shí)施高水平醫(yī)院建設(shè)“登峰計(jì)劃”工作實(shí)施方案
- 南京航空航天大學(xué)宣傳
- 中職班主任培訓(xùn)課件
- 居民骨干培訓(xùn)課件
- 《冠脈痙攣指南》課件
- 《經(jīng)濟(jì)學(xué)方法論》課件
- 環(huán)境土壤學(xué)課件
- 《計(jì)算機(jī)組裝與維護(hù)》課件
- XX行業(yè)發(fā)展趨勢(shì)分析報(bào)告未來(lái)五年的機(jī)遇與挑戰(zhàn)ppt模板
- 馬克思中國(guó)化論文【3篇】
評(píng)論
0/150
提交評(píng)論