松岡VB2010-ch06(6219 KB )

Download Report

Transcript 松岡VB2010-ch06(6219 KB )

第六章 重覆結構
本章投影片僅供本書上課教師使用,非經同意請勿拷貝或轉載
6-1 計數迴圈
敘述區段
程式中具有特定功能的連續多行敘述
 重複結構
敘述區段需要在程式中某處執行多次時,便需
要利用重複結構來完成
 使用重複結構可縮短程式的長度及易維護。
 重複執行的敘述區段稱為 迴圈 (Loop)。

VB 提供的迴圈:
計數迴圈
程式中某個敘述區段重複執行的次數是可計數,
且已知初值、增值和終值。
 語法:

必須是數值變數
常數、數值變數或數值運算式
[ ]表示可省略
從迴圈中跳出,Exit For 中途離開迴圈
當增值為正時,計數迴圈流程圖
【例1】
寫出變數k 由100 ~ 1,增值為 -1 的
計數迴圈:
For k=100 To 1 Step -1
敘述區段
Next
【例2】
寫出變數 k由10 ~100,增值為 5 計數迴圈
For k = 10 To 100 Step 5
敘述區段
Next
【例3】
求 -1 + -0.5 + 0 + 0.5 + 1.0 + 1.5 + 2.0 總和
For num = -1 To 2 Step 0.5
sum += num
Next
例如 S = 1 + 3 + 5 + … + 99 = 2500
i.e. 初值:1
終值:99
增值:2
如右圖
按鈕1
按鈕2
MsgBox (訊息[, [格式碼][, 標題]])
標題
提示訊息
預設值
MsgBox
' FileName : For.sln
01 Private Sub Form1_Load(ByVal ….. ) Handles MyBase.Load
02
Dim start_num, end_num, step_num, i, sum As Integer
03
start_num = Val(InputBox("請輸入初值(整數):"))
04
end_num = Val(InputBox("請輸入終值(整數):"))
05
step_num = Val(InputBox("請輸入增值(整數):"))
06
For i = start_num To end_num Step step_num
07
sum = sum + i
08
Next
09
MsgBox("初值" & start_num & "到終值" & end_num & _
"增值為" & step_num & "時,總和為" & sum)
10
End
11 End Sub
6-2 條件迴圈
程式中當一個敘述區段重複執行的次數無法預
測時,就需要透過條件式迴圈來解決。
 可依程式需求設定當滿足條件或不滿足條件時,
才執行迴圈內的敘述區段。

VB 提供條件式迴圈基本形式有五種:
一、Do While…Loop (前測式迴圈)
前測式迴圈
表示先判斷是否滿足
條件?若滿足條件,
就執行敘述區段一次,
一直到不滿足條件時
才離開迴圈。
 語法:

二、Do Until…Loop (前測式迴圈)
語法:Do Until <條件>
敘述區段
[Exit Do]
Loop
功能:
執行前先判斷是否不
滿足條件,若不成立
才進迴圈。
三、Do … Loop While (後測式迴圈)
語法:
Do
敘述區段
[Exit Do]
Loop While <條件>
功能:
先進入迴圈執行敘述
區段後,再判斷條件
是否成立, 成立時就
要再進入迴圈。
四、Do … Loop Until (後測式迴圈)
語法:
Do
敘述區段
[Exit Do]
Loop Until <條件>
功能:
先進入迴圈執行敘述
區段後,再判斷條件
是否不成立,不成立
再進入迴圈。
五、Do … Loop (無窮迴圈)
語法:
Do
敘述區段
[Exit Do]
Loop
功能:
在迴圈頭尾沒條件作判斷,一旦執行便無止盡的
迴圈。
【注意】
無窮迴圈發生後,程式在迴圈一直繞,除非迴圈
內有Exit Do敘述才能跳離迴圈。
若發生無窮迴圈,可按Ctrl+Break 鍵中斷程式
執行。
VB可使用Random類別的Next方法來
隨機產生指定範圍的數字,語法如下
Dim 亂數物件 As New Random
Dim 亂數變數 As Integer =亂數物件.Next(最小值, 最大值+1)
如本例,寫法如下 :
Dim rndObj As New Random
Dim rndNo As Integer = rnd.Obj.Next( 1 , 11 )
使用If敘述檢查猜對與否?若猜對則顯
示猜對訊息,若猜錯則可使用 IIf 函式
顯示往大或往小哪邊猜提示訊息,使用
後測試迴圈,而且至少需要再猜一次。
如流程圖。
' FileName : DoLoop.sln
01 Private Sub Form1_Load(ByVal sender …. ) Handles MyBase.Load
02
Dim ans, guess_num, times As Integer
03
Dim rnd_obj As New Random
04
ans = rnd_obj.Next(1, 11) ‘亂數變數=亂數物件.Next(最小值, 最大值+1)
05
Do
06
guess_num = Val(InputBox("請輸入1-10之間的數字:", "猜數字"))
07
If guess_num <> ans Then
08
times += 1
09
MsgBox(IIf(guess_num > ans, "數字太大,小一點!", _
10
"數字太小,大一點!") , , " DoLoop " )
11
End If
12
Loop Until guess_num = ans
13
MsgBox("你答對了!共猜了" & (times + 1).ToString() & "次",, "DoLoop")
14
End
15 End Sub
6-3 巢狀迴圈(Nested Loop)
是指一個程式中,迴圈裡還有迴圈稱為「巢狀迴
圈」。
 二維表格:九九乘法表或是有規則性表格等都可
用「巢狀迴圈」。如下圖,在表單上以巢狀For
迴圈將結果以MsgBox輸出對話方塊敘述顯示。

【問題分析】
1. i=1 第1列,k由1至i=1,分別顯示k値1,換行
2. i=2 第2列,k由1至i=2,分別顯示k値1,2,換行
3. i=3代表第3列,k由1至i=3,分別顯示k値1,2,3
換行。
4. i=4代表第4列,k由1至i=4,分別顯示k値
1,2,3,4,換行。
5. i=5代表第5列,k由1至i=5,分別顯示k値
1,2,3,4,5,換行。
6. 歸納以上規律
外層迴圈i=1~5
內層迴圈 k=1~i
' FileName : NestFor.sln
01 Private Sub Form1_Load(ByVal sende … Handles MyBase.Load
02
Dim i, k As Integer
03
Dim str1 As String = ""
04
For i = 1 To 5
05
For k = 1 To i
06
str1 &= k
07
Next
08
str1 &= vbNewLine ' 換行
09
Next
10
MsgBox(str1)
11
End
12 End Sub
6-4 圖片方塊 PictureBox
一、圖片方塊控制項常用的屬性
二、圖片方塊接受的常用圖形檔格式
圖片方塊控制項的 Image 屬性可接受下列圖形格式,可依
程式需求來選擇需要的圖形格式:
 Bitmap圖檔
附檔名為 .BMP,屬於非壓縮點矩陣圖形,縮放會失真。
 GIF
附檔名為 .GIF,屬於壓縮過的圖形檔。以GIF格式存放
的圖形檔可製作動畫,也可設定透空色。
 JPEG
附檔名為 .JPG,是屬於壓縮過的圖形檔,主要用來存放
實體的圖片。
 Icon
附檔名為 .ICO,為壓縮點矩陣圖形,主要當小圖示。
 MetaFile
附檔名為 .WMF,為向量圖形,圖形縮放不失真。
三、如何將圖檔置於圖片方塊控制項

Step1 由工具箱拖曳一個PictureBox圖片方塊控制項
到表單上,該控制項預設名稱為「PictureBox1」。

Step2 點選「PictureBox1」成為作用控制項,再由屬
性視窗點選Image屬性上 鈕出現「選取資源」對話方
塊,來設定圖片方塊圖檔的路徑與檔名。

Step3 在「選取資源」對話方塊中
點選「專案資源檔(P) 」選項按鈕,再按匯入鈕出現
「開啟」對話方塊。如次頁圖。
若點選「本機資源(L) 」選項按鈕,不會加入到方案
資料夾,日後拷貝時應將圖檔與路徑同時複製。
 選取圖形檔後按 開啟舊檔鈕,圖檔就加入該方案資料
夾下的Resources資源資料夾內。操作步驟如下 :



若要更換圖片,請依照上述步驟再操作一次。
若要刪除圖片方塊控制項中的圖片,請在Image屬性上
按右鍵,然後執行快顯功能表中「重設(R)」指令。
使用此種方式由圖片方塊控制項載入圖片後,VB會將
圖檔拷貝一份放在程式中。若要修改圖形檔,圖片方塊
控制項內的圖片仍是舊圖,並不受影響。若要更新圖檔,
就必須重新設定屬性值。
四、如何在程式執行階段設定圖片方塊
1. Image.FromFile方法
在執行階段,利用 Image.FormFile方法來設定
圖形檔到指定的控制項上面。(檔名要包含完整的
路徑)。
語法:
PictureBox1.Image = Image.FromFile("檔名")
功能:
將指定圖檔載入到圖片方塊的Image屬性。
【例】將C根目錄下abc.bmp圖形檔載入到
picTest圖片方塊中。如
picTest.Image = Image.FromFile("c:/abc.bmp")
2. 移除圖檔
在程式執行階段移除 PictureBox1上的圖檔。
寫法:
PictureBox1.Image = Nothing
3. Point物件
要改變控制項的Location屬性可用Point物件。
語法:
Object.Location=New Point(X,Y)
功能:
將物件移動到指定的X、Y座標位置上。
【例】picTest.Location = New Point(30,50)
4. Size物件
若要透過控制項的Size屬性來調整控制項的大小,
可使用Size物件來達成,其語法如下:
語法:
Object.Size = New Size(Width, Height)
功能:
將物件設定為指定長度的寬和高。
【例】將picTest圖片方塊的寬度和高度各縮小一半
picTest.Size = New Size(picTest.Width/2,picTest.Height/2)
【問題分析】
1. 應建立那些控制項
本例要求圖片方塊顯示gif動畫檔,需在表單上
建立圖片方塊控制項。
需使用兩個按鈕控制項來控制直升機朝左或右
飛行。
2. 程式開始執行預設機頭朝右原地飛等待按鈕指示,
此部分程式碼應寫在表單的Load事件處理程序:
使用Image.FromFile方法載入機頭朝右
picR.gif動畫檔。
使用圖片方塊的SizeMode屬性設定自動調整和
圖片一樣大小。
【問題分析】(續)
3. 按 鈕,直升機朝右方飛一段距離,此部分的程式碼
應寫在此按鈕的Click事件處理程序 :
先將直升機朝右方動畫載入到圖片方塊控制項上。
將目前圖片方塊左上角水平座標PictureBox1.Left
當For迴圈的初值。
需要向右飛150Pixels,以(PictureBox1.Left+150)
當迴圈終值。
每次移動1 Pixel,終值大於初值,增設值為正值。
For迴圈中每移動一次位置,除了必須將新座標使用
New Point指定給圖片方塊控制項外,要記得使用
Me.Refresh()方法讓表單能重新繪製,如此才能看
到PictureBox1圖片方塊內的直升機有移動效果。
【問題分析】(續)
4. 按 鈕,直升機朝左方飛一段距離,此部分的程式碼
應寫在此按鈕的Click事件處理程序 :
先將直升機朝左方動畫載入到圖片方塊控制項上。
將目前圖片方塊左上角水平座標PictureBox1.Left
當For迴圈的初值。
需要向左飛150Pixels,以(PictureBox1.Left-150)
當迴圈終值。
每次移動1 Pixel,終值小於初值,增設值為負值。
For迴圈中每移動一次位置,除了必須將新座標使用
New Point指定給圖片方塊控制項外,要記得使用
Me.Refresh()方法讓表單能重新繪製,如此才能看
到PictureBox1圖片方塊內的直升機有移動效果。
【問題分析】(續)
5. 由於本例只有兩張動畫圖做切換且圖檔較小,每
次變換圖檔才由磁碟機中載入圖檔不會有延遲現
象,所以可以只用一個圖片方塊控制項輪流來更
換圖片。
6. 使用多張連續動作圖檔構成動畫時,如何產生動
畫為使動畫順暢,建議事先將動畫檔依序置入多
個圖片方塊控制項(此時動畫檔已存放在記憶體中
而不是硬碟中)。動畫開始時,先將Visible屬性設
為隱藏看不見,再將這些圖片方塊上的動畫依序
置入指定展示的圖片方塊中,就可產生原地動畫 ;
若展示時順便移動圖片方塊位置,就產生會移動
的動畫。
C:\Documents and Settings\user\Local Settings\Application Data\
Temporary Projects\PictureBox\bin\Debug
【上機】
1. 建立表單
專案名稱命名為『PictureBox』。
本例由程式執行階段動態載入指定的圖檔,請將書
附光碟images資料夾下的PicL.jpg及PicR.jpg兩張
圖檔放入目前專案的bin/Debug資料夾下,使上述
兩張圖與執行檔置於相同路徑下,以方便透過程式
載入圖檔。
在表單內,建立如次頁圖所示控制項 :
【上機】(續)
2. 設定各物件的屬性 :
預設名稱
Name
Text標題
Image圖片
Button1
btnL
左
--
Button2
btnR
右
--
PictureBox1
PictureBox1
--
--
' FileName : PictureBox.sln
01 Private Sub Form1_Load(ByVal sender . ) Handles MyBase.Load
02
PictureBox1.Image = Image.FromFile("PicR.gif") ‘載入圖片
03
PictureBox1.SizeMode = PictureBoxSizeMode.AutoSize
04 End Sub
05 '------------------------------------------------------------------------------------06 Private Sub btnL_Click(ByVal sender … ) Handles btnL.Click
07
PictureBox1.Image = Image.FromFile("PicL.gif")
08
Dim x, x1 As Integer
09
x1 = PictureBox1.Left
‘記錄圖片方塊目前的X座標
10
For x = x1 To x1 - 150 Step -1‘終值小於初值,圖形向左移動
11
PictureBox1.Location = New Point(x, 50)
12
Me.Refresh() ‘讓表單重新繪製,才看的到圖片方塊移動的效果
13
Next
14 End Sub
16 Private Sub btnR_Click(ByVal sender … ) Handles btnR.Click
17
PictureBox1.Image = Image.FromFile("PicR.gif")
18
Dim x, x1 As Integer
19
x1 = PictureBox1.Left
20
For x = x1 To x1 + 150 Step 1‘終值大於初值,圖形向右移動
21
PictureBox1.Location = New Point(x, 50)
22
Me.Refresh() ‘讓表單重新繪製,才看的到圖片方塊移動的效果
23
Next
24 End Sub
6-5 變數的生命週期





變數在程式中,因宣告位置不同有效範圍不同。
變數若超過有效範圍,自動將變數由記憶體中
釋放掉。
區域變數 (Local Variable)
在程序內所宣告的變數,若沒特別宣告均屬之。
區域變數有效範圍
僅限該程序,離開該程序自動由記憶體中釋放
掉
不同的程序允許有名稱相同的區域變數,兩者
區域變數視為不相干的變數。





若兩個程序中要共同參用一個變數名稱,必須
將此變數宣告在類別(Class)內所有程序外。
由於VB屬於物件導向程式語言,將宣告於類別
內的變數稱為「欄位變數」或「屬性」。
若程序中一個變數的結果必須傳給另一個程序
使用時,此變數就必須宣告於程序外。
在表單檔中,欄位變數(或稱屬性) 必須宣告在
所有程序的外面
區域變數在程序內或If / For程式區塊內。
在var.sln範例中
 FieldX欄位變數
有效範圍限於整
個Form1表單類
別。
 程序內宣告
LocalX區域變
數有效範圍限
Button1_Click
事件處理程序內
 For迴圈內宣告
了ForX區域變
數有效範圍只限
於For迴圈區塊
內。
因為FieldX欄位變數有效範圍涵蓋整個Form1表
單,所以,Form1_Load及Button1_Click事件處
理程序可以一起用。因此,若連續按
鈕會發
現FieldX欄位變數都會保留前一次所記錄的值。
Var.sln執行結果如下 :
6-6 計時器 Timer

傳統 BASIC 語言使用迴圈需使用迴圈來控制
時間長短、顯示目前時間,或讓一張圖片能每
隔固定時間移動。所以,不同電腦的 CPU速度
不同,相同迴圈敘述會得到不同時間延遲。

VB的計時器(Timer)工具,不必用迴圈便可解
決上述問題。

計時器控制項是屬於非視覺化控制項。控制項
在編輯程式階段看得到,程式執行時卻看不到
此控制項。
Timer 計時器(續)
此控制項時建在表單正下方。
 屬幕後執行,未提供 Height 或 Width屬性來
設定該控制項的大小。

程式範例
試透過Timer計時器控制項製作一個可連續反覆
播放五張圖片的播放程式。
(圖片檔名:img1.jpg~ img5.jpg)
按
鈕時,啟動計時器,每隔兩秒播放一
張圖。
按
鈕時,即停止計時器不播放圖檔。
【問題分析】
1. 為方便呼叫圖檔,檔名以最後面數字來區分,故宣
告一個欄位變數 n 做為圖檔編號,將此變數置於所
有事件處理程序之外。
2. 執行Form1_Load事件處理程序設定相關初值
先顯示img1.jpg第一張圖片,將變數n設為1。
要求每隔兩秒更換圖片,故將Interval屬性設為
2000。
為避免五張圖片大小不一,須調整圖片與圖片控
制項同大小,避免播放時圖片跳來跳去。將圖片
方塊的SizeMode屬性值設為StrechImage。
使用Image.FromFile方法載入第一張圖片於圖片
方塊控制項上。
【問題分析】(續)
3. 於計時器每兩秒執行的Timer_Tick事件處理程序內
設定n累加1,使PictureBox1顯示第 n 張圖 ; 若目前
n 大於等於5,則令 n 等於1。
4. 如何啟動計時器
本例要求按
鈕時,才啟動計時器,故將計時器
的Enabled屬性設為True的程式碼寫在
btnPlay_Click事件處理程序中。
5. 每隔兩秒更換圖片的工作寫在Timer_Tick事件處理:
將圖片編碼 n 加1。
檢查圖片編碼 n 是否超過5?若超過5,則將圖片編
號n 設為1,重新開始播放。
使用Image.FromFile方法顯示圖片編號n 所指定
的圖片。
【問題分析】(續)
6. 按
鈕執行 btnStop_Click事件處理程序,在
該程序內將Timer1計時器的Enabled=False 關閉
計時器,停止呼叫Timer1_Tick事件處理程序。
C:\Documents and Settings\user\Local Settings\Application Data\
Temporary Projects\Timer\bin\Debug
【上機】
1. 建立表單
專案名稱命名為『Timer』。
本例每次播放時都由磁碟機動態載入指定的
圖檔,請將書附光碟images資料夾下的
img1.jpg~img5.jpg 五張圖檔複製到目前專
案的bin/Debug資料夾下,使圖片與執行檔
置於相同路徑下,以方便透過程式載入圖檔。
在表單內,建立如次頁圖所示控制項 :
Timer1
【上機】(續)
2. 設定各物件的屬性 :
預設名稱
Name
Text標題
Image圖片
Timer1
Timer1
--
--
Button1
btnPlay
播放
--
Button2
btnStop
停止
--
PictureBox1
PictureBox1
--
--
' FileName : Timer.sln
01 Dim n As Integer ' 宣告n為欄位變數, 宣告於所有事件處理程序外
02 ' ----------------------------------------------------------------------------------------03 Private Sub Form1_Load(ByVal … ) Handles MyBase.Load
04 n = 1
05 Timer1.Interval = 2000 ' 兩秒執行Timer_Tick事件處理程序一次
06 PictureBox1.Image = Image.FromFile("img" & n.ToString & _
".jpg")
07 PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage
08 End Sub
09 ' ----------------------------------------------------------------------------------------10 Private Sub Timer1_Tick(ByVal sender … ) Handles Timer1.Tick
11 n += 1
12 If n >= 5 Then
13
n=1
' 從第1張開始
14 End If
15 PictureBox1.Image = Image.FromFile("img" & n.ToString _
& ".jpg")
16 End Sub
17 ' ---------------------------------------------------------------------------------18 Private Sub btnPlay_Click(ByVal sender …. ) Handles _
btnPlay.Click
19 Timer1.Enabled = True
' 啟動計時器
20 End Sub
21 ' --------------------------------------------------------------------------------22 Private Sub btnStop_Click(ByVal sender … ) Handles _
btnStop.Click
23 Timer1.Enabled = False
' 不啟動計時器
24 End Sub
6-7 影像清單 ImageList
圖片方塊控制項只能置入一張圖,若希望同時置
入多張圖片,再依需求指定顯示哪張圖就需用影
像清單工具。
 圖片方塊和影像清單工具都是將圖片由硬碟事先
載入到主記憶體中,使得圖片能快速顯示。
 由於影像清單控制項可存放多張圖片,所以無法
直接顯示圖形,必須透過含有ImageList屬性的
控制項來顯示圖片。
 由於影像清單可同時指定給多個含有ImageList
屬性的控制項共同使用,可省略控制項須載入圖
片的困擾。


也可將「影像清單」控制項物件的Images屬
性值指定給「圖片方塊」控制項的Image屬性
值只要影像清單內圖片清單的索引值有改變,
就將該索引値指到的圖片置入圖片方塊上。
語法:
PictureBox1.Image = ImageList1.Images(Index)
功能:
將影像清單上指定索引値的圖檔置於圖片方
塊控制項上面 (Index値是由0開始計數)
一、影像清單控制項的建立
1. 將ImageList 控制項放入表單下方,出現預設名稱。
點按ImageList1即出現屬性窗格。點按Images屬性
質右方的
鈕,開啟對話方塊。
2.在「影像集合編輯器」對話方塊中按
鈕,
會出現「開啟」對話方塊。選取圖形檔所在的資料
夾,在圖檔名稱上快按兩下,此時要使用的圖片即
載入影像清單控制項內。反覆上述步驟就可以加入
多張圖片。
3.若要刪除圖片,只要點選該圖然後按
鈕即可。
4.若要調整圖片順序可按 和 鈕來上移或下移圖片。
5.最後按
鈕即可完成加入圖片的工作。
二、影像清單控制項常用的屬性
三、影像清單控制項使用的圖片檔格式
影像清單控制項適用的圖形格式和圖片方塊控
制項物件相同。
 圖片載入到影像清單控制項後,大小會調整和
ImageSize 屬性值一樣大小。
 載入的圖片最好大小要一致,至少比例要相似,
以免顯示圖片時會變形(失真)。

【問題分析】
1. 應建立那些控制項
本例要求將fly1.jpg和fly2.jpg兩張蝴蝶圖片
先置入影像清單控制項,因此需在表單上建
立ImageList影像清單控制項,再將兩張圖片
分別載入影像清單控制項的Image(0)和
Image(1)屬性集合。
欲展示蝴蝶飛舞,需在表單上建立圖片方塊
控制項來展示圖片。
每隔一秒更換圖片和移動圖片位置,需在表
單建立Timer計時器控制項。
【問題分析】(續)
2. 應設定那些變數和更改屬性值
影像清單控制項內ImageSize圖示大小屬性
值要和圖片方塊控制項的Size屬性值一致,
均設為(60, 60)。
設定一個布林變數方便切換圖片,由於此變
數進出事件處理程序時須保留參用,將它設
為欄位變數,變數名稱為pic。
3. 表單載入時執行Form1_Load事件處理程序應
做哪些事情
Timer的Interval屬性設為1000,即1秒週期。
Timer的Enabled屬性設為True來啟動Timer。
【問題分析】(續)
4. Timer每隔1秒會執行Timer的Tick事件 :
更換圖片
 將pic變數的布林值互換(即True
False)
 透過IIf(pic , 0 , 1)取得影像控制清單控制項
Images的索引值
若pic=True取得索引值0,
Images(IIf(pic , 0 , 1)) Images(0)
若pic=True取得索引值1,
Images(IIf(pic , 0 , 1)) Images(1)
 將影像清單Images(Index)屬性對應的圖片指定給
圖片方塊的Image屬性,便可將圖片顯示在圖片方
塊上 :
picButterfly.Image=imgButterfly.ImagesImages(IIf(pic , 0 , 1))
【問題分析】(續)
變更圖片方塊位置
 產生兩個介於-10和10間的整數亂數,限制移
動間距。
 分別和圖片方塊左上角的座標相加,取得最
新圖片方塊左上角座標。
 使用Point物件將圖片方塊控制項左上角移到
新座標,而產生移動效果。
【上機】
1. 建立表單
專案名稱命名為『ImageList』。
在表單內,建立如下圖所示控制項 :
【上機】(續)
2. 設定各物件的屬性 :
預設名稱
Name
PictureBox1
picButterfly
ImageList1
imgButterfly
--
Timer1
Timer1
--
Image
Size
(預設值) 60, 60
imageSize Enabled
--
(預設值)
--
60, 60
--
--
--
Flase
【註】imgButterfly的Images屬性如前面影像清
單控制項建立方式載入fly1.gif和fly2.gif兩個
圖片檔,圖片檔置於書附光碟的images資料
夾下。
' FileName : Imagelist.sln
01 Dim pic As Boolean ‘ 欄位布林變數,用來進出Timer1_Tick事件保留舊值
02 ' ---------------------------------------------------------------------------------------------------03 Private Sub Form1_Load(ByVal sender … ) Handles MyBase.Load
04 Timer1.Interval = 1000‘ 每隔1秒執行Timer_Tick事件處理程序一次
05 Timer1.Enabled=True ‘ 啟動Timer
06 End Sub
07 ' ---------------------------------------------------------------------------------------------------08 Private Sub Timer1_Tick(ByVal sender … ) Handles Timer1.Tick
09
Dim rndNo As New Random ‘宣告rndNo屬於Random類別的變數
10
Dim x, y As Integer
‘存放圖片方塊左上角座標
11
pic = Not pic ‘ 改變pic值, pic為布林變數,只有True/False兩種狀態
12
picButterfly.Image = imgButterfly.Images(IIf(pic, 0, 1)) ‘pic為True選0
‘否則選1
13
x = picButterfly.Left + rndNo.Next(-10, 11) ‘寬度移動間距,-10到10亂數
14
y = picButterfly.Top + rndNo.Next(-10, 11) ‘高度移動間距
15
picButterfly.Location = New Point(x, y) ‘重設picButterfly圖片方塊位置
16 End Sub
6-8 捲軸 ScrollBar
當開啟視窗,若資料超出視窗範圍時,馬上會出現
捲軸,供上下或左右捲動以顯示資料。
VB提供垂直捲軸(Vertical Scroll Bar)和水平捲軸
(Horizontal Scroll Bar)工具來使用。
下圖是捲軸控制項的各個按鈕說明 :
二、捲軸控制項常用的事件
當使用者正在拖曳捲動鈕時會觸動該捲軸的
Scroll事件
 當放開捲動鈕時會觸動該捲軸的
ValueChanged事件。
 如希望正拖曳捲動鈕時捲軸的設定值能同步跟
著顯示,就需要將相關的程式碼寫在Scroll事
件處理程序中。
 如希望拖曳完畢放開滑鼠後才顯示設定值,程
式碼就需寫在Value Changed事件處理程序中。

6-9 數字鈕 NumericUpDown
NumericUpDown數字鈕控制項除了可使用
上下按
鈕來調整數值外,也可讓使用者由鍵盤輸入一個數
值,以避免輸入布正確數字或數字超出範圍。
一、數字鈕控制項常用的屬性
二、數字鈕控制項常用的事件

ValueChanged事件
當使用者按上、下鈕或直接輸入數值後,都會
觸動ValueChanged事件 。
C:\Documents and Settings\user\Local Settings\Application Data\
Temporary Projects\NumericUpDown\bin\Debug
【問題分析】
1. 應建立那些控制項
要求圖片以面板當容器,須先建立Panel控制項。
圖片置於圖片方塊控制項上面,然後需在面板上建
立圖片方塊控制項。
由於圖片方塊放在面板內,若圖片大於面板,則面
板會遮蔽圖片,須建立水平和垂直捲軸控制項供上
下左右瀏覽。
本例以數字按鈕切換圖片,須建立數字按鈕控制項。
2. 將上述三個圖片檔由Images資料夾拷貝到目前專
案的bin/Debug資料夾中,以方便程式載入到圖片方
塊上。
【問題分析】(續)
3. 應設定那些變數和更改屬性值
設定面板Size屬性大小為240*240(寬*高)。
由於圖片方塊置於面板上,且因為三張圖片均為
640*480,所以必須將圖片方塊控制項的SizeMode屬
性設為AutoSize,讓圖片方塊控制項能容納整張圖片。
圖片超出面板部分使用捲軸來瀏覽。
設定數字鈕的Minimum(最小值)和Maximum(最大
值)屬性值分別為1和3。
4.表單載入執行Form1_Load處理程序應做哪些事情?
本例要求先顯示picture2.jpg圖片,所以將數字按鈕
控制項的Value屬性值設為2,經
「"picture"&"nudPicture.Value&".jpg"」字串合併成
picture2.jpg。再透過Image.FromFile方法載入此圖
片到圖片方塊上面。
【問題分析】(續)
5. 切換圖片由數字鈕控制項的ValueChanged事件處理
當在數字鈕按一下會觸動該鈕的ValueChanged事
件,將取得數字置入Value屬性,同上一步驟將指定的
圖片顯示到圖片方塊上面。
將圖片方塊的左上角定在面板的左上角。
設定水平卷軸的上界(Max.)和下界(Min.)範圍
Max. =圖片控制項的寬度(即圖片寬度)減面板的寬度
Min. = 0
設定垂直卷軸的上界(Max.)和下界(Min.)範圍
Max. =圖片控制項的高度(即圖片高度)減面板的高度
Min. = 0
預設捲軸停在下界的位置
水平捲軸.Value=0
垂直捲軸.Value=0
【問題分析】(續)
6. 拖曳水平捲軸會觸動該捲軸的scroll事件,將圖片
發生水平捲軸的程式碼寫在此事件處理程序中 :
當水平捲軸往右捲時,圖片發生左捲效果,此時捲
軸的Vaule 值改變,相當於圖片控制項左上角往左移
動的水平距離,寫法如下 :
picPicture.Left = - hsbWidth.Value
7. 拖曳垂直捲軸會觸動該捲軸的scroll事件,將圖片
發生上下捲動的程式碼寫在此事件處理程序中 :
當垂直捲軸往下捲時,圖片發生上捲效果,此時捲
軸的Vaule 值改變,相當於圖片控制項左上角往上移
動的水平距離,寫法如下 :
picPicture.Top = - vsbHeight.Value
【上機】
1. 建立表單
專案名稱命名為『NumericUpDown』。
將書附光碟images資料夾下的picture1.jpg、
picture2.jpg、picture3.jpg 放在目前專案的
bin/Debug 資料夾下。
在表單內,建立如下圖所示控制項 :
【上機】(續)
2. 設定各物件的屬性 :
預設名稱
Name
Text
Size
SizeMode
Max./
Min.
Panel1
(預設值)
--
240, 240
--
--
PictureBox1
picPicture
--
(預設值)
60, 60
--
HScrollBar1
hsbWidth
--
240, 16
--
--
VScrollBar1
vsbHeight
--
16, 240
--
--
Label1
(預設值)
切換圖片
(預設值)
--
--
NumericUpDown1
nudPicture
--
33, 22
--
3/1
' FileName : NumericUpDown .sln
01 Private Sub Form1_Load(ByVal sender …. ) Handles MyBase.Load
02
nudPicture.Value = 2 ‘ 載入2號圖片
03 End Sub
04 ' ---------------------------------------------------------------------------------------------05 Private Sub nudPicture_ValueChanged(ByVal sender … ) Handles
nudPicture.ValueChanged ‘第5~14行Value屬性值改變時先載入相對圖檔
06
picPicture.Image = Image.FromFile("picture" & nudPicture.Value _
& ".jpg")
07
picPicture.Location = New Point(0, 0) ‘圖片方塊左上角座標置於面板左上角
08
hsbWidth.Maximum = picPicture.Width – 240 ‘根據圖片寬度重設面板寬度
09
hsbWidth.Minimum = 0
10
hsbWidth.Value = 0
11
vsbHeight.Maximum = picPicture.Height - 240‘根據圖片高度重設面板高度
12
vsbHeight.Minimum = 0
13
vsbHeight.Value = 0
14 End Sub
16 Private Sub hsbWidth_Scroll(ByVal sender … ) Handles _
hsbWidth.Scroll
17
picPicture.Left = -hsbWidth.Value ‘根據hsbWidth的Value
18 End Sub ‘屬性值,來重設picPicture的Left值。加上負號就是將
19 ‘ -------------------- ‘圖片移出面板範圍外
------------
20 Private Sub vsbHeight_Scroll (ByVal sender …. ) Handles _
vsbHeight.Scroll
21
picPicture.Top = -vsbHeight.Value
22 End Sub
6-10 實例
【問題分析】
1. 使用Timer計時器控制項的Enabled屬性,來設定
足球是否移動。
2. 當足球碰到邊框時,只要改變X、Y值的正負,就可
達成足球彈跳的效果。
3. 檢查足球是否是否碰到右邊界時,不要忘記要扣掉
足球球體的寬度。檢查足球是否碰到下邊界時,除
了扣掉足球的寬度外還要扣掉表單的標題欄高度。
4. X和Y座標必須宣告在所有事件處理程序之外,以供
程序中各程序參用。每隔0.1秒執行tmrBall計時器的
Tick事件處理程序,將X和Y座標各加5Pixels,再檢
查足球是否有碰到上、下、左、右邊界,若有就變
更相關的座標。
【問題分析】(續)
5. 如下即是碰到上、下、左、右邊的處理方式。
【上機】
1. 建立表單
專案名稱命名為『Ball』。
使用書附光碟images資料夾下的ball.gif,載入
PictureBox1的Image項下。
在表單內,建立如下圖所示控制項 :
Timer1
(tmrBall)
【上機】(續)
2. 設定各物件的屬性 :
預設名稱
Name
Text
Image
Size
SizeMode
Button1
btnStart
開始
--
(預設值)
--
Button2
btnStop
停止
--
(預設值)
--
PictureBox1
picBall
--
Ball.My.Resources
.Resources.ball
(32,32)
AutoSize
Timer1
tmrBall
--
--
--
--
' FileName : Ball.sln
01 Dim x, y As Integer
‘ 宣告X、Y變數,供所有事件共用
02 ' --------------------------------------------------------------------------------------------------03 Private Sub Form1_Load(ByVal sender …. ) Handles MyBase.Load
04
x=5:y=5
05
tmrBall.Interval = 100
‘ 設定X、Y初值,也就是球移動的距離
06 End Sub
07 ' ---------------------------------------------------------------------------------------------------
08 Private Sub tmrBall_Tick(ByVal sender … ) Handles tmrBall.Tick
09
picBall.Location = New Point(picBall.Left + x, picBall.Top + y) ‘球新位置
10
If picBall.Left <= 0 Then x = -x
11
If picBall.Left >= Me.Width - picBall.Width Then x = -x‘球碰右邊界扣除球體
12
If picBall.Top <= 0 Then y = -y
13
If picBall.Top >= Me.Height - picBall.Height - 30 Then y = -y‘球碰下邊界
14 End Sub
‘球碰左邊界
‘球碰上邊界
‘除要扣除球的高度外還要再扣標題欄高度30
16 Private Sub btnStart_Click(ByVal sender …. ) Handles _
btnStart.Click
17
tmrBall.Enabled = True
‘計時器啟動球開始移動
18 End Sub
19 ' ---------------------------------------------------------------------------------20 Private Sub btnStop_Click(ByVal sender …. ) Handles _
btnStop.Click
21
tmrBall.Enabled = False
22 End Sub