




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、第9章多媒體編程,本章要點: 什么是GDI+ GDI+的基本使用 用GDI+顯示文本和圖形 用GDI+操縱圖像,9.1接觸GDI+,GDI+是微軟公司為程序員提供的針對Windows平臺的新一代二維圖形系統(tǒng),利用它,程序員可以在窗體上繪制出各種各樣的圖形,或者顯示圖像。比起上一代的GDI,GDI+具有完全面向?qū)ο蟮奶卣?,它的?yōu)良設(shè)計在保證高效率的同時,還提供了非常容易使用的接口,而且有很多新的功能是傳統(tǒng)GDI望塵莫及的。這些新功能包括: 對所有圖形基元的Alpha混合支持; 消除鋸齒; 漸變填充和紋理填充; 寬線; 基數(shù)樣條; 可縮放區(qū)域; 浮點坐標(biāo); 復(fù)合線; 嵌入鋼筆; 高質(zhì)量的篩選和縮放
2、; 大量的線型和筆尖選項。,9.1.1建立自定義控件 9.1.2測試自定義的控件 下面的任務(wù)是編寫一個測試程序來查看效果。新建一個Windows窗體程序,起名為Case9_1。我們需要把剛剛生成的MyButton.dll的引用加入到現(xiàn)在的項目中,方法如下: 用鼠標(biāo)指向工具箱圖標(biāo),讓工具箱出現(xiàn),可以在任何一個選項卡上單擊鼠標(biāo)右鍵(但最好還是在“Windows窗體”上,因為要添加的控件也可以算是一個Windows窗體控件),在彈出菜單中選擇【自定義工具箱】。 在彈出的“自定義工具箱”對話框中,選擇【 .NET框架組件】頁,然后單擊【瀏覽】按鈕找到MyButton.dll文件,選擇【打開】,然后單擊
3、【確定】按鈕關(guān)閉對話框,這時在選項卡末尾發(fā)現(xiàn)新添加的GradientButton控件??梢韵袷褂闷胀丶粯影阉诺酱绑w上,這時窗體上就出現(xiàn)了帶有漸變色的按鈕GradientButton1。,由于在代碼中已編寫了處理文字的部分,現(xiàn)在就可以改變控件的Text屬性了(譬如改為“你好”),還可以改變控件的Font屬性,你會發(fā)現(xiàn)這些都被正確地處理了,字的顏色是由ForeColor屬性控制的,這也工作得很好。 如果查看“屬性”窗體的“雜項”,會發(fā)現(xiàn)兩個在Button控件中不存在的屬性:StartColor和EndColor,這是我們自定義的,它可以很好地集成到IDE中。 改變這兩個屬性,也會改變按鈕的外
4、觀。雙擊控件,一樣會彈出代碼窗口,可以輸入下面的代碼: Static iCounter As Integer = 0 Static sText As String = GradientButton1.Text iCounter += 1 GradientButton1.Text = sText & iCounter 按F5鍵運行程序,在窗體中單擊幾次控件,可以看到,雖然按鈕上的文字如我們所愿地發(fā)生著變化,但是按鈕的顏色卻在發(fā)生無法捉摸的改變,這是因為在設(shè)計時設(shè)定了按鈕的顏色是隨機變化的。,9.1.3點評:Graphics對象 這是一個比較復(fù)雜的案例,盡管它僅僅只是揭示了GDI+強大功能的冰山一
5、角。 對于繼承、自定義屬性這些內(nèi)容,在第3章中講過,你應(yīng)該不會陌生,現(xiàn)在就把精力集中到使用GDI+的部分,也就是OnPaint事件處理程序上。 從OnPaint過程的PaintEvent參數(shù)中,可以得到幾個重要的對象,其中之一就是Graphics對象: Dim g As Graphics = pe.Graphics Graphics對象是GDI+的基礎(chǔ)對象,如果把GDI+理解成一套繪圖的工具,例如筆、刷子和顏料等,那么Graphics就是畫布,一切繪圖都是發(fā)生在Graphics對象之上的。 創(chuàng)建 Graphics 對象后,可以使用它繪制線、填充形狀和繪制文本等。與 Graphics 對象一起使
6、用的主要對象如表9.1所示。,接下來要取得需要畫的區(qū)域,這樣才會知道畫的范圍有多大,一般來說,這就是控件所占的屏幕矩形的大小。不僅如此,本例中還用Inflate語句把這個矩形縮小了一點,這是因為如果畫的區(qū)域與Button大小一樣大,就看不出Button的凸起效果了,你可以試著把這一句去掉,看看會發(fā)生什么現(xiàn)象。 再接著構(gòu)造一個Brush對象,也就是畫刷: Dim bgBrush As Brush = New Drawing2D.LinearGradientBrush( _ New Point(clientRect.X, clientRect.Y), _ New Point(clientRect.
7、Width, clientRect.Height), _ StartColor, EndColor) 它很像真的畫刷,可以在畫布上畫出各種顏色,而且使用的這個LinearGradientBrush還可以刷出漸變色。,g.FillRectangle(bgBrush, clientRect) 它調(diào)用Graphics類的FillRectange方法,讓bgBrush對象在clientRect的矩形中畫上它想畫的東西,我們知道,它會畫出漸變色來。依此推廣,所有的GDI+繪圖幾乎都是這種格式,用Graphics類的某個方法(畫圓,畫方或者寫幾個字)調(diào)用某個畫筆(畫刷、字體),畫在某個地方(可能還要加上格
8、式什么的)。比如下面的畫字符串語句: g.DrawString(Me.Text, Me.Font, New SolidBrush(Me.ForeColor), clientRectF, m_textFormat) 它調(diào)用對象本身的字體,寫出對象本身的Text屬性字符串,這就是為什么在“屬性”窗體中改變這些屬性的時候,按鈕上的文字也會改變。,前面說過,一切繪圖都要發(fā)生在Graphics對象上,下面的這一句就是: 可是,在按下按鈕的時候,按鈕的顏色就會改變,這是怎么實現(xiàn)的呢?就在按鈕的OnClick事件中: Protected Overrides Sub OnClick(ByVal e As Ev
9、entArgs) MyBase.OnClick(e) Dim r As New Random() StartColor = Color.FromArgb(r.Next() EndColor = Color.FromArgb(r.Next() End Sub 把兩個隨機數(shù)分別賦給StartColor和EndColor,當(dāng)按下按鈕的時候,OnPaint事件也會被自動觸發(fā),從而導(dǎo)致按鈕被重新繪制,呈現(xiàn)出新的顏色。,9.2 更多了解GDI+的文本功能,9.2.1簡單的藝術(shù)字程序 1陰影效果 Dim textSize As SizeF Dim g As Graphics Dim shadowBrush
10、As Brush = Brushes.LightGray Dim textBrush As Brush = Brushes.Black Dim textFont As New Font(宋體, Me.nudFontSize.Value, _ FontStyle.Regular) Dim x, y As Single 在圖片框picCanvas上面建立一個新的空白Graphics g = picCanvas.CreateGraphics() g.Clear(Color.White) 得到示例文字的大小 textSize = g.MeasureString(Me.txtSampleText.Tex
11、t, textFont) 得到應(yīng)該放置示例文字的位置 x = (picCanvas.Width - textSize.Width) / 2 y = (picCanvas.Height - textSize.Height) / 2 畫出陰影 g.DrawString(txtSampleText.Text, textFont, shadowBrush, _ x + 10, y + 10) 畫出文字 g.DrawString(txtSampleText.Text, textFont, textBrush, x, y),2浮雕效果 Dim textSize As SizeF Dim g As Grap
12、hics Dim backBrush As Brush = Brushes.Black Dim textBrush As Brush = Brushes.White Dim textFont As New Font(宋體, Me.nudFontSize.Value, _ FontStyle.Regular) Dim x, y As Single 在圖片框picCanvas上面建立一個新的空白Graphics g = picCanvas.CreateGraphics() g.Clear(Color.White) 得到示例文字的大小 textSize = g.MeasureString(Me.tx
13、tSampleText.Text, textFont) 得到應(yīng)該放置示例文字的位置 x = (picCanvas.Width - textSize.Width) / 2 y = (picCanvas.Height - textSize.Height) / 2 畫出浮雕背景 g.DrawString(txtSampleText.Text, textFont, backBrush, x + 1, y + 1) 畫出文字 g.DrawString(txtSampleText.Text, textFont, textBrush, x, y),3倒影效果 Dim textSize As SizeF Di
14、m g As Graphics Dim backBrush As Brush = Brushes.LightGray Dim textBrush As Brush = Brushes.Black Dim textFont As New Font(宋體, Me.nudFontSize.Value, _ FontStyle.Regular) Dim x, y As Single Dim textHeight As Single 在圖片框picCanvas上面建立一個新的空白Graphics g = picCanvas.CreateGraphics() g.Clear(Color.White) 得到
15、示例文字的大小,textSize = g.MeasureString(Me.txtSampleText.Text, textFont) 得到應(yīng)該放置示例文字的位置 x = (picCanvas.Width - textSize.Width) / 2 y = (picCanvas.Height - textSize.Height) / 2 得到文字高度 textHeight = textFont.GetHeight(g) 將全局變換平移(x, y),也就是將坐標(biāo)原點移至(x, y), 使畫布上將要畫的所有內(nèi)容向右邊移動x,向下移動y g.TranslateTransform(x, y) g.Dr
16、awString(txtSampleText.Text, textFont, textBrush, 0, -textHeight) 將全局變量的y分量乘以-1,也就是使畫布上將要畫的所有內(nèi)容垂直翻轉(zhuǎn)180度 g.ScaleTransform(1, -1.0F) g.DrawString(txtSampleText.Text, textFont, backBrush, 0, -textHeight),4變形效果 在編寫這段代碼之前,請在窗體類定義的頂端加入一個Imports語句: Imports System.Drawing.Drawing2D 因為在代碼中會用到System.Drawing.D
17、rawing2D名稱空間中的Matrix類。 接下來還是雙擊btnTransform按鈕,在它的事件處理程序中寫下代碼: Dim textSize As SizeF Dim g As Graphics Dim textBrush As Brush = Brushes.Black Dim textFont As New Font(宋體, Me.nudFontSize.Value, _ FontStyle.Regular) Dim x, y As Single 在圖片框picCanvas上面建立一個新的空白Graphics g = picCanvas.CreateGraphics() g.Clea
18、r(Color.White), 得到示例文字的大小 textSize = g.MeasureString(Me.txtSampleText.Text, textFont) 得到應(yīng)該放置示例文字的位置 x = (picCanvas.Width - textSize.Width) / 2 y = (picCanvas.Height - textSize.Height) / 2 將全局變換平移(x, y),也就是將坐標(biāo)原點移至(x, y), 使畫布上將要畫的所有內(nèi)容向右邊移動x,向下移動y g.TranslateTransform(x, y) 做切變,將原始矩形的下邊緣水平移動矩形高度的1.0倍 D
19、im textTransform As Matrix = g.Transform textTransform.Shear(1.0, 0) g.Transform = textTransform 畫出文字 g.DrawString(txtSampleText.Text, textFont, textBrush, 0, 0),5三維效果 Dim textSize As SizeF Dim g As Graphics Dim backBrush As Brush = Brushes.Gray Dim textBrush As Brush = Brushes.Black Dim textFont As
20、 New Font(宋體, Me.nudFontSize.Value, FontStyle.Regular) Dim x, y As Single 在圖片框picCanvas上面建立一個新的空白Graphics g = picCanvas.CreateGraphics() g.Clear(Color.White) 得到示例文字的大小 textSize = g.MeasureString(Me.txtSampleText.Text, textFont) 得到應(yīng)該放置示例文字的位置 x = (picCanvas.Width - textSize.Width) / 2 y = (picCanvas.
21、Height - textSize.Height) / 2 畫出背景的3D部分 Dim i As Integer For i = 10 To 0 Step -1 g.DrawString(txtSampleText.Text, textFont, backBrush, _ x - i, y + i) Next 畫出文字 g.DrawString(txtSampleText.Text, textFont, textBrush, x, y),9.2.2程序點評 從本案例幾個文字效果的設(shè)計中可以看到,GDI+在很大程度上是把文字作為圖形來處理的,加上Brush、Font的有機配合,我們就擁有了豐富的
22、手段來制作各種各樣的文字效果。,9.3 動畫效果飛行的球,9.3.1編寫動畫 新建一個Windows窗體應(yīng)用程序Case9_3,在窗體中放置一個定時器(Timer)控件,命名為tmrAnimation,將它的Enable屬性設(shè)置為True,Interval屬性設(shè)置為20,表示每20ms觸發(fā)一個定時器事件。 隨后,可以在代碼窗口中,找到窗體Form1的類定義,在 Public Class Form1 Inherits System.Windows.Forms.Form 和 End Class 之間,加入代碼: 用來“裝”球的位圖 Dim bitmap As bitmap,x, y記載位圖的位置,
23、r代表球的半徑 Dim x, y, r As Integer offsetX和offsetY分別表示球每次沿x軸和y軸移動的距離 Dim offsetX, offsetY As Integer 位圖的寬和高 Dim bitmapWidth, bitmapHeight As Integer Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 初始化變量 r = 20 x = 1 y = 1 offsetX = 5 offsetY = 5 位圖必
24、須足夠大,不僅能容納球本身,還能遮住上一個循環(huán)中位圖留下的痕跡 bitmapWidth = 2 * r + 2 * offsetX bitmapHeight = 2 * r + 2 * offsetY,在位圖中間畫一個球 bitmap = New Bitmap(bitmapWidth, bitmapHeight) Dim g As Graphics g = Graphics.FromImage(bitmap) With g .Clear(BackColor) .FillEllipse(Brushes.Red, New Rectangle(offsetX, offsetY, 2 * r, 2 *
25、 r) .Dispose() End With End Sub Private Sub tmrAnimation_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrAnimation.Tick Dim g As Graphics = CreateGraphics() 在恰當(dāng)?shù)奈恢卯嫵鑫粓D(球) g.DrawImage(bitmap, _ x, y, bitmapWidth, bitmapHeight),g.Dispose() 如果球碰到了窗體的邊界,則令其反彈 If x + bitmapWid
26、th = ClientSize.Width Or x = ClientSize.Height Or y = 0 Then offsetY = -offsetY End If 改變球的位置,以產(chǎn)生運動 x += offsetX y += offsetY End Sub,9.3.2幾個程序設(shè)計技巧 產(chǎn)生運動圖像本身并不難,事實上,讓球“動起來”的代碼僅僅只有三句而已。首先是畫出球: g.DrawImage(bitmap, _ x, y, bitmapWidth, bitmapHeight) 其次是改變球的坐標(biāo),在下一次畫出球的時候,球就“動”了: x += offsetX y += offsetY
27、 然而,有許多細(xì)節(jié)需要考慮,這就是程序中其他代碼做的工作。主要需要處理的問題有兩個:,1邊界問題 當(dāng)球到達窗體的邊界時,應(yīng)該讓它反彈回來。為了達到這種效果,在畫出球之后,要檢測球是否到達了窗體的邊界: If x + bitmapWidth = ClientSize.Width Or x = ClientSize.Height Or y = 0 Then offsetY = -offsetY End If 如果x + bitmapWidth大于窗體的寬度,也就是說,位圖的右邊已經(jīng)到窗體的右邊界之外了?;蛘?,如果x小于等于0了,也就是說,位圖的左邊已經(jīng)到了窗體的左邊界之外了。這時就要讓球在水平方向
28、上回轉(zhuǎn),也就是改變offsetX的符號。這樣當(dāng)下一個x += offsetX執(zhí)行的時候,加變成了減,減變成了加,球也就乖乖地回頭了。 在垂直方向的情況也是一樣,當(dāng)位圖的下邊到達了窗體的下邊界之外,或者位圖的上邊到達了窗體的上邊界之外的時候,就需要改變offsetY的符號,讓球在垂直方向上回頭。,2軌跡問題 由于在程序中我們已經(jīng)解決了這個問題,所以你可能不知道軌跡問題會帶來什么樣的結(jié)果,那么請將Form1_Load過程中,在位圖對象中間畫圓的語句從原來的 With g .Clear(BackColor) .FillEllipse(Brushes.Red, New Rectangle(offset
29、X, offsetY, 2 * r, 2 * r) .Dispose() End With 改成: With g .Clear(BackColor) .FillEllipse(Brushes.Red, New Rectangle(0, 0, 2 * r, 2 * r) .Dispose() End With 然后再運行程序,就會看到如圖9.12所示的畫面。,在球走過的地方,留下了軌跡,這是為什么呢?其實,這是很自然的,因為當(dāng)GDI+在窗體中畫了一個球以后,并沒有把這個球抹掉,而此后一次一次地畫球,圖像也都保留了下來,于是就產(chǎn)生了我們看到的現(xiàn)象。 那么,為什么原來的程序中就沒有留下軌跡呢?那就要
30、看程序中初始化bitmapWidth 和bitmapHeight的代碼了: 位圖必須足夠大,不僅能容納球本身,還能遮住上一個循環(huán)中位圖留下的痕跡 bitmapWidth = 2 * r + 2 * offsetX bitmapHeight = 2 * r + 2 * offsetY bitmap是用來容納球的,應(yīng)該說,其寬度和高度只要有球的直徑那么大,也就是“2 * r”就夠了,為什么要加上一個“2 * offsetX”和“2 * offsetY”呢?請看原來程序中,把球畫在bitmap中的語句: With g .Clear(BackColor) .FillEllipse(Brushes.Re
31、d, New Rectangle(offsetX, offsetY, 2 * r, 2 * r) .Dispose() End With,其中FillEllipse語句把球畫在bitmap的中間,讓球離bitmap的左邊界有offsetX的距離,離bitmap的上邊界有offsetY的距離。由于bitmap的寬“2 * r + 2 * offsetX”,所以這時球離bitmap的右邊界的距離是offsetX,而又因為bitmap的高是“2 * r + 2 * offsetY”,所以球離bitmap的下邊界的距離是offsetY。換句話說,在球的左右留出了寬度為offsetX的邊,在球的上下留出
32、了寬度為offsetY的邊,而這個邊的顏色與窗體顏色相同。 由于有這樣一道邊,當(dāng)GDI+把bitmap畫在窗體上的時候,就剛好可以遮蔽掉上一次留下的痕跡,于是,在球運動的過程中就沒有軌跡出現(xiàn)了。但是,當(dāng)把代碼改成 With g .Clear(BackColor) .FillEllipse(Brushes.Red, New Rectangle(0, 0, 2 * r, 2 * r) .Dispose() End With 的時候,bitmap的效果如圖9.14所示。,9.4動畫效果眨動的眼睛,在上一節(jié)中,展示了如何通過連續(xù)地在不同的位置畫出同一個圖像來達到動畫效果,這并不是達到動畫唯一的途徑。通
33、過在同一個位置連續(xù)地畫不同的圖像,也可以產(chǎn)生動畫效果,這就是本節(jié)所要采用的方法。,9.4.1準(zhǔn)備工作 9.4.2編寫動畫,9.5 操縱圖像,GDI+不僅提供了繪圖的功能,而且也提供了很多圖像操縱功能,例如翻轉(zhuǎn)、縮放和剪切等,這些功能使用起來都很方便。而且Windows Forms把它們包裝在PictureBox控件中,讓我們使用起來更加方便了。 本節(jié)中將要展示如何利用PictureBox以及GDI+來實現(xiàn)圖像的翻轉(zhuǎn)、縮放和剪切。完成這一切所需要做的工作非常簡單,這也顯示了GDI+強大的功能。,9.5.1簡單的圖像處理窗體 新建一個Windows窗體應(yīng)用程序Case9_5,在窗體中放置4個按鈕控
34、件,屬性設(shè)置如表9.3所示。這4個按鈕將分別完成它們所標(biāo)示的功能。 接下來放入一個群組(GroupBox)控件,設(shè)置它的Text屬性為“剪切圖像”。在這個控件的區(qū)域內(nèi),放入4個文本框,屬性設(shè)置如表9.4所示。它們是給用戶來確定剪切區(qū)域的,也可以給它們加上標(biāo)簽?,F(xiàn)在在GroupBox中放入兩個按鈕,屬性設(shè)置如表9.5所示。,窗體布局,1向左旋轉(zhuǎn) 雙擊“向左旋轉(zhuǎn)”按鈕,在它的事件處理程序中寫入以下代碼: picImage.Image.RotateFlip(RotateFlipType.Rotate270FlipNone) picImage.Refresh() 這一段代碼讓圖像向右旋轉(zhuǎn)270(也就相
35、當(dāng)于向左旋轉(zhuǎn)90),然后刷新圖片框,讓新的圖像顯示出來。在GDI+中提供的圖像旋轉(zhuǎn)一律都是向右旋轉(zhuǎn),所以要實現(xiàn)向左旋轉(zhuǎn)的功能,需要做這樣一個小小的替換。這時就可以使用“向左旋轉(zhuǎn)”功能了,按F5鍵運行程序,然后在窗體上用鼠標(biāo)單擊【向左旋轉(zhuǎn)】按鈕,得到的效果如圖9.18所示。如果繼續(xù)單擊【向左旋轉(zhuǎn)】按鈕,圖像也會繼續(xù)旋轉(zhuǎn)。,2向右旋轉(zhuǎn) 與“向左旋轉(zhuǎn)”幾乎相同,只是代碼改成向右旋轉(zhuǎn)90: picImage.Image.RotateFlip(RotateFlipType.Rotate90FlipNone) picImage.Refresh() 按F5鍵運行程序,然后在窗體上用鼠標(biāo)單擊【向右旋轉(zhuǎn)】按鈕。
36、,3放大 雙擊“放大”按鈕,在它的事件處理程序中寫入以下代碼: picImage.SizeMode = PictureBoxSizeMode.StretchImage picImage.Width = CInt(picImage.Width * 1.25) picImage.Height = CInt(picImage.Height * 1.25) 首先把圖片框picImage的定位方式設(shè)置為StretchImage,也就是拉扯圖像,強迫圖像與圖片框一樣大。接下來,把圖片框的寬度和高度都放大到原來的1.25倍,這樣圖像也會被拉扯到原來的1.25倍。按F5鍵運行程序,用鼠標(biāo)單擊【放大】按鈕,效果
37、如圖9.20所示。,4縮小 與“放大”幾乎相同,只是將圖片框的寬度和高度都改成原來的0.8倍: picImage.SizeMode = PictureBoxSizeMode.StretchImage If picImage.Width 3 And picImage.Height 3 Then picImage.Width = CInt(picImage.Width * 0.8) picImage.Height = CInt(picImage.Height * 0.8) End If 按F5鍵運行程序,然后在窗體上用鼠標(biāo)單擊【縮小】按鈕,效果如圖9.21所示。,5剪切預(yù)覽 剪切預(yù)覽功能可以在用戶
38、確定的剪切區(qū)域上顯示一個紅色方框,讓用戶可以看到剪切區(qū)域和剪切以后的效果。 雙擊“預(yù)覽”按鈕,在它的事件處理程序中寫入以下代碼: 在剪切區(qū)域畫一個紅色的方框 Dim recCropBox As New Rectangle(CInt(txtX.Text), _ CInt(txtY.Text), CInt(txtW.Text), CInt(txtH.Text) picImage.CreateGraphics.DrawRectangle(Pens.Red, recCropBox) 代碼首先取得用戶所選定的方框,用用戶輸入的4個參數(shù)來建立一個Rectangle(矩形)對象,然后在這個矩形框邊上畫上紅色
39、。,6剪切 剪切也就是把圖像的某一部分剪掉,只保留另外一部分。在這個程序中,用戶輸入的4個參數(shù)就是用來表示應(yīng)該保留哪一部分的。 雙擊“剪切”按鈕,在它的事件處理程序中寫入以下代碼: 記錄剪切區(qū)域 Dim recCrop As New Rectangle(CInt(txtX.Text), _ CInt(txtY.Text), CInt(txtW.Text), CInt(txtH.Text) 生成一個新的Bitmap,將把剪切后的圖像畫到這里 Dim bmpCropped As New Bitmap(CInt(txtW.Text), CInt(txtH.Text) 得到一個新的Graphics對象
40、 Dim grBitmap As Graphics = Graphics.FromImage(bmpCropped) 把原始圖像在recCrop中的部分畫到bmpCropped上 grBitmap.DrawImage(picImage.Image, 0, 0, recCrop, GraphicsUnit.Pixel) 把新的bitmap放到picImage中 picImage.Image = bmpCropped 這段代碼首先記錄下用戶選擇的方框,用用戶輸入的4個參數(shù)建立一個矩形對象。,然后建立一個新的Bitmap來放置剪切以后的圖像;接下來就把原始圖像應(yīng)該保留的部分畫到新的Bitmap中,最
41、后把新的Bitmap放回到圖片框中。換句話說,程序并沒有真的“剪”和“切”圖像,而只是新畫了一幅而已。 按F5鍵運行程序,設(shè)置剪切參數(shù)為X = 0、Y= 0、寬度=100、高度=100,然后在窗體上用鼠標(biāo)單擊【剪切】按鈕,效果如圖9.23所示。,9.5.2程序點評 在本案例中,我們看到了使用PictureBox控件和GDI+可以輕松地完成許多圖像處理工作,盡管這些功能還不足以讓你自己編寫出Photoshop來,但是完成日常的許多圖像工作卻已經(jīng)足夠了。,9.6 制作一個屏幕保護程序,在這一節(jié)中,我們會用GDI+制作一個屏幕保護程序。 制作Windows下的屏幕保護程序聽起來神秘,其實相當(dāng)簡單,因
42、為Windows的屏幕保護程序?qū)嶋H上就是一個普通的應(yīng)用程序而已,只不過它的擴展名不是.EXE而是.SCR。 Windows以命令行的方式調(diào)用這個程序,并且傳入一些參數(shù)。例如,“/c”參數(shù)表示要對此屏幕保護程序進行設(shè)置;“/s”參數(shù)表示直接調(diào)用或預(yù)覽;而“/p”參數(shù)表示選中顯示器屬性對話框中屏幕保護程序標(biāo)簽時,在對話框上的屏幕中顯示預(yù)覽效果等。,9.6.1目標(biāo) 本節(jié)介紹的屏幕保護程序會在屏幕上畫出一些很奇怪的圖形,這些圖形是由一條貝塞爾曲線和一條直線首尾相連組成的。在這個過程中你還會學(xué)到如何使用GDI+的一個很有力的工具GraphicsPath。,9.6.2窗體,9.6.3屏幕保護代碼 下面就可
43、以開始編碼了,把以下列出的代碼寫入類Form1的定義中,“Windows 窗體設(shè)計器生成的代碼”與“End Class”之間。 Dim m_Graphics As Graphics Dim m_ScreenWidth, m_ScreenHeight As Integer Dim randnum As New Random() Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 取得窗體的Graphics對象,以供繪畫用 m_Graphics
44、= Me.CreateGraphics 取得窗體的寬度和高度,以便決定繪畫的位置 m_ScreenWidth = Me.Width m_ScreenHeight = Me.Height End Sub,Private Sub tmrDrawShape_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrDrawShape.Tick 隨機顏色 Dim randColor As Color 隨機的GraphicsPath開始點和結(jié)束點 Dim randStartPoint, randEndPoint
45、 As Point 貝塞爾曲線的兩個隨機控制點 Dim randCtrlPoint1, randCtrlPoint2 As Point 隨機的GraphicsPath Dim randGrphPath As New System.Drawing.Drawing2D.GraphicsPath() 生成隨機顏色 randColor = Color.FromArgb(randnum.Next(255), randnum.Next(255), _ randnum.Next(255), randnum.Next(255),生成4個隨機點 randStartPoint = New Point(randNum.Next(m_ScreenWidth), _ randNum.Next(m_ScreenHeigh
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 休養(yǎng)所老年公寓設(shè)計與運營創(chuàng)新策略考核試卷
- 意外傷害保險與保險行業(yè)的風(fēng)險管理與案例分析研究分析考核試卷
- 家用紡織品的供應(yīng)鏈管理與物流優(yōu)化考核試卷
- 車險理賠合規(guī)培訓(xùn)課件
- 花生銷售合同范本
- 裝修押金轉(zhuǎn)讓合同范本
- 抵押的車位合同范本
- 寄養(yǎng)羊合同范本
- 小學(xué)生態(tài)平衡課件
- 超市促銷培訓(xùn)課件
- 海南省澄邁縣2024-2025學(xué)年七年級上學(xué)期期末考試地理試題(含答案)
- 2025年蘇州衛(wèi)生職業(yè)技術(shù)學(xué)院高職單招職業(yè)技能測試近5年常考版參考題庫含答案解析
- 部編人教版五年級下冊小學(xué)數(shù)學(xué)全冊教案
- 2024年世界職業(yè)院校技能大賽高職組“聲樂、器樂表演組”賽項參考試題庫(含答案)
- 2024年共青團入團考試題庫及答案
- 2024解析:第十二章機械效率-講核心(原卷版)
- 2023年國家公務(wù)員錄用考試《申論》真題(副省卷)及答案解析
- 2024-2030年中國醫(yī)療器械維修設(shè)備行業(yè)供需狀況及發(fā)展策略分析報告
- 中國心力衰竭診斷和治療指南2024解讀(完整版)
- 女性健康知識講座課件
- DB11T 1787-2020 二氧化碳排放核算和報告要求 其他行業(yè)
評論
0/150
提交評論