《Visual C# NET程序設(shè)計(jì)基礎(chǔ)》課件007_第1頁(yè)
《Visual C# NET程序設(shè)計(jì)基礎(chǔ)》課件007_第2頁(yè)
《Visual C# NET程序設(shè)計(jì)基礎(chǔ)》課件007_第3頁(yè)
《Visual C# NET程序設(shè)計(jì)基礎(chǔ)》課件007_第4頁(yè)
《Visual C# NET程序設(shè)計(jì)基礎(chǔ)》課件007_第5頁(yè)
已閱讀5頁(yè),還剩156頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論