九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
第9章 圖形操作

9 圖形操作

學(xué)習(xí)要點(diǎn)
掌握常用圖形控件的使用;
了解坐標(biāo)系統(tǒng);
理解繪圖屬性;
理解圖形方法;

掌握?qǐng)D形操作的應(yīng)用。

重點(diǎn)、難點(diǎn)
直線控件與形狀控件的使用;
坐標(biāo)系統(tǒ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è)置形狀的顏色和填充圖案。

⒈ 直線控件屬性

直線除了具有NameVisible、ParentTag等標(biāo)準(zhǔn)屬性外,還具有以下屬性:

(1) X1Y1、X2Y2屬性。返回或設(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、LeftTop、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

9.2 圖形操作基礎(chǔ)

對(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方向上分為x2x1等分,在y方向上分為y2y1等分。使用Scale方法將自動(dòng)把ScaleMode屬性設(shè)置為0。

例如,將窗體Form1的左上角和右下角設(shè)置為(100,100)(200,200),則窗體為100單位寬和100單位度:

Form1.Scale(100, 100) - (200, 200)

左上角的水平和垂直坐標(biāo)可以分別用ScaleLeftScaleTop來指定,右下角水平和垂直坐標(biāo)則可以用ScaleWidthScaleHeight指定。例如下述代碼:

Form1.ScaleLeft = 100

Form1.ScaleTop = 100

Form1.ScaleWidth = 200

Form1.ScaleHeight = 200

與上面Form1Scale方法指定效果是一樣的。

CurrentXCurrentY屬性用于表示當(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ì)算出ScaleLeftScaleTop,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,ScaleWidthScaleHeight四項(xiàng)屬性來定義坐標(biāo)系。對(duì)象左上角坐標(biāo)為(ScaleTop,ScaleLeft),右下角坐標(biāo)為(ScaleLeft+ScaleWidthScaleTop+ScaleHeight)。根據(jù)左上角和右下角坐標(biāo)值的大小自動(dòng)設(shè)置坐標(biāo)軸的正向。X軸與Y軸的度量單位分別為1/ScaleWidth1/ScaleHeight。例如,設(shè)置窗體的四項(xiàng)屬性為:

Form1.ScaleLeft = -200

Form1.ScaleTop = 250

Form1.ScaleWidth = 500

Form1.ScaleHeight = -400

窗體Form1的左上角坐標(biāo)為(-200250),右下角坐標(biāo)為ScaleLeft+ScaleWidth =300ScaleTop+ScaleHeigh =-150,即(300-150)。X軸的正向向右,Y軸的正向向上。其效果與上圖相同。

9.3 繪圖屬性

一個(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ù)與窗體的WidthHeigth屬性相乘,產(chǎn)生CurrentX、CurrentY的值。由于Rnd函數(shù)產(chǎn)生的值在01之間,故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的值大于1DrawStyle屬性值為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

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(00,0)返回黑色;而RGB(255,255255)返回白色。

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 BasicRGB系統(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 = RGB0, 0, 255

的含義是一樣的。

4. 使用顏色常數(shù)

Visual Basic 將經(jīng)常使用的顏色值定義為內(nèi)部常數(shù),顏色常數(shù)包括:vbBlack、vbRedvbGreen、vbYellow、vbBlue、vbMagenta、vbCyanvbWhite等,這些常數(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

9.4 圖形方法

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ù)。

2Step為可選關(guān)鍵字,指定相對(duì)于由CurrentXCurrentY屬性提供的當(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è)置后,CurrentXCurrentY位置移到了(1000,1000),

圖9.10 是否入關(guān)鍵字Step的比較

畫出第二個(gè)點(diǎn)時(shí)對(duì)左邊的例子沒有影響(還是以原點(diǎn)為起點(diǎn)),但是由于右邊加了Step關(guān)鍵字,則是以CurrentXCurrentY為參考點(diǎn)畫出的坐標(biāo)(1000,2000)這個(gè)點(diǎn),此點(diǎn)相對(duì)于窗體原點(diǎn)來說坐標(biāo)值為(2000,3000)。

3Color用于為該點(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屬性值。將Form1BackColor屬性修改為黑色。編寫計(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)位于由CurrentXCurrentY指示的位置。帶Step關(guān)鍵字表示與當(dāng)前坐標(biāo)的相對(duì)位置。

2B為可選項(xiàng)。省略此項(xiàng)是畫直線,如果選擇B則以(x1,y1)為左上角坐標(biāo)、(x2,y2)為右下角坐標(biāo)畫出矩形。F選項(xiàng)規(guī)定矩形以矩形邊框的顏色填充。

執(zhí)行Line方法后,CurrentXCurrentY屬性被設(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)位置。其范圍從-。起點(diǎn)的缺省值是0,終點(diǎn)的缺省值是。正數(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,PictureBoxPrinter上繪制出圖形文件的內(nèi)容,圖形文件類型包括.bmp,.ico.wmf,.emf.cur,.ico.dib等。PaintPicture的一般格式為:

[對(duì)象.]PaintPicture 圖形,x1,y1[,寬度1[,高度1,x2[,y2[,寬度2[,高度2[,位操作常數(shù)]]]]]]

說明:

(1) 圖形:指圖形文件,可以是FormPictureBoxPicture屬性指定的圖形文件。

(2) x1y1:指在對(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)屬性改變字體字符,并且可以使用ScaleWidthScaleHeight屬性以及圖片框的TextWidthTextHeight方法將文本在圖片框中顯示出來。

9.4.6 Point方法

Point方法用于返回窗體或圖形框上指定點(diǎn)的RGB顏色,其語法格式為:

[對(duì)象.]Point (x, y)

如果由(x,y)指定的點(diǎn)在對(duì)象外面,Point方法返回一個(gè)-1False)。

例如,用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 綜合應(yīng)用

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_ClickIndex 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 * Sint

Picture1.PSet xt + oldx, oldy - yt, RGB0, 127, 127

Next

Case 1

For t = -oldx To oldx Step 0.01

xt = 10 * t

yt = 10 * Cost

Picture1.PSet xt + oldx, oldy - yt, RGB0, 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, RGB255, 0, 0

Picture1.Line 0, oldy-.ScaleWidth, oldy, RGB255, 0, 0

End With

Picture1.CurrentX = oldx - 4

Picture1.CurrentY = oldy + 0.5

Picture1.Print 0

'x軸的刻度

For xt = -Intoldx To Intoldx 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, RGB255, 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, RGB255, 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è)命令按鈕Command14個(gè)形態(tài)控件Shape1(大圓)、Shape2(滑塊)Shape3(圓周上的動(dòng)點(diǎn))、Shape4(圓心),若干直線Line1(半徑)Line2(連桿),一個(gè)計(jì)時(shí)器Timer1。并將Timer1Interval屬性值設(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,MinuteHour函數(shù)把系統(tǒng)時(shí)間Time分離成“秒”、“分”和“時(shí)”,再利用定時(shí)器控件把時(shí)間處理成圖形,其中時(shí)針、分針、秒針和刻度的定位需要用三角函數(shù)來處理。

首先在窗體中添加1個(gè)Shape控件和3個(gè)直線控件。把3個(gè)Line控件的Name屬性分別改為Lineh,LinemLines,再把他們的BorderWidth屬性分別改為321,BorderColor屬性分別改為紅色、藍(lán)色和紫色。然后把Shape1BorderWidth屬性改為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è)圖片(該圖片置于FormPicture屬性中),如圖9.22所示,進(jìn)行變灰的處理,處理效果如圖9.23a);單擊按鈕Command2,則進(jìn)行銳化處理, 處理效果如圖9.23b)。

進(jìn)行變灰的處理的方法是,用GetPoint()方法得到某點(diǎn)的顏色值,然后利用公式:

y = 0.299 * r + 0.587 * g + 0.144 * b

得到該點(diǎn)的亮度值,并用RGByy,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

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
《Visual Basic程序設(shè)計(jì)(第4版)》第11章 圖形與圖像設(shè)計(jì)
VBA常用代碼解析(第三十二講)
適用于 Visual Basic 6.0 用戶的 TextBox 控件
計(jì)算機(jī)技術(shù)基礎(chǔ)(第十一章 圖形設(shè)計(jì) )
第六章 圖形設(shè)計(jì)
VBA窗體之進(jìn)度條 | VBA實(shí)例教程
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服