掌握?qǐng)D形操作的應(yīng)用。
繪圖屬性、圖形方法的應(yīng)用。
Visual Basic為用戶提供了簡(jiǎn)潔有效的圖形圖像處理能力。除了窗體和控件的圖形圖像特征以外,它還提供了一系列基本的圖形函數(shù)、語句和方法,支持直接在窗體上產(chǎn)生圖形、圖像和顏色,控制對(duì)象的位置和外觀。
9.1 圖形控件
Visual Basic中與圖形有關(guān)的標(biāo)準(zhǔn)控件有4種,即圖片框(PictureBox)、圖像框(Image)、直線(Line)和形狀(Shape)等控件。圖片框和圖像框在第2章已做介紹,在這一節(jié)中介紹直線控件(Line)和形狀控件(Shape)的用法。
直線控件(Line)和形狀控件(Shape) ,也是圖形控件。直線控件可以顯示水平線、垂直線或者對(duì)角線,通過屬性的設(shè)置可以改變直線的粗細(xì)、顏色和樣式。形狀控件預(yù)定義了6種形狀,可以顯示矩形、正方形、橢圓、圓形、圓角矩形或者圓角正方形,同時(shí)可以設(shè)置形狀的顏色和填充圖案。
⒈ 直線控件屬性
直線除了具有Name、Visible、Parent、Tag等標(biāo)準(zhǔn)屬性外,還具有以下屬性:
(1) X1、Y1、X2、Y2屬性。返回或設(shè)置直線控件的起始點(diǎn) (X1, Y1) 和終止點(diǎn) (X2, Y2) 的坐標(biāo)。水平坐標(biāo)是 X1 和 X2;垂直坐標(biāo)是 Y1 和 Y2。
(2)BorderColor屬性。返回或設(shè)置直線的顏色。
(3)BorderStyle屬性。返回或設(shè)置直線的樣式,取值如表9.1所示。
表9.1 BorderStyle屬性取值表 | 符號(hào)常數(shù) | 取值 |
vbTransparent | 0 | |
vbBSSolid | 1 | |
vbBSDash | 2 | |
vbBSDot | 3 | |
vbBSDashDot | 4 | |
vbBSDashDotDot | 5 | |
vbBSInsideSolid | 6 |
說 明
透明
(缺省值)實(shí)線。邊框處于形狀邊緣的中心
虛線
點(diǎn)線
點(diǎn)劃線
雙點(diǎn)劃線
內(nèi)收實(shí)線
(4)BorderWidth屬性
返回或設(shè)置直線的寬度,默認(rèn)單位為像素。
⒉ 形狀控件屬性
Name、Visible、Left、Top、Height、Width等標(biāo)準(zhǔn)屬性適用于形狀控件,上述的BorderColor屬性、BorderStyle屬性、BorderWidth屬性也可用于形狀控件,分別設(shè)置形狀邊界的顏色、形狀邊界線的樣式和形狀邊界線的寬度。除此以外形狀控件還有下列屬性:
(1)BackStyle屬性
返回或設(shè)置形狀控件背景是透明的還是非透明的,同Label控件。如果該屬性設(shè)置為非透明,則由BackColor屬性所指定的顏色來填充。
(2)FillColor屬性
返回或設(shè)置用于填充形狀的顏色。
(3)FillStyle 屬性
返回或設(shè)置用來填充形狀的圖案,取值如表9.2所示。
表9.2 FillStyle屬性取值表 | 符號(hào)常數(shù) | 取值 |
VbFSSolid | 0 | |
VbFSTransparent | 1 | |
VbHorizontalLine | 2 | |
VbVerticalLine | 3 | |
VbUpwardDiagonal | 4 | |
VbDownwardDiagonal | 5 | |
VbCross | 6 | |
VbDiagonalCross | 7 |
說 明
實(shí)線
(缺省值)透明
水平直線
垂直直線
上斜對(duì)角線
下斜對(duì)角線
十字線
交叉對(duì)角線
(4)Shape屬性
返回或設(shè)置一個(gè)值,該值指示一個(gè)Shape控件的外觀,取值如表9.3所示。
表9.3 Shape屬性取值表 | 符號(hào)常數(shù) | 取值 |
VbShapeRectangle | 0 | |
VbShapeSquare | 1 | |
VbShapeOval | 2 | |
VbShapeCircle | 3 | |
VbShapeRoundedRectangle | 4 | |
VbShapeRoundedSquare | 5 |
說 明
(缺省值)矩形
正方形
橢圓形
圓形
圓角矩形
圓角正方形
【例9-1】 用Shape控件的Shape屬性顯示Shape控件的6種形狀,并填充不同的圖案,如圖9.1所示。
圖9.1 Shape屬性確定的形狀分析:在窗體上放置一個(gè)Shape控件,設(shè)置其Index屬性為0。在循環(huán)中使用Load方法按行的順序產(chǎn)生5個(gè)Shape控件數(shù)組對(duì)象,通過改變Shape屬性和FillStyle屬性,形成各種形狀,并填充不同的圖案。
程序代碼如下:
Private Sub Form_Activate()
Dim i As Integer
Print " 0 1 2 3 4 5"
Shape1(0).Shape = 0
Shape1(i).FillStyle = 2
For i = 1 To 5
Load Shape1(i) ' 裝入數(shù)組控件
Shape1(i).Left = Shape1(i -1).Left +1000 '確定控件Left屬性
Shape1(i).Visible = True ' 顯示該控件
Shape1(i).Shape = i ' 確定所需要的幾何形狀
Shape1(i).FillStyle = i + 2 ' 填充不同的圖案
Next i
End Sub
對(duì)于對(duì)象的擺放及圖形的處理工作,其位置與大小是最先需要獲得的信息。對(duì)象的坐標(biāo)系統(tǒng)是繪制各種圖形的基礎(chǔ)。設(shè)置坐標(biāo)系統(tǒng)的目的在于確定容器中點(diǎn)的位置。坐標(biāo)包括橫坐標(biāo)(x軸)和縱坐標(biāo)(y軸),x值是指點(diǎn)與原點(diǎn)的水平距離,y值是指點(diǎn)與原點(diǎn)的垂直距離。坐標(biāo)系統(tǒng)選擇的恰當(dāng)與否將直接影響著圖形的質(zhì)量和效果。
9.2.1 坐標(biāo)系統(tǒng)
前面已經(jīng)介紹過,窗體、框架(Frame)、圖片框(Picture Box)等都可以作為其他控件的容器。因此如果在窗體中放置控件或繪圖,坐標(biāo)(x , y)的值就是以窗體為容器;如果在窗體的圖片框中繪制控件,坐標(biāo)(x , y)就以圖片框?yàn)槿萜?。任何容器的默認(rèn)坐標(biāo)系統(tǒng),都是從容器的左上角(0 , 0)坐標(biāo)開始,如圖9.2所示。
圖9.2 窗體的坐標(biāo)系統(tǒng)
Visual Basic中有8種坐標(biāo)系統(tǒng),如表9.4所示。默認(rèn)的坐標(biāo)系統(tǒng)以緹(Twip)為
單位。
表9.4 Visual Basic的度量單位 | 屬性值 |
0 | |
1 | |
2 |
坐標(biāo)單位
用戶自定義類型。當(dāng)用ScaleWidth, ScaleHeight, ScaleTop,ScaleLeft設(shè)置坐標(biāo)系統(tǒng)后,ScaleMode自動(dòng)設(shè)置為0。
緹(Twip),1 Twip=1/1440英寸。
點(diǎn)(Point),1點(diǎn)=1/72英寸。
續(xù)表 | 屬性值 |
3 | |
4 | |
5 | |
6 | |
7 |
坐標(biāo)單位
像素(Pixel)
字符(Character)
英寸(Inch)
毫米(Millimeter)
厘米(Centimeter)
坐標(biāo)系統(tǒng)的度量單位可通過ScaleMode屬性來設(shè)置,設(shè)置對(duì)象的ScaleMode屬性可以改變坐標(biāo)系統(tǒng)的單位,例如可以采用像素或毫米為單位。其語法格式為:
[對(duì)象].ScaleMode
ScaleMode屬性值如表9.5所示。對(duì)象省略時(shí),指當(dāng)前窗體。
表9.5 ScaleMode屬性設(shè)置值 | 常 數(shù) | 值 |
vbUser | 0 | |
vbTwips | 1 | |
vbPoints | 2 | |
vbPixels | 3 | |
vbCharacters | 4 | |
vbInches | 5 | |
vbMillimeters | 6 | |
vbCentimeters | 7 |
說 明
自定義坐標(biāo)系統(tǒng)
緹(默認(rèn),567twips/cm,1440twips/inch)
點(diǎn)(72points/inch)
像素(顯示器分辨率的最小單位)
字符(水平每個(gè)單位等于120twips,垂直每個(gè)單位等于240twips)
英寸
毫米
厘米
例如,設(shè)置圖片框Picture1的刻度單位為像素:
Picture1.ScaleMode=3
Scale方法用于為窗體、圖片框或Printer對(duì)象設(shè)置新的坐標(biāo)系統(tǒng),其語法格式為:
[對(duì)象].Scale (x1, y1) - (x2, y2)
其中,(x1,y1)設(shè)置對(duì)象的左上角坐標(biāo),(x2,y2)設(shè)置對(duì)象右下角坐標(biāo)。使用Scale方法將把對(duì)象在x方向上分為x2-x1等分,在y方向上分為y2-y1等分。使用Scale方法將自動(dòng)把ScaleMode屬性設(shè)置為0。
例如,將窗體Form1的左上角和右下角設(shè)置為(100,100)和(200,200),則窗體為100單位寬和100單位度:
Form1.Scale(100, 100) - (200, 200)
左上角的水平和垂直坐標(biāo)可以分別用ScaleLeft和ScaleTop來指定,右下角水平和垂直坐標(biāo)則可以用ScaleWidth和ScaleHeight指定。例如下述代碼:
Form1.ScaleLeft = 100
Form1.ScaleTop = 100
Form1.ScaleWidth = 200
Form1.ScaleHeight = 200
與上面Form1的Scale方法指定效果是一樣的。
CurrentX和CurrentY屬性用于表示當(dāng)前點(diǎn)的水平和垂直坐標(biāo),即下一次打印或繪圖的起點(diǎn)坐標(biāo),在設(shè)計(jì)時(shí)不可以用。
9.2.2 自定義坐標(biāo)系
對(duì)象的坐標(biāo)系允許用戶自行定義。Scale方法是建立用戶坐標(biāo)系最方便的方法,其語法如下:
[對(duì)象.]Scale [(xLeft,yTop) - (xRight,yBotton)]
其中:對(duì)象可以是窗體、圖片框或打印機(jī)。如果省略對(duì)象名,則為帶有焦點(diǎn)的窗體對(duì)象。 (xLeft,yTop)表示對(duì)象的左上角的坐標(biāo)值,(xRight,yBotton)為對(duì)象的右下角的坐標(biāo)值。均為單精度數(shù)值。Visual Basic根據(jù)給定的坐標(biāo)參數(shù)計(jì)算出ScaleLeft,ScaleTop,ScaleWidth,ScaleHeight的值:
ScaleLeft = xLeft
ScaleTop = yTop
ScaleWidth = xRight - xLeft
ScaleHeight = yBotton - yTop
【例9-2】 在Form_Paint事件中通過Scale方法定義窗體Form1的坐標(biāo)系。
Private Sub Form_Paint()
Cls
Form1.Scale (-200,250) - (300, -150)
Line (-200, 0) -(300, 0) ' 畫X軸
Line (0, 250) - (0,-150) ' 畫Y軸
CurrentX = 0 : CurrentY = 0: Print 0 ' 標(biāo)記坐標(biāo)原點(diǎn)
CurrentX = 280 : CurrentY = 20 : Print "X" ' 標(biāo)記X軸
CurrentX = 10 : CurrentY = 240 : Print "Y" ' 標(biāo)記Y軸
End Sub
窗體Form1的坐標(biāo)系如圖9.3所示。
圖9.3 控件數(shù)組對(duì)話框
任何時(shí)候在程序代碼中使用Scale方法都能有效地和自然地改變坐標(biāo)系統(tǒng)。當(dāng)Scale方法不帶參數(shù)時(shí),則取消用戶自定義的坐標(biāo)系,而采用默認(rèn)坐標(biāo)系。
此外,也可通過設(shè)置對(duì)象的ScaleTop,ScaleLeft,ScaleWidth和ScaleHeight四項(xiàng)屬性來定義坐標(biāo)系。對(duì)象左上角坐標(biāo)為(ScaleTop,ScaleLeft),右下角坐標(biāo)為(ScaleLeft+ScaleWidth,ScaleTop+ScaleHeight)。根據(jù)左上角和右下角坐標(biāo)值的大小自動(dòng)設(shè)置坐標(biāo)軸的正向。X軸與Y軸的度量單位分別為1/ScaleWidth和1/ScaleHeight。例如,設(shè)置窗體的四項(xiàng)屬性為:
Form1.ScaleLeft = -200
Form1.ScaleTop = 250
Form1.ScaleWidth = 500
Form1.ScaleHeight = -400
窗體Form1的左上角坐標(biāo)為(-200,250),右下角坐標(biāo)為ScaleLeft+ScaleWidth =300和ScaleTop+ScaleHeigh =-150,即(300,-150)。X軸的正向向右,Y軸的正向向上。其效果與上圖相同。
一個(gè)圖形要想在容器中以恰當(dāng)?shù)奈恢?,合適的線條和顏色顯示出來,就要利用Visual Basic提供的屬性和方法設(shè)置圖形的當(dāng)前坐標(biāo)、線寬、線型和色彩,以便滿足用戶的需要。
9.3.1 當(dāng)前坐標(biāo)
窗體或圖片框或打印機(jī)的CurrentX、CurrentY屬性給出這些對(duì)象在繪圖時(shí)的當(dāng)前坐標(biāo)。這兩個(gè)屬性在設(shè)計(jì)階段不能使用。當(dāng)坐標(biāo)系確定后,坐標(biāo)值(x,y)表示對(duì)象上的絕對(duì)坐標(biāo)位置。如果坐標(biāo)值前加上關(guān)鍵字Step,則坐標(biāo)值(x,y)表示對(duì)象上的相對(duì)坐標(biāo)位置,即從當(dāng)前坐標(biāo)分別平移x,y個(gè)單位,其絕對(duì)坐標(biāo)值為(CurrentX+x,CurrentY+y)。
當(dāng)使用Cls方法后,CurrentX、CurrentY屬性值為0。
【例9-3】 用Print方法在窗體上隨機(jī)顯示50個(gè)"★"和50個(gè)"☆",如下圖9.4所示。
分析:利用CurrentX、CurrentY屬性可指定Print方法在窗體上的輸出位置。用Rnd函數(shù)與窗體的Width和Heigth屬性相乘,產(chǎn)生CurrentX、CurrentY的值。由于Rnd函數(shù)產(chǎn)生的值在0到1之間,故CurrentX、CurrentY必定在窗口有效區(qū)域內(nèi)??梢杂醚h(huán)控制變量的奇偶性決定"★"或"☆"的
輸出。
程序代碼如下:
Private Sub Form_Click()
Dim i As Integer
Randomize
For i = 1 To 100
CurrentX = Form1.Width * Rnd
CurrentY = Form1.Height * Rnd
If (i Mod 2) = 0 Then
Print "★ "
Else
Print "☆ "
End If
Next i
End Sub
圖9.4 使用當(dāng)前坐標(biāo)
9.3.2 線寬與線型
窗體、圖片框或打印機(jī)的DrawWidth屬性給出這些對(duì)象上所畫線的寬度或點(diǎn)的大小。DrawWidth屬性以像素為單位來度量,最小值為1。
窗體或圖片框或打印機(jī)的DrawStyle屬性給出這些對(duì)象上所畫線的形狀。屬性設(shè)置意義及效果如圖9.5所示。
圖9.5 DrawStyle屬性以上線型僅當(dāng)DrawWidth屬性值為1時(shí)才能產(chǎn)生。當(dāng)DrawWidth的值大于1且DrawStyle屬性值為1~ 4時(shí),都只能產(chǎn)生實(shí)線效果。當(dāng)DrawWidth的值大于1,而DrawStyle屬性值為6時(shí),所畫的內(nèi)實(shí)線僅當(dāng)是封閉線時(shí)起作用。
DrawStyle = 6為內(nèi)側(cè)實(shí)線方式,在畫封閉圖形時(shí),線寬的計(jì)算從邊界向內(nèi),而實(shí)線方式(DrawStyle = 0)畫封閉圖形時(shí),線寬的計(jì)算以邊界為中心,一半在邊界內(nèi),一半在邊界外。如圖9.6所示,為線寬DrawWidth = 10,畫同樣大小方框所產(chǎn)生的不同效果
圖9.6 內(nèi)實(shí)線與實(shí)線方式的區(qū)別如果使用控件,則通過BorderWidth屬性定義線的寬度或點(diǎn)的大小,通過BorderStyle屬性給出所畫線的形狀。
【例9-4】 通過改變DrawStyle屬性值在窗體上畫出不同的線形,產(chǎn)生如圖9.5所示效果。程序代碼如下:
Private Sub Form_Click()
Dim j As Integer
Print "DrawStyle 0 1 2 3 4 5 6"
Print " 線 型 實(shí)線 長(zhǎng)劃線 點(diǎn)線 點(diǎn)劃線 點(diǎn)點(diǎn)劃線 透明線 內(nèi)實(shí)線"
Print " 圖 示 "
CurrentX =600 ' 設(shè)置直線的開始位置
CurrentY = ScaleHeight / 3
DrawWidth = 1 ' 寬度為1時(shí)DrawStyle屬性才能產(chǎn)生線型
For j = 0 To 6
DrawStyle = j ' 定義線的形狀
CurrentX = CurrentX + 150
Line -Step(600, 0) ' 畫線長(zhǎng)600的線段
Next j
End Sub
9.3.3 填充與色彩
封閉圖形的填充方式由FillStyle、FillColor這兩個(gè)屬性決定。FillColor屬性指定填充圖案的顏色,默認(rèn)的顏色與ForeColor相同。FillStyle屬性指定填充的圖案,共有8種內(nèi)部圖案,屬性設(shè)置填充圖案如圖9.7所示。
圖9.7 FillStyle屬性指定填充的圖案其中:0為實(shí)填充,它與指定填充圖案的顏色有關(guān);1為透明方式。
Visual Basic默認(rèn)采用對(duì)象的前景色(ForeColor屬性)繪圖,也可以通過以下顏色函數(shù)指定色彩。
1. RGB函數(shù)
RGB函數(shù)通過紅、綠、藍(lán)三基色混合產(chǎn)生某種顏色,常見的標(biāo)準(zhǔn)顏色RGB值如表9.6。其語法為:
RGB(紅,綠,藍(lán))
其中:括號(hào)中紅、綠、藍(lán)三基色的成份使用0~255之間的整數(shù)。例如:RGB(0,0,0)返回黑色;而RGB(255,255,255)返回白色。
表9.6 常見的標(biāo)準(zhǔn)顏色RGB值 | 顏 色 | 紅 色 值 | 綠 色 值 |
黑色 | 0 | 0 | |
藍(lán)色 | 0 | 0 | |
綠色 | 0 | 255 | |
青色 | 0 | 255 | |
紅色 | 255 | 0 | |
洋紅色 | 255 | 0 | |
黃色 | 255 | 255 | |
白色 | 255 | 255 |
藍(lán) 色 值
0
255
0
255
0
255
0
255
從理論上來說,用三基色混合可產(chǎn)生256×256×256種顏色,但是實(shí)際使用時(shí)受到顯示硬件的限制。
2. QBColor函數(shù)
QBColor函數(shù)采用QuickBasic所使用的16種顏色,如表9.7。其語法格式為:
QBColor(顏色碼)
其中:QBColor函數(shù)的顏色碼實(shí)際上返回一個(gè)指定紅、綠、藍(lán)三原色的值,用于設(shè)置Visual Basic中RGB系統(tǒng)的對(duì)應(yīng)顏色。例如:QBColor(1)對(duì)應(yīng)RGB(0, 0,128),QBColor(12)對(duì)應(yīng)RGB(255, 0,0)。
表9.7 顏色碼與顏色對(duì)應(yīng)表 | 顏色碼 | 顏色 | 顏色碼 |
0 | 黑 | 8 | |
1 | 藍(lán) | 9 | |
2 | 綠 | 10 | |
3 | 青 | 11 | |
4 | 紅 | 12 | |
5 | 品紅 | 13 | |
6 | 黃 | 14 | |
7 | 白 | 15 |
顏色
灰
亮藍(lán)
亮綠
亮青
亮紅
亮品紅
亮黃
亮白
3. 直接輸入數(shù)值
顏色值的格式是16進(jìn)制的,為&HBBGGRR。BB代表藍(lán)色,GG代表綠色,RR代表紅色。例如:
Form1.BackColor = &HFF0000 與 Form1.BackColor = RGB(0, 0, 255)
的含義是一樣的。
4. 使用顏色常數(shù)
Visual Basic 將經(jīng)常使用的顏色值定義為內(nèi)部常數(shù),顏色常數(shù)包括:vbBlack、vbRed、vbGreen、vbYellow、vbBlue、vbMagenta、vbCyan、vbWhite等,這些常數(shù)可以使用對(duì)象瀏覽器列出。當(dāng)使用這些內(nèi)部常數(shù)時(shí),無需了解這些常數(shù)是如何產(chǎn)生的,也無需聲明。例如,無論什么時(shí)候想指定紅色作為顏色參數(shù)或顏色屬性的設(shè)置值,都可以使用常數(shù)vbRed:
Form1.BackColor = vbRed
【例9-5】 利用滾動(dòng)條設(shè)計(jì)一個(gè)調(diào)色板。
在窗體上添加3個(gè)水平滾動(dòng)條(數(shù)組形式)用于調(diào)整紅色、綠色及藍(lán)色的值,并將其Min屬性設(shè)為0、Max屬性設(shè)為255。添加3個(gè)標(biāo)簽用于表示滾動(dòng)條的當(dāng)前數(shù)值。添加4個(gè)圖片框,Picture1用于響應(yīng)調(diào)出的顏色,并將另外3個(gè)BackColor屬性設(shè)為紅色、綠色及藍(lán)色,如圖9.8所示。
圖9.8 調(diào)色板范例
滾動(dòng)條的事件代碼如下:
Private Sub HScroll1_Change(Index As Integer)
Picture1.BackColor = RGB(HScroll1(0), HScroll1(1), HScroll1(2))
For i = 0 To 2
label1(i).Caption = HScroll1(i).Value
Next
End Sub
【例9-6】 演示顏色的漸變過程。
分析:要定義漸變,可多次調(diào)用RGB函數(shù),每次對(duì)RGB函數(shù)的參數(shù)稍作變化。下面的程序用線段填充矩形區(qū),通過改變直線的起終點(diǎn)坐標(biāo)和RGB函數(shù)中三基色的成份產(chǎn)生漸變效果,如圖9.9所示。
圖9.9 漸變效果
程序代碼如下:
Private Sub Form_Click()
Dim j As Integer , x As Single , y As Single
y = Form1.ScaleHeight
x = Form1. ScaleWidth ' 設(shè)置直線X方向終點(diǎn)坐標(biāo)
sp = 255 / y ' 每次改變基色的增量
For j = 0 To y
Line (0, j)-(x, j), RGB(j * sp, j * sp, j * sp) ' 畫線
Next j
End Sub
在Visual Basic中除了用繪圖控件繪圖外,還可以用繪圖方法繪圖。這些方法不僅能制作多種圖案,通過參數(shù)的選用還可變化出不同的花樣。
Visual Basic給用戶提供了以下常用繪圖方法。
9.4.1 Cls方法(清除)
Cls方法用于清除所有圖形方法和Print方法顯示的文本或圖形,并將光標(biāo)移動(dòng)到原點(diǎn)位置。其語法格式為:
[對(duì)象.]Cls
例如,清除圖像框中的文本或圖畫:
Picture1.Cls
值得注意的是,Cls方法的使用與AutoRedraw屬性的設(shè)置有很大關(guān)系。如果調(diào)用Cls之前,AutoRedraw屬性設(shè)置為False,則Cls不能清除在AutoRedraw屬性設(shè)置為True時(shí)產(chǎn)生的圖形和文本。如果調(diào)用Cls之前,AutoRedraw屬性設(shè)置為True,則Cls可以清除所有運(yùn)行時(shí)產(chǎn)生的圖形和文本。
9.4.2. PSet方法(畫點(diǎn))
PSet方法可以在對(duì)象的指定位置按確定的像素顏色畫點(diǎn),格式為:
[對(duì)象.]PSet [Step] (x, y) [,Color]
說明:
(1)(x,y)為必需的,可以是整數(shù)也可以包含小數(shù)。
(2)Step為可選關(guān)鍵字,指定相對(duì)于由CurrentX和CurrentY屬性提供的當(dāng)前圖形的位置坐標(biāo)。例如,在窗體的Form_Activate事件過程中分別輸入左右兩段程序代碼:
PSet (1000, 1000) PSet Step(1000, 1000)
PSet (1000, 2000) PSet Step(1000, 2000)
運(yùn)行結(jié)果如圖9.10所示,第一點(diǎn)(1000,1000)位置都相同,因?yàn)?/span>CurrentX,CurrentY的起始值都為(0,0)。但經(jīng)過第一次PSet方法設(shè)置后,CurrentX與CurrentY位置移到了(1000,1000),
圖9.10 是否加入關(guān)鍵字Step的比較
畫出第二個(gè)點(diǎn)時(shí)對(duì)左邊的例子沒有影響(還是以原點(diǎn)為起點(diǎn)),但是由于右邊加了Step關(guān)鍵字,則是以CurrentX與CurrentY為參考點(diǎn)畫出的坐標(biāo)(1000,2000)這個(gè)點(diǎn),此點(diǎn)相對(duì)于窗體原點(diǎn)來說坐標(biāo)值為(2000,3000)。
(3)Color用于為該點(diǎn)指定顏色,缺省時(shí),使用當(dāng)前的ForeColor屬性值??捎?/span>RGB函數(shù)或QBColor函數(shù)指定顏色。例如,在指定位置畫一個(gè)紅點(diǎn):
PSet (1000, 1000), RGB(255, 0, 0)
例如,在窗體上添加一個(gè)計(jì)時(shí)器Timer1,并設(shè)置其Interval屬性值。將Form1的BackColor屬性修改為黑色。編寫計(jì)時(shí)的Timer事件過程:
Private Sub Timer1_Timer()
DrawWidth = 5
x_pos = Int(Rnd * Form1.ScaleWidth)
y_pos = Int(Rnd * Form1.ScaleHeight)
red_c = Int(Rnd * 256)
green_c = Int(Rnd * 256)
blue_c = Int(Rnd * 256)
PSet (x_pos, y_pos), RGB(red_c, green_c, blue_c)
End Sub
程序運(yùn)行結(jié)果如圖9.11所示。
圖9.11 滿天星范例
9.4.3 Line方法(畫線)
Line方法可以在對(duì)象上的兩點(diǎn)之間畫直線或矩形,格式為:
[對(duì)象.]Line [[Step](x1,y1)]-[Step] (x2,y2) [,顏色] [,B[F]]
說明:
(1)(x1,y1)為起點(diǎn)坐標(biāo),(x2,y2)為終點(diǎn)坐標(biāo),如果省略(x1,y1),則起點(diǎn)位于由CurrentX和CurrentY指示的位置。帶Step關(guān)鍵字表示與當(dāng)前坐標(biāo)的相對(duì)位置。
(2)B為可選項(xiàng)。省略此項(xiàng)是畫直線,如果選擇B則以(x1,y1)為左上角坐標(biāo)、(x2,y2)為右下角坐標(biāo)畫出矩形。F選項(xiàng)規(guī)定矩形以矩形邊框的顏色填充。
執(zhí)行Line方法后,CurrentX和CurrentY屬性被設(shè)置為終點(diǎn),利用此特性可用Line方法畫連接線。例如,可以利用Line方法在窗體上畫三個(gè)矩形方框,如圖9.12所示。
圖9.12 三個(gè)矩形
程序代碼如下:
Private Sub Form_Click()
Line (500, 500)-Step(500, 0)
Line -Step(0, 500)
Line -Step(-500, 0)
Line -Step(0, -500)
Line (1000, 1000)-Step(500, 500), , B
Line (1500, 500)-(2000, 1000), , BF
End Sub
9.4.4 Circle方法(畫圓)
Circle方法可以在對(duì)象上畫圓、橢圓或圓弧,格式為:
[對(duì)象.]Circle [Step](x, y),半徑[,顏色,起點(diǎn),終點(diǎn),縱橫比]
說明:
(1)(x,y)是圓、橢圓或圓弧的中心坐標(biāo),帶Step關(guān)鍵字時(shí)表示與當(dāng)前坐標(biāo)的相對(duì)位置,半徑是圓、橢圓或圓弧的半徑。
(2)起點(diǎn)、終點(diǎn)指定(以弧度為單位)弧或扇形的起點(diǎn)以及終點(diǎn)位置。其范圍從-2π到2π。起點(diǎn)的缺省值是0,終點(diǎn)的缺省值是2π。正數(shù)畫弧,負(fù)數(shù)畫扇形。
(3)縱橫比為垂直半徑與水平半徑之比,不能為負(fù)數(shù)。當(dāng)縱橫比大于1時(shí),橢圓沿垂直方向拉長(zhǎng),當(dāng)縱橫比小于1時(shí),橢圓沿水平方向拉長(zhǎng)。縱橫比的缺省值為1,在屏幕上產(chǎn)生一個(gè)標(biāo)準(zhǔn)的圓。在橢圓中,半徑總是對(duì)應(yīng)長(zhǎng)軸。
圖9.13 用Circle方法在窗體上畫圖
可以省略中間的某個(gè)參數(shù),但不能省略分隔參數(shù)的逗號(hào)。例如,通過以下代碼可以在窗體上畫出一個(gè)扇形、圓、橢圓,如圖9.13所示。
Private Sub Form_Click()
Const PI = 3.14159
Circle (2000, 1500), 1000, vbBlue, -PI, -PI / 2
Circle Step(-500, -500), 500
Circle Step(0, 0), 500, , , , 5 / 25
End Sub
9.4.5 PaintPicture方法
PaintPicture方法用于在Form,PictureBox或Printer上繪制出圖形文件的內(nèi)容,圖形文件類型包括.bmp,.ico,.wmf,.emf,.cur,.ico和.dib等。PaintPicture的一般格式為:
[對(duì)象.]PaintPicture 圖形,x1,y1[,寬度1[,高度1,x2[,y2[,寬度2[,高度2[,位操作常數(shù)]]]]]]
說明:
(1) 圖形:指圖形文件,可以是Form或PictureBox的Picture屬性指定的圖形文件。
(2) x1,y1:指在對(duì)象上繪制圖形的坐標(biāo),由對(duì)象的ScaleMode屬性決定度量單位。
(3) 寬度1,高度1:對(duì)象的寬度或高度。如果省略,則使用圖形的寬度或高度。
(4) x2,y2:指圖形剪貼區(qū)的左上角坐標(biāo),默認(rèn)為(0,0)。
(5) 寬度2,高度2:指圖形內(nèi)剪貼區(qū)的寬度或高度,默認(rèn)為整個(gè)圖形的寬度或高度。如果寬度1、高度1比寬度2、高度2大或小,將適當(dāng)?shù)乩旎驂嚎s圖形。
(6) 位操作常數(shù):用來定義在將圖形繪制到對(duì)象上時(shí)執(zhí)行的位操作。位操作常數(shù)如表9.8所示。
表9.8 位操作常數(shù) | 常 數(shù) |
vbDstInvert | |
vbMergeCopy | |
vbMergePaint | |
vbSrcInvert | |
VbSrcPaint | |
vbNotSrcCopy | |
vbNotSrcErase | |
VbPatCopy | |
vbPatInvert | |
VbPatPaint | |
VbSrcAnd | |
vbSrcCopy | |
vbSrcErase |
描 述
反轉(zhuǎn)源位置
合并模式和源位置
用Or運(yùn)算合并反轉(zhuǎn)的源位圖和目標(biāo)位圖
用Xor運(yùn)算合并目標(biāo)像素與源位圖
用Or運(yùn)算合并目標(biāo)像素與源位圖
將反轉(zhuǎn)的源位圖復(fù)制到目標(biāo)中
用Or運(yùn)算合并源位圖和目標(biāo)位圖,然后反轉(zhuǎn)
將模式復(fù)制到目標(biāo)位圖
用Xor運(yùn)算合并目標(biāo)位圖與模式
用Or運(yùn)算合并反轉(zhuǎn)的源位圖與模式,然后用Or運(yùn)算合并上述結(jié)果與目標(biāo)位圖
用And運(yùn)算合并目標(biāo)像素與源位圖
將源位圖復(fù)制到目標(biāo)位圖
反轉(zhuǎn)目標(biāo)位圖并用And運(yùn)算合并所得結(jié)果與源位圖
例如,在窗體上添加一個(gè)圖片框Picture1,設(shè)置其相應(yīng)的Picture屬性后,將Visible屬性設(shè)為False。然后編寫如下代碼:
Private Sub Form_Click()
ScaleHeight = 800
Num = Form1.ScaleWidth / Picture1.Width
For i = 1 To Num
Form1.PaintPicture Picture1.Picture,(i-1)*Picture1.Width,200, Picture1. Width,Picture1.Height
Next
End Sub
運(yùn)行程序,則會(huì)在窗體中畫出Picture1的多個(gè)拷貝,如圖9.14所示。
圖9.14 圖片拷貝
當(dāng)窗體被其他窗體覆蓋,或當(dāng)重新移出窗體以及內(nèi)容需要重新顯示時(shí),窗體和控件的重新顯示由Windows管理和控制,而窗體、圖片框中的圖形和用Print方法顯示的文本的重新顯示,則需要用到Paint事件、AutoRedraw屬性、Refresh方法。通過使用Paint事件過程,可以保證必要的圖形都能得以重現(xiàn)。例如,窗體最小化后,恢復(fù)到正常大小時(shí),窗體內(nèi)所有圖形都得重畫。當(dāng)AutoRedraw屬性為True時(shí),將自動(dòng)重畫,Paint事件不起作用。而在Resize事件過程中使用Refresh方法,可在每次調(diào)整窗體大小時(shí)強(qiáng)制對(duì)所有對(duì)象通過Paint事件進(jìn)行重畫。
圖片框與文本框或標(biāo)簽相比,一個(gè)優(yōu)越之處在于它能在任何位置顯示文本,并且可以選擇各種字體、各種顏色及與圖形混合使用,可以使用圖片框的標(biāo)準(zhǔn)屬性改變字體字符,并且可以使用ScaleWidth和ScaleHeight屬性以及圖片框的TextWidth和TextHeight方法將文本在圖片框中顯示出來。
9.4.6 Point方法
Point方法用于返回窗體或圖形框上指定點(diǎn)的RGB顏色,其語法格式為:
[對(duì)象.]Point (x, y)
如果由(x,y)指定的點(diǎn)在對(duì)象外面,Point方法返回一個(gè)-1(False)。
例如,用Point方法獲取一個(gè)區(qū)域的信息并使用Pset方法進(jìn)行仿真。
分析:在窗體上放置一個(gè)Picture控件,在程序中設(shè)置窗體和Picture控件各自的坐標(biāo)系。在Picture控件上輸出字符串或圖形,然后用Point方法掃描Picture控件上的信息,根據(jù)返回值在窗體對(duì)應(yīng)坐標(biāo)位置上用Pset方法輸出信息,達(dá)到仿真的目的。
程序代碼如下:
Private Sub Form_Click()
Dim i, j As Integer, mcolor As Long
Form1.Scale (0, 0) - (100, 100)
Picture1.Scale (0, 0) - (100, 100)
Picture1.Print " Point方法應(yīng)用實(shí)例"
For i = 1 To 100 ' 按行掃描
For j = 1 To 100 ' 按列掃描
mcolor = Picture1.Point(i, j) ' 返回指定點(diǎn)的信息
If mcolor = False Then PSet (i, j), mcolor
' 如果在對(duì)象區(qū)域內(nèi)則進(jìn)行仿真
Next j
Next i
End Sub
結(jié)果分析:本例中窗體與圖形框的坐標(biāo)系設(shè)置值相同,但窗體的實(shí)際寬度和高度比圖形框大,故仿真輸出時(shí)放大了原來的字符,結(jié)合屬性,可改變輸出點(diǎn)的大小。運(yùn)行結(jié)果如圖9.15所示(DrawWidth=2)。如果改變目標(biāo)位置坐標(biāo)的算法,可旋轉(zhuǎn)輸出結(jié)果。
圖9.15 用Point方法獲取區(qū)域的信息進(jìn)行仿真
9.5.1 幾何圖形繪制
【例9-7】 畫金剛石圖案。
本例中利用多條直線來畫圖案,先計(jì)算出直線端點(diǎn)所需坐標(biāo)并存入數(shù)組之中。結(jié)果如圖9.16所示。
圖9.16 金剛石圖案
窗體中的一個(gè)按鈕為Command1,其Caption屬性置為“Draw”。程序代碼如下:
Option Explicit
Const Pi As Double = 3.1415926
Private Sub Command1_Click()
′畫金剛石圖案
Me.BackColor = vbWhite
Me.ForeColor = RGB(Rnd * 255, Rnd * 255, Rnd * 255)
Cls
Dim n, x0, y0, r As Integer
n = 20 ′ n 為角點(diǎn)個(gè)數(shù)
x0 = Width / 2
y0 = Height / 2
r = y0 * 0.8
Dim px(), py() As Double
ReDim px(n), py(n)
Dim i, j As Integer
′計(jì)算坐標(biāo)
For i = 1 To n
px(i) = x0 + r * Cos(i * 2 * Pi / n)
py(i) = y0 + r * Sin(i * 2 * Pi / n)
Next
′畫對(duì)角線
For i = 1 To n
For j = 1 To i - 1
Line (px(i), py(i))-(px(j), py(j))
Next
Next
End Sub
Private Sub Form_Load()
Randomize
End Sub
【例9-8】 畫圓環(huán)。
本例用多個(gè)點(diǎn)來畫多個(gè)橢圓,并構(gòu)成圓環(huán),如圖9.17所示,其中有一個(gè)PictureBox控件,名為p。注意其中使用了Scale方法來自定義坐標(biāo)系。
圖9.17 畫圓環(huán)
程序代碼如下:
Private Sub Form_Paint()
p.Cls
p.Scale (-300, -300)-(300, 300)
p.ForeColor = QBColor(4)
pi = 3.1416
For k = -pi To pi Step 0.25
For i = 0 To 2 * pi Step 0.001
ix = 120 * Cos(i)
iy = 80 * Sin(i)
ix1 = ix * Cos(k) - iy * Sin(k)
iy1 = ix * Sin(k) + iy * Cos(k)
p.PSet (ix1, iy1)
Next i
Next k
End Sub
【例9-9】 畫螺線。
本例用多個(gè)點(diǎn)來組成一條螺線,如圖9.18所示。
這是一個(gè)參數(shù)方程的繪圖例子。程序代碼如下:
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
圖9.18 畫圓環(huán)
Dim i As Single
Scale (-15, 15)-(15, -15)
Line (0, 14)-(0, -14)
Line (14, 0)-(-14, 0)
For i = 0 To 12 Step 0.01
X = i * Cos(i)
Y = i * Sin(i)
PSet (X, Y)
Next i
End Sub
9.5.2 菜單和圖形操作的綜合應(yīng)用
【例9-10】利用菜單在窗體圖片框中選擇畫出正弦曲線和余弦曲線。
首先在窗體上設(shè)計(jì)一個(gè)三角函數(shù)菜單(菜單控件數(shù)組),并添加一個(gè)圖片框Picture1,如圖9.19 所示。
圖9.19 坐標(biāo)圖
編寫三角函數(shù)的子菜單的Click事件代碼:
Private Sub mnu_San1_Click(Index As Integer)
oldx = Picture1.ScaleWidth / 2
oldy = Picture1.ScaleHeight / 2
Select Case Index
Case 0
For t = -oldx To oldx Step 0.01
xt = 10 * t
yt = 10 * Sin(t)
Picture1.PSet (xt + oldx, oldy - yt), RGB(0, 127, 127)
Next
Case 1
For t = -oldx To oldx Step 0.01
xt = 10 * t
yt = 10 * Cos(t)
Picture1.PSet (xt + oldx, oldy - yt), RGB(0, 127, 127)
Next
Case 2
Picture1.Cls
Form_Paint
Exit Sub
Case 4
Unload Me
End Select
End Sub
利用Paint事件繪制坐標(biāo)軸及刻度,其代碼為:
Private Sub Form_Paint()
Const PI = 3.14159
With Picture1
.Top = 0
.Left = 0
.Width = Me.ScaleWidth
.Height = Me.ScaleHeight
.ScaleMode = 6
oldx = .ScaleWidth / 2
oldy = .ScaleHeight / 2
.Cls
'畫坐標(biāo)軸
Picture1.Line (oldx, 0)-(oldx, .ScaleHeight), RGB(255, 0, 0)
Picture1.Line (0, oldy)-(.ScaleWidth, oldy), RGB(255, 0, 0)
End With
Picture1.CurrentX = oldx - 4
Picture1.CurrentY = oldy + 0.5
Picture1.Print 0
'畫x軸的刻度
For xt = -Int(oldx) To Int(oldx) Step 0.5
If xt <> 0 Then
st = xt * 10 * PI
Picture1.CurrentX = oldx + st - 3
Picture1.CurrentY = oldy + 0.5
Picture1.Print xt & "π"
Picture1.Line (oldx + st, oldy - 1)-(oldx + st, oldy), RGB(255, 0, 0)
End If
Next
'畫y軸的刻度
For yt = -5 To 7
If yt <> 0 Then
st = yt * 10
Picture1.CurrentX = oldx - 4
Picture1.CurrentY = oldy + st - 1
Picture1.Print yt
Picture1.Line (oldx, oldy + st)-(oldx + 1, oldy + st), RGB(255, 0, 0)
End If
Next
End Sub
Private Sub Form_Resize()
Refresh
End Sub
9.5.3 簡(jiǎn)單動(dòng)畫設(shè)計(jì)
【例9-11】 曲柄滑塊機(jī)構(gòu)的演示。
利用Timer控件來控制圖形控件的轉(zhuǎn)動(dòng),如圖9.20所示。
首先,在窗體上添加一個(gè)命令按鈕Command1,4個(gè)形態(tài)控件Shape1(大圓)、Shape2(滑塊)、Shape3(圓周上的動(dòng)點(diǎn))、Shape4(圓心),若干直線Line1(半徑)、Line2(連桿),一個(gè)計(jì)時(shí)器Timer1。并將Timer1的Interval屬性值設(shè)為100,Enabled屬性值設(shè)為False。
在通用模塊中聲明符號(hào)常數(shù)及窗體級(jí)變量:
Const PI = 3.14159
Dim X0 As Single, Y0 As Single, t As Integer
窗體的Load事件、命令按鈕的Click事件、計(jì)時(shí)器的Timer事件代碼如下:
Private Sub Command1_Click()
If Command1.Caption = "暫停" Then
Command1.Caption = "繼續(xù)"
Timer1.Enabled = False
Else
Command1.Caption = "暫停"
Timer1.Enabled = True
End If
End Sub
Private Sub Form_Load()
With Shape1
.Tag = .Width / 2 '圓的半徑
X0 = .Left + .Tag '圓心的X坐標(biāo)
Y0 = .Top + .Tag '圓心的Y坐標(biāo)
End With
With Line2 '連桿的長(zhǎng)
Line2.Tag = Sqr((.X1 - .X2) ^ 2 + (.Y1 - .Y2) ^ 2)
圖9.20 曲柄滑塊機(jī)構(gòu)
圖9.22 原圖(處理前)
End With
End Sub
Private Sub Timer1_Timer()
t = t + 1
Shape3.Left = X0 - Shape1.Tag * Cos(PI * t / 30) - Shape3.Width /2
Shape3.Top = Y0 + Shape1.Tag * Sin(PI * t / 30) - Shape3.Width /2
Line2.X1 = Shape3.Left + Shape3.Width /2
Line2.Y1 = Shape3.Top + Shape3.Width /2
Line2.X2 = Shape3.Left + Sqr(Line2.Tag ^ 2 - (Shape3.Top - Y0) ^ 2)
Line1.X2 = Line2.X1
Line1.Y2 = Line2.Y1
Shape2.Left = Line2.X2
End Sub
【例9-12】 一個(gè)走動(dòng)的時(shí)鐘。
時(shí)鐘作為一種生活用品,有時(shí)針、分針和秒針,并且可以走動(dòng)。本例分別以Second,Minute和Hour函數(shù)把系統(tǒng)時(shí)間Time分離成“秒”、“分”和“時(shí)”,再利用定時(shí)器控件把時(shí)間處理成圖形,其中時(shí)針、分針、秒針和刻度的定位需要用三角函數(shù)來處理。
首先在窗體中添加1個(gè)Shape控件和3個(gè)直線控件。把3個(gè)Line控件的Name屬性分別改為Lineh,Linem和Lines,再把他們的BorderWidth屬性分別改為3,2和1,BorderColor屬性分別改為紅色、藍(lán)色和紫色。然后把Shape1的BorderWidth屬性改為2,BorderColor屬性改為淡紅色。然后,再在窗體上創(chuàng)建1個(gè)個(gè)數(shù)為12的直線數(shù)組,把12點(diǎn)、3點(diǎn)、6點(diǎn)、9點(diǎn)處的直線的BorderWidth屬性改為2。最后,在窗體上添加一個(gè)定時(shí)器Timer1,并把它的Interval屬性設(shè)置為1000,運(yùn)行界面如圖9.21所示。
編寫代碼時(shí),先在通用段說明幾個(gè)常數(shù):
Const DX = 2800
Const DY = 2300
圖9.21 走動(dòng)的時(shí)鐘
Const PI = 3.14159265
程序代碼如下:
Private Sub Form_Load()
Linem.X1 = DX: Lines.X1 = DX: Lineh.X1 = DX
Linem.Y1 = DY: Lines.Y1 = DY: Lineh.Y1 = DY
Shape1.Left = DX - 2000
Shape1.Top = DY - 2000
Shape1.Width = 4000
Shape1.Height = 4000
For i = 0 To 11 '定位刻度
Line1(i).X1 = DX + 1400 * Cos((i - 12) * 2 * PI / 12 - PI / 2)
Line1(i).Y1 = DY + 1400 * Sin((i - 12) * 2 * PI / 12 - PI / 2)
If i > 10 Or i < 2 Then
Line1(i).X2 = DX + 2000 * Cos((i - 12) * 2 * PI / 12 - PI / 2)
Line1(i).Y2 = Shape1.Top + 10
ElseIf i < 5 Then
Line1(i).X2 = Shape1.Left + Shape1.Width - 10
Line1(i).Y2 = DY + 2000 * Sin((i - 12) * 2 * PI / 12 - PI / 2)
ElseIf i < 8 Then
Line1(i).X2 = DX + 2000 * Cos((i - 12) * 2 * PI / 12 - PI / 2)
Line1(i).Y2 = Shape1.Top + Shape1.Height - 10
ElseIf i < 11 Then
Line1(i).X2 = Shape1.Left + 10
Line1(i).Y2 = DY + 2000 * Sin((i - 12) * 2 * PI / 12 - PI / 2)
End If
Next i
End Sub
Private Sub Timer1_Timer(Index As Integer)
Dim h As Integer, s As Integer, mm As Integer
s = Second(Time) '秒
mm = Minute(Time) '分
h = Hour(Time) '時(shí)
If h >= 12 Then h = h - 12
Lineh.X2 = 500 * Cos((h - 12) * 2 * PI / 12 - PI / 2) + DX
Lineh.Y2 = 500 * Sin((h - 12) * 2 * PI / 12 - PI / 2) + DY
Lines.X2 = 1000 * Cos((s - 60) * 2 * PI / 60 - PI / 2) + DX
Lines.Y2 = 1000 * Sin((s - 60) * 2 * PI / 60 - PI / 2) + DY
Linem.X2 = 800 * Cos((mm - 60) * 2 * PI / 60 - PI / 2) + DX
Linem.Y2 = 800 * Sin((mm - 60) * 2 * PI / 60 - PI / 2) + DY
End Sub
在上面的程序中,時(shí)鐘的大小是不能調(diào)整的,通過使用與窗體寬度、高度相關(guān)變量,也可以讓時(shí)鐘的大小隨著窗體調(diào)整而變化。
9.5.4 圖像的顏色處理
【例9-13】 圖像的顏色處理
本例中,單擊按鈕Commnad1對(duì)于一個(gè)圖片(該圖片置于Form的Picture屬性中),如圖9.22所示,進(jìn)行變灰的處理,處理效果如圖9.23(a);單擊按鈕Command2,則進(jìn)行銳化處理, 處理效果如圖9.23(b)。
進(jìn)行變灰的處理的方法是,用GetPoint()方法得到某點(diǎn)的顏色值,然后利用公式:
y = 0.299 * r + 0.587 * g + 0.144 * b
得到該點(diǎn)的亮度值,并用RGB(y,y,y)作為該點(diǎn)的顏色,從而得到一個(gè)變灰的點(diǎn);若用下式:
RGB( y * 1.4 + y * 0.9 + y * 0.7 )
則會(huì)得到一幅有淡紅色的圖。
(a) (b)
圖9.23 圖像顏色處理后的效果
進(jìn)行銳化處理的原理是,對(duì)于圖像中的任一點(diǎn),將該點(diǎn)的顏色加上一個(gè)分量,這個(gè)分量是附近幾個(gè)點(diǎn)的顏色的差值(再乘以一個(gè)比例系數(shù))。由于這個(gè)差值分量的加入,使原圖的相鄰部分的差別更加明顯,從而對(duì)原圖起到了一個(gè)銳化的作用。在程序中使用語句:
ScaleMode = vbPixels
將窗體的坐標(biāo)單位設(shè)置為像素點(diǎn),這樣可方便GetPoint()函數(shù)中坐標(biāo)值的使用。
程序代碼如下:
Option Explicit
Dim PColor() As Long
Private Sub Command1_Click()
Dim i, j As Integer
Dim r, g, b, y As Long
Dim m As Long
For i = 0 To ScaleWidth
For j = 0 To ScaleHeight
PColor(i, j) = Point(i, j)
r = GetRValue(PColor(i, j))
g = GetGValue(PColor(i, j))
b = GetBValue(PColor(i, j))
y = 0.299 * r + 0.587 * g + 0.144 * b ′亮度
PSet (i, j), RGB(y, y, y) ′變灰
′PSet (i, j), RGB(y * 1.4, y * 0.9, y * 0.7) ′若用該語句,則變成淡淡的紅色
Next
DoEvents
Next
End Sub
Private Sub Command2_Click()
Dim i, j As Integer
Dim r, g, b, y As Long
Dim m As Long
For i = 0 To ScaleWidth
For j = 0 To ScaleHeight
PColor(i, j) = Point(i, j)
Next
DoEvents
Next
Dim ratio As Long
ratio = 3′銳化的程度
For i = 1 To ScaleWidth - 1
For j = 1 To ScaleHeight - 1
r = GetRValue(PColor(i, j)) + ratio * (GetRValue(PColor(i, j)) - GetRValue(PColor(i + 1, j + 1)))
g = GetGValue(PColor(i, j)) + ratio * (GetGValue(PColor(i, j)) - GetGValue(PColor(i + 1, j + 1)))
b = GetBValue(PColor(i, j)) + ratio * (GetBValue(PColor(i, j)) - GetBValue(PColor(i + 1, j + 1)))
If r < 0 Then r = 0
If g < 0 Then g = 0
If b < 0 Then b = 0
If r > 255 Then r = 255
If g > 255 Then g = 255
If b > 255 Then b = 255
PSet (i, j), RGB(r, g, b)
Next
DoEvents
Next
End Sub
Private Sub Form_Load()
Picture = LoadPicture(App.Path & "D:\Zhumlm.jpg")
Me.ScaleMode = vbPixels
ReDim PColor(ScaleWidth, ScaleHeight)
End Sub
Function GetRValue(PntColor As Long) As Long
′顏色在內(nèi)存中的表示是&H00bbggrr
GetRValue = PntColor And &HFF
End Function
Function GetGValue(PntColor As Long) As Long
GetGValue = (PntColor / &H100) And &HFF
End Function
Function GetBValue(PntColor As Long) As Long
GetBValue = (PntColor And &HFF0000) / &H10000
End Function
聯(lián)系客服