




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第6章WinForm基礎(三)6.1消息框6.2對話框6.3圖片瀏覽器
6.1消息框
在Windows應用程序中,我們經常需要和用戶進行一些簡單的交流,這些交流的過程一般來說涉及的信息量都不是很大,操作也不復雜,對于這種類型的操作我們就不需要再單獨制作窗體了,可以直接使用系統提供的消息框。圖6-1就是一個典型的系統對話框。6.1.1語法結構MessageBox類是系統定制好的消息框類,它在使用的時候是不用實例化的,直接調用其Show()方法就可以了,其最常用的語法結構如下:MessageBox.Show(stringtext[stringcaption,MessageBoxButtonsbuttons,MessageBoxIconicon]);我們可以看到這個方法帶有4個參數,這些參數的作用是:text:必選參數,string類型,要在消息框上呈現的文本。caption:可選參數,string類型,要在消息框的標題欄中顯示的文本。buttons:可選參數,MessageBoxButtons類型,MessageBoxButtons值之一,指定在消息框中顯示哪些按鈕。表6-1列出了MessageBoxButtons的可取值及其描述。icon:可選參數,MessageBoxIcon類型,MessageBoxIcon值之一,指定在消息框中顯示哪個圖標。表6-2列出了MessageBoxIcon可取值及其描述。Show()方法的返回是DialogResult類型的,其值是DialogResult的值之一,用來確定用戶的選擇結果。表6-3列出了DialogResult的可取值及其描述。6.1.2使用消息框看起來比較復雜,但是使用起來卻非常簡單,在最簡單的情況下,我們甚至可以只給出一個參數來使用它:MessageBox.Show("HelloC#!");當然,這樣的消息框是很簡陋的,內容只是我們所給出的文本,沒有標題和圖標,所以看起來很不專業,而且只有一個“確定”按鈕,如圖6-2所示。這么簡單的消息框不要說用戶,就是開發人員都不會滿意,所以我們要給出更多的參數以制作更加專業的消息框:MessageBox.Show("HelloC#!","系統消息",MessageBoxButtons.OK,MessageBoxIcon.Information);這一次我們給出了Show()方法完整的四個參數,除了第一個參數沒有變化外,我們還添加了“系統消息”作為消息框的標題,按鈕指定采用“OK”,也就是“確定”按鈕,圖標則采用“Information”,其運行效果如圖6-3所示。這樣的消息框看起來就專業多了,但是它還是無法實現和用戶的交互操作,因此我們還需要對消息框進行更進一步的改進,這個時候改進的重點就放在了Show()方法的后兩個參數了:if(MessageBox.Show("刪除選中的電影?","系統消息",MessageBoxButtons.YesNo,MessageBoxIcon.Question)==DialogResult.Yes){//執行刪除操作}和上面的代碼相比,我們只是做了簡單的調整,按鈕由原來的“OK”變成了“YesNo”,這樣消息框中就出現了兩個按鈕,圖標也從“Information”變成了“Question”。既然是兩個按鈕,那就會有兩種反饋結果,因此我們通過一個if結構對消息框的返回進行判斷,使用的是DialogResult,如果其值為“Yes”,則說明用戶點擊了“是(Y)”按鈕,其運行效果如圖6-4所示。
6.2對話框
對話框是WinForm中另外一種交互控件,它們常用的有5個,分別是:OpenFileDialog、SaveFileDialog、ColorDialog、FontDialog和FolderBrowserDialog。這5個控件具有相似的操作、方法和屬性,它們的作用就是通過對話框的方式來實現和用戶的交互。6.2.1OpenFileDialogOpenFileDialog控件的作用是提示用戶打開文件,其常用的屬性有:FileName:獲取或設置用戶通過文件對話框所選定的文件名的字符串。FileNames:獲取對話框中所有選定文件的文件名。Filter:獲取或設置當前文件名篩選器字符串,其書寫格式為:篩選器名稱|篩選器。Multiselect:指示對話框是否允許選擇多個文件。常用的方法只有ShowDialog()這一個,即打開對話框的方法,不過在使用的時候我們都會先設置文件篩選器:openFileDialog1.Filter="文本文件(*.txt)|*.txt";openFileDialog1.ShowDialog();stringfile=openFileDialog1.FileName;在上面的代碼中,我們首先設定了文件篩選器為只能夠看到txt類型的文件,然后打開對話框,用戶選擇文件后將其放到一個string類型的變量中,其運行效果如圖6-5所示。我們發現,在上面的對話框中盡管文件夾下有很多文件,但是只有文本文件才能夠通過篩選器并顯示出來,并且默認情況下我們只能夠選擇一個文件,如果需要選擇多個文件,可以將Multiselect屬性設置為True。另一個經常碰到的問題是篩選器,如果要篩選多種類型的文件該怎么辦?例如,我們用一個對話框要求用戶打開圖片,可是圖片可以是BMP類型,也可以是JPEG或別的類型,這時篩選器就可以寫成這樣:openFileDialog1.Filter="圖片(*.bmp;*.jpg;*.png)|*.bmp;*.jpg;*.png";這樣的篩選器就可以同時篩選多種類型的文件。我們甚至可以將篩選器寫成這樣的:openFileDialog1.Filter="圖片(BMP/JPG/PNG)|*.bmp;*.jpg;*.png|文本文件(TXT/RTF/DOC)|*.txt;*.rtf;*.doc|所有文件|*.*";我們可以看到,通過一個“|”符號,我們可以同時設置多個篩選器,運行的時候系統會自動將這些篩選器進行分割,如圖6-6所示。6.2.2SaveFileDialogSaveFileDialog控件和OpenFileDialog控件很相似,常用的屬性和方法也都一樣,區別在于SaveFileDialog控件多了兩個屬性:CreatePrompt:獲取或設置一個值,該值指示如果用戶指定不存在的文件,對話框是否提示用戶允許創建該文件。OverwritePrompt:獲取或設置一個值,該值指示如果用戶指定的文件名已存在,對話框是否顯示警告。由于SaveFileDialog和OpenFileDialog對話框的使用方式是一樣的,因此這里我們不再對其做過多的討論。6.2.3ColorDialogColorDialog對話框的作用是讓用戶通過它來選擇一個顏色或者允許用戶定義自定義顏色。該對話框的常用屬性有:AllowFullOpen:指示用戶是否可以使用該對話框定義自定義顏色。Color:獲取或設置用戶選定的顏色。FullOpen:指示用于創建自定義顏色的控件在對話框打開時是否可見。打開ColorDialog對話框也是使用ShowDialog()方法:colorDialog1.ShowDialog();根據屬性設置的差別,對話框打開后的樣式也有所區別,如圖6-7所示。無論采用哪種樣式,ColorDialog對話框返回的都是一個Color對象:Colorcol=colorDialog1.Color;6.2.4FolderBrowserDialog用戶在實際的使用過程中,除了會選擇文件之外,也可能需要選擇一個文件夾,這個時候我們就需要FolderBrowserDialog對話框了,它的作用是提供一種方法,讓用戶可以瀏覽、創建并最終選擇一個文件夾。需要注意的是,該對話框只允許用戶選擇文件夾而非文件。文件夾的瀏覽通過樹控件完成,通過這個對話框我們可以選擇文件系統中的文件夾,但是不能選擇虛擬文件夾。FolderBrowserDialog對話框常用的屬性有:Description:獲取或設置對話框中在樹視圖控件上顯示的說明文本。RootFolder:獲取或設置從其開始瀏覽的起始文件夾。SelectedPath:獲取或設置用戶選定的路徑。ShowNewFolderButton:指示是否在文件夾瀏覽對話框中顯示“新建文件夾”按鈕。打開FolderBrowserDialog對話框也是使用ShowDialog()方法:folderBrowserDialog1.ShowDialog();根據屬性設置的差別,對話框打開后的樣式也有所區別,如圖6-8所示。不管采用哪種樣式,FolderBrowserDialog對話框返回的都是一個包含用戶所選擇的文件夾的字符串:stringpath=folderBrowserDialog1.SelectedPath;6.2.5FontDialogFontDialog對話框的作用是幫助用戶從本地計算機上安裝的字體中選擇一種字體,其常用屬性有:AllowScriptChange:用戶能否更改指定的字符集。AllowSimulations:指示對話框是否允許更改字體模擬。Font:獲取或設置選定的字體。ShowApply:對話框是否包含“應用”按鈕。ShowColor:對話框是否顯示顏色選擇。ShowEffects:對話框是否包含允許用戶指定刪除線、下劃線和文本顏色選項的控件。FontDialog對話框的打開方法也是ShowDialog():fontDialog1.ShowDialog();根據屬性設置的差別,對話框打開后的樣式也有所區別,如圖6-9所示。不管采用哪種樣式,FontDialog對話框都返回一個Font對象:textBox1.Font=fontDialog1.Font;
6.3圖片瀏覽器
6.3.1問題首先我們制作一個簡單的圖片瀏覽器,其運行效果如圖6-10所示。整個應用程序只有一個簡單的窗體,操作是由一個右鍵彈出菜單和兩個圖片組成的,具體要求如下:(1)窗體加載的時候不顯示任何圖片,同時“上一張”和“下一張”按鈕不可用。(2)在窗體上右鍵單擊彈出菜單,菜單包括“打開圖片”、“打開文件夾”、“圖片另存為”和“退出”。點擊“打開圖片”菜單,打開一個對話框讓用戶選擇一張JPG圖片并顯示,“上一張”和“下一張”按鈕不可用,如圖6-11所示。(3)點擊“打開文件夾”菜單,打開一個對話框讓用戶選擇一個文件夾,并顯示該文件夾下的第一張圖片,“上一張”和“下一張”按鈕變為可用,如圖6-12所示。(4)點擊“圖片另存為”菜單,打開一個對話框讓用戶選擇另存為圖片的路徑和名稱。(5)點擊“退出”菜單,關閉窗體并退出系統。6.3.2需求分析圖片瀏覽器中的大部分功能所使用到的技能點我們在前面的章節中都已經學習到了,接下來我們將從三個方面進行深入的分析。1.窗體制作本次我們制作的小程序所包含的控件并不多,表6-4中列出了所有的控件及其屬性設置。這些控件和屬性大部分我們在前面的章節中都學習過,這里需要注意的是Dock和Anchor屬性以及Splitter控件。Dock和Anchor屬性都是用來控制控件的布局的,WinForm中幾乎所有的控件都具有這兩個屬性。具體來說,我們在制作窗體的時候都會遇到這樣的問題:一旦用戶更改了窗體的大小,我們原來設計好的窗體就會變得面目全非。其原因就在于控件在窗體上定位的時候是以其左頂點的坐標為基準的,因此控件默認情況下和窗體的左邊和頂端的距離保持不變,當窗體的大小發生變化時,自然就會破壞布局。解決方法是合理地使用控件的Dock屬性和Anchor屬性。Dock屬性用來設定控件的停靠方式。所謂停靠,就是指定控件與其父控件的哪條邊對齊,同時在調整控件的父控件大小時自動調整控件的大小。例如,將Dock設置為DockStyle.Left將導致控件與其父控件的左邊緣對齊,并在父控件調整大小時調整自身大小,如圖6-13所示。Anchor屬性則是將控件綁定到容器的邊緣并確定控件隨其父控件一起調整大小。使用Anchor屬性可以定義在調整控件的父控件大小時如何自動調整控件的大小。將控件錨定到其父控件后,可確保當調整父控件的大小時錨定的邊緣與父控件的邊緣的相對位置保持不變,如圖6-14所示。需要注意的是,Anchor和Dock屬性是互相排斥的,即每次只可以設置其中的一個屬性,最后設置的屬性優先。另外一個需要注意的是Splitter控件,它是一個界面的拆分器,允許用戶調整停靠控件的大小。Splitter控件使用戶可以在運行時調整停靠到Splitter控件邊緣的控件的大小。當我們將鼠標指針移到Splitter控件上時,光標將更改以指示可以調整停靠到Splitter控件的那些控件的大小。在使用Splitter控件時,我們首先需要將希望能夠調整大小的控件停靠到一個容器的邊緣,然后將拆分器停靠到該容器的同一側。當然我們不是為了調整圖片的大小,而是為了讓圖片能夠隨著窗體一起改變,因此要將Splitter控件的Enabled屬性設定為False。2.多圖片讀取與查看在圖片瀏覽器中,有一個功能比較復雜,即“打開文件夾”功能,它需要我們將用戶所選擇的文件夾下的所有*.jpg類型的文件都找出來,并且能夠循環查看。這里的難點有兩個:如何查找文件夾下的圖片文件和如何循環查看圖片。查看某個文件夾下指定類型的文件,我們可以使用位于System.IO名稱空間下的Directory類,它提供了一個靜態方法GetFiles()可以幫助我們在指定的文件夾下查找文件,其語法結構如下:publicstaticstring[]GetFiles(stringpath[,stringsearchPattern, SearchOptionsearchOption])該方法是一個靜態方法,因此在使用的時候不需要對象,直接通過Directory類調用,它帶有三個參數:Path:string類型,所要操作的文件夾。searchPattern:string類型可選參數,文件篩選器。SearchOption:SearchOption類型可選參數,指定搜索時是否包含子目錄。該方法返回一個字符串類型的數組,也就是所有符合條件的文件的路徑。在圖片瀏覽器中,我們可以通過對話框讓用戶選擇路徑,然后使用該方法來完成對所有圖片文件的搜索:folderBrowserDialog1.ShowDialog();stringpath=folderBrowserDialog1.SelectedPath;if(!string.IsNullOrEmpty(path)){string[]files=Directory.GetFiles(path,"*.jpg");}在上面的代碼中,我們首先通過ShowDialog()方法打開了一個FolderBrowserDialog對話框,然后通過一個字符串變量來取得用戶所選擇的路徑。當然,用戶可能選擇了一個路徑,也可能沒有選擇,因此接下來我們通過一個if結構來進行判斷,判斷的方式就是通過string類所提供的靜態方法IsNullOrEmpty(),這個方法可以判斷指定的字符串是否為空。如果通過了驗證,則在接下來的代碼中通過GetFiles()方法來讀取文件信息,這里我們所采用的篩選條件是所有的jpg文件。這里我們需要格外注意searchPattern這個參數。首先,它可以使用“*”和“?”通配說明符,前者通配零個或多個字符,后者通配零個或一個字符。例如,searchPattern字符串“*t”搜索path中所有以字母“t”結尾的名稱,searchPattern字符串“s*”搜索path中所有以字母“s”開頭的名稱。另外,在searchPattern中使用星號通配符(如“*.txt”)時,擴展名長度正好為三個字符時的匹配行為與擴展名長度多余或少于三個字符時的匹配行為有所不同。文件擴展名正好是三個字符的searchPattern將返回擴展名為三個或更多字符的文件,其中前三個字符與searchPattern中指定的文件擴展名匹配。文件擴展名為一個、兩個或三個以上字符的searchPattern僅返回擴展名長度正好與searchPattern中指定的文件擴展名匹配的文件。使用問號通配符字符時,則僅返回與指定文件擴展名匹配的文件。例如,假設目錄下有兩個文件“file1.txt”和“file1.txtother”,使用“file?.txt”搜索模式時只返回第一個文件,而使用“file*.txt”搜索模式時會同時返回這兩個文件。接下來我們就需要將圖片展示出來了,這個過程我們在前面已經學習過了,通過Image類的FromFile()方法即可實現:picShowPic.Image=Image.FromFile(path);問題的焦點就在于該方法的參數上,它需要一個string類型的參數,將文件的路徑傳遞進來,而我們通過上面的GetFiles()方法獲得的是一個包含很多文件路徑的字符串數組,于是很自然地我們就想到了通過下標來提取數組中的指定路徑并顯示:picShowPic.Image=Image.FromFile(files[index]);通過變換index的值,我們就可以隨意提取數組中的某一個文件來顯示。3.圖片另存圖片的轉存是我們這個小程序中最難的一部分,其最理想的實現方式就是采用文件流的方式,即將一個圖片文件讀入到內存中的一個文件流對象中,再將這個文件流對象寫入到另一個圖片文件中,但是這已經大大超出了本章所學習的內容,因此我們需要采用文件拷貝的方式來實現。事實上,文件拷貝的實現過程也不難理解,就是將源文件通過相應的方法拷貝到用戶指定的新路徑中,從而實現另存為的功能。這里我們就要用到System.IO名稱空間下的File類了,這個類是用來進行文件操作的,在它的眾多方法中有一個Copy()方法可以用來進行文件拷貝,其語法如下:publicstaticvoidCopy(stringsourceFileName,stringdestFileName[,booloverwrite])該方法也是一個靜態方法,并且帶有三個參數:sourceFileName:string類型,要復制的源文件。destFileName:string類型,目標文件。overwrite:bool類型可選參數,是否允許覆蓋目標文件。仔細觀察這個方法我們就會發現,現在問題的焦點集中在兩個路徑上了,也就是源文件路徑和目標文件路徑。對于目標文件路徑我們通過一個SaveFileDialog對話框就可以很容易地取得,但是源文件的路徑該如何取得呢?其實在前面顯示圖片環節我們已接觸過圖片的路徑,也就是說我們在前面的操作中已經取得了源文件的路徑,只不過我們將其顯示出來后就沒再繼續使用這個路徑了,現在我們只需要將其用于這里即可。當然這需要幾個步驟,首先需要將其保存起來,方式有很多種,這里我們采用PictureBox控件Tag屬性:pictureBox1.Tag=files[index];Tag屬性主要是用來存放用戶自定義的數據,這里剛好用來存放圖片的路徑。接下來我們還要將其取出來:stringsource=pictureBox1.Tag.ToString();因為Tag屬性是一個object類型的,因此這里通過ToString()方法將其轉換為string類型的。當然,這不是唯一的辦法,通過一個全局變量或者一個Label控件也可以達到同樣的目的,這么做的原因只是讓我們多一種選擇。現在我們已經獲得了文件拷貝的所有元素,接下來就可以完成這個過程了:saveFileDialog1.ShowDialog();stringfile=saveFileDialog1.FileName;if(!string.IsNullOrEmpty(file)){stringsource=pictureBox1.Tag.ToString();File.Copy(source,file);}在上面的代碼中我們首先通過一個SaveFileDialog對話框取得用戶所要另存圖片的路徑,當然這個路徑是要經過驗證的。如果驗證通過,則將保存在PictureBox控件的Tag屬性中的源文件路徑提取出來,最后通過File類的Copy方法來完成圖片的拷貝。6.3.3實現圖片瀏覽器經過上一階段的學習,我們就可以完成圖片瀏覽器了:publicpartialclassfrmPicViewer:Form{string[]files=null;intindex=0;publicfrmPicViewer(){InitializeComponent();}//打開一張圖片privatevoidmnuOpenPic_Click(objectsender,EventArgse){dlgOpenFile.ShowDialog();stringfile=dlgOpenFile.FileName;if(!string.IsNullOrEmpty(file)){picShowPic.Image=Image.FromFile(file);picShowPic.Tag=file;lblMsg.Text="1/1";picPrev.Enabled=false;picNext.Enabled=false;}}//打開多張圖片privatevoidmnuOpenFolder_Click(objectsender,EventArgse){dlgOpenFolder.ShowDialog();stringpath=dlgOpenFolder.SelectedPath;picPrev.Enabled=true;picNext.Enabled=true;if(!string.IsNullOrEmpty(path)){files=Directory.GetFiles(path,"*.jpg");ShowPic();}}//顯示圖片privatevoidShowPic(){if(index<0)index=files.Length-1;if(index>files.Length-1)index=0;picShowPic.Image=Image.FromFile(files[index]);picShowPic.Tag=files[index];lblMsg.Text=(index+1).ToString()+"/"+(files.Length+1).ToString();}//下一張圖片privatevoidpicNext_Click(objectsender,EventArgse){index++;ShowPic();}//上一張圖片privatevoidpicPrev_Click(objectsender,EventArgse){index--;ShowPic();}//圖片另存為privatevoidmnuSaveAs_Click(objectsender,EventArgse){dlgSaveAs.ShowDialog();stringfile=dlgSaveAs.FileName;if(!string.IsNullOrEmpty(file)){
stringsource=picShowPic.Tag.ToString();File
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年國際金融理財師考試中的領導力培養與發展試題及答案
- 電機在機器學習算法的應用考核試卷
- 紙張涂裝材料考核試卷
- 珠寶首飾行業財務分析與成本控制技巧考核試卷
- 2025年【硝化工藝】模擬考試題及答案
- 崇州本地道路施工方案
- 福建事業單位考試自然資源保護知識題及答案
- 注射模具安裝方案范本
- 2024年項目管理知識更新的相關考題試題及答案
- 等離子切割機租賃考核試卷
- GB/T 3091-2025低壓流體輸送用焊接鋼管
- 豬場買賣合同協議
- 25年公司級安全培訓考試試題含答案【典型題】
- 【9語一模】2025年安徽合肥市第四十五中學九年級中考一模語文試卷(含答案)
- 啤酒分銷合同協議
- SL631水利水電工程單元工程施工質量驗收標準第2部分:混凝土工程
- 直銷隊管理制度
- 股份代持協議合同6篇
- 2024-2025學年蘇教版七年級生物下冊知識點復習提綱
- DB32-T 5082-2025 建筑工程消防施工質量驗收標準
- 室速的觀察及護理
評論
0/150
提交評論