第十一講次 第八章滑鼠與鍵盤事件的處理 單元目標 1. 講解鍵盤事件程序 2. 說明鍵盤事件程序的實例探討 3. 講解滑鼠事件程序 4. 說明滑鼠鍵盤事件程序的實例探討 摘要 使用者對鍵盤和滑鼠的操作是 Visual Basic 程式語言的主要事件的來源並 提供對有關滑鼠和鍵盤等相關事件的處理程序, 本章主要講授與滑鼠和鍵盤相 關的事件 處理程序及實例探討 第一節鍵盤事件程序 在 Visual Basic 程式語言中, 有一些控制項工具須使用鍵盤來輸入資料 ( 如文字方塊或輸入對話框等 ) 或處理比較特殊的按鍵 ( 如上 下 左 右等鍵 ) 或組合式按鍵 ( 如 Ctrl 與 a 等 ) 時, 可直接使用鍵盤處理 在 Visual Basic 程式語言提供三個與鍵盤有關的事件 (KeyPress KeyDown 及 KeyUp) 用來處理鍵盤的工作 1
一 KeyPress 鍵盤按鍵事件使用鍵盤鍵入資料時, 當一有按鍵動作發生時, 而所按的鍵為 ASCII 碼, 就會產生 KeyPress 事件, 並利用 e.keychar 參數讀取所鍵入的按鍵字元, 將所按鍵的字元轉成字元碼值 如下列所示 : 2
合法的按鍵 KeyAscii 碼值 1. 鍵盤上可顯示的字元 ( 常用 ): 大寫英文字母 :A~Z: 小寫英文字母 :a~z: 數字 :0~9 所按鍵字元的 ASCII 碼值 65~90 97~122 48~57 2. 與至與 1 至 26 3. 13 4. 與 10 5. 8( 倒退鍵 ) 6. 與 127 7. 9 8. (Space Bar) 32 語法 Private Sub 物件名稱 _KeyPress(..) 功能 在物件上按某鍵時所傳回相對應的 ASCII 碼字元 說明 1. 在 KeyPress 事件程序中,e.KeyChar 參數可傳回所按鍵的字元 (Character), 若要顯示按鍵的字元的值須使用 Asc 函數轉換成 ASCII 值, 再使用 Chr 函數轉換成相對應的字元 2. 在 KeyPress 事件程序中, 可使用 e.handled 參數設定是否忽略所鍵入的字元, 預設值為 False 表示所鍵入的字元不會被忽略, 若值設為 True 表示所鍵入的字元會被忽略 3. 若所按的鍵為特殊功能鍵 (F1~F10,Insert,Delete, PageUp,PageDown,Home,End 或,,, ) 等鍵均不會產生 KeyPress 事件也不會顯示所按鍵的字元 範例 8-1 下列片斷程式為將所鍵入的字元判斷為數字 大寫字母 小寫字母或其 3
他字元, 將所按鍵字元及 Ascii 值印出 1. Private Sub lblkeyin_keypress(...) Handles MyBase.KeyPress 2. Dim KeyAscii As Integer 3. Dim ch As String 4. ch = e.keychar 5. KeyAscii = Asc(ch) 6. If KeyAscii >= 48 And KeyAscii <= 57 Then 7. lblkeyin.text &= " 所按鍵的字元為 0-9 之間 " & vbnewline 8. lblkeyin.text &= " 所按鍵的字元為 " & Chr(KeyAscii) & vbnewline 9. lblkeyin.text &= " 所按鍵的字元 Ascii 值為 " & KeyAscii & vbnewline 10. ElseIf KeyAscii >= 65 And KeyAscii <= 90 Then 11. lblkeyin.text &= " 所按鍵的字元為 A-Z 之間 " & vbnewline 12. lblkeyin.text &= " 所按鍵的字元為 " & Chr(KeyAscii) & vbnewline 13. lblkeyin.text &= " 所按鍵的字元 Ascii 值為 " & KeyAscii & vbnewline 14. ElseIf KeyAscii >= 97 And KeyAscii <= 122 Then 15. lblkeyin.text &= " 所按鍵的字元為 a-z 之間 " & vbnewline 16. lblkeyin.text &= " 所按鍵的字元為 " & Chr(KeyAscii) & vbnewline 17. lblkeyin.text &= " 所按鍵的字元 Ascii 值為 " & KeyAscii & vbnewline 18. Else 19. lblkeyin.text &= " 所按鍵的字元為其他字元 " & vbnewline 20. lblkeyin.text &= " 所按鍵的字元為 " & Chr(KeyAscii) & vbnewline 21. lblkeyin.text &= " 所按鍵的字元 Ascii 值為 " & KeyAscii & vbnewline 22. End If 23. 說明使用 Chr 函數將 ASCII 值轉換成相對應的字元 : 1 數字 0-9, 使用 Chr(48) 轉換成相對應的字元為 0, 使用 Chr(57) 轉換成相對應的字元為 9; 2 英文字母 :Chr(65) 為 A,Chr(90) 為 Z,Chr(97) 為 a,chr(122) 為 z 僅說明數值或字母開始與結束之值其餘數值或字母請自行推敲 1. 第 1-23 列 : 使用者鍵入合法的字元會產生 KeyPress 事件並在標籤控制項 顯示所鍵入的字元 2. 第 4 列 : 將所鍵入的字元傳送給 ch 變數 3. 第 5 列 : 將所鍵入的字元使用 Asc 函數轉換成 ASCII 碼並傳送給 KeyAscii 變數 4. 第 6 列 : 判斷所鍵入字元的 ASCII 值是否在 48-57 之間, 即所輸入的值是 否為 0-9 之間, 並顯示按鍵字元 4
5. 第 10 列 : 判斷所鍵入字元的 ASCII 值是否在 65-90 之間, 即所輸入的值是否為 A-Z 之間, 並顯示按鍵字元 6. 第 14 列 : 判斷所鍵入字元的 ASCII 值是否在 97-122 之間, 即所輸入的值是否為 a-z 之間, 並顯示按鍵字元 7. 第 18 列 : 將所按鍵的字元設為其他字元, 並顯示所按鍵字元 執行結果執行時分別鍵入小寫字母 a 數字 5 及大寫字母 A, 結果 分別如下所示 : 二 KeyDown 和 KeyUp 鍵盤按鍵事件使用 KeyPress 事件程序只能顯示上述表列中的合法的按鍵字元, 當鍵入的按鍵為一些特殊按鍵時, 如 :F1~F10,Home, End 等並不會產生 KeyPress 事件, 須藉由 KeyDown 或 KeyUp 事件程序來處理 當使用者按下鍵盤某鍵不放時, 就會產生 KeyDown 事件 ; 按某一鍵後再放開所按的鍵時, 就會產生 KeyUp 事件 ;KeyUp 和 KeyDown 事件程序能處理 KeyPress 事件所無法處理的按鍵字元, 如功能鍵 編輯鍵和組合鍵等 KeyPress 事件可以傳回所按鍵字元的 ASCII 鍵碼, 但是無法得知目前鍵盤是否仍被按著或按一下就放開 當輸入一個字元, 鍵盤事件的發生順序依序為 (1)KeyDown 事件, (2)KeyPress 事件,(3)KeyUp 事件 將 KeyDown 及 KeyUp 事件的語法如下所示 : 語法 Private Sub 物件名稱 _KeyDown(..) 功能 在物件上偵測到某一鍵被按住 語法 Private Sub 物件名稱 _KeyUp( ) 功能 在物件上偵測到被按住的鍵已放開 將 KeyDown 及 KeyUp 事件程序屬性用法說明如下 : 5
說明 1.e.KeyCode 參數 : 可透過 e.keycode 參數值判斷所按鍵的內 容, 語法為 e.keycode=keys. 按鍵名稱, 茲將常用的鍵盤按 鍵 數值與名稱說明如下 : 按鍵 數值 名稱 按鍵 數值 名稱 A~Z 65~90 A~Z a~z 65~90 a~z 0~9 48~57 0~9 Backspace 8 Back Tab 9 Tab Enter 13 Enter Shift 16 ShiftKey Ctrl 17 ControlKey Alt 18 Menu Esc 27 Escape PageUp 33 Prior BASIC PageDown 34 Next End 35 End Home 36 Home 37 Left 38 Up 39 Right 40 Dowm Insert 45 Insert Delete 46 Delete F1 112 F1 F2 113 F2 F3 114 F3 F4 115 F4 F5 116 F5 F6 117 F6 F7 118 F7 F8 119 F8 F9 120 F9 F10 121 F10 F11 122 F11 F12 123 F12 6
例 : 判斷有無按 Enter 鍵可撰寫成 e.keycode=keys.enter 也可撰寫成 e.keycode=13 註 : 當按大寫字母與小寫字母的 e.keycode 值均相同, 如按 A 與 a 其 e.keycode 值均為 65 2. e.keydata 參數 : 可使用 e.keydata 判斷是否按組合鍵的狀態 : (1) 使用 e.shift 判斷是否按 Shift 鍵, 若值為 True 表示有按 Shift 鍵, 其值為 False 表示未按 Shift 鍵 (2) 使用 e.control 判斷是否按 Control 鍵, 若其值為 True 表示有按 Control 鍵, 其值為 False 表示未按 Control 鍵 (3) 判斷是否按 Alt 鍵可使用 e.alt 判斷, 若其值為 True 表示有按 Alt 鍵, 其值為 False 表示未按 Alt 鍵 範例 8-2 下列片斷程式為偵測在表單物件上按 Enter 鍵或與按組合鍵 (Shift Ctrl 或 Alt 鍵 )? 1. Private Sub Form1_Load(...) Handles MyBase.Load 2. lblkeydown.text &= "Keycode" & Space(10) & "KeyData" & Space(20) & " 按鍵內容 " & vbnewline 3. 4. Private Sub KeyDown_KeyDown(...) Handles MyBase.KeyDown 5. If e.keycode = 13 Then 6. Select Case e.keydata 7. Case Keys.Enter 8. lblkeydown.text &= e.keycode & Space(20) & e.keydata.tostring & Space(24) _ & " 只按 Enter 鍵 " & vbnewline 9. Case Keys.Enter + Keys.Shift 10. lblkeydown.text &= e.keycode & Space(20) & e.keydata.tostring & Space(15) _ & " 按 Shift 及 Enter 鍵 " & vbnewline 11. Case Keys.Enter + Keys.Control 12. lblkeydown.text &= e.keycode & Space(20) & e.keydata.tostring & Space(12) _ & " 按 Ctrl 及 Enter 鍵 " & vbnewline 13. Case Keys.Enter + Keys.Control + Keys.Shift 14. lblkeydown.text &= e.keycode & Space(20) & e.keydata.tostring & Space(2) _ & " 按 Shift,Ctrl 及 Enter 鍵 " & vbnewline 15. Case Keys.Enter + Keys.Alt 16. lblkeydown.text &= e.keycode & Space(20) & e.keydata.tostring & Space(17) _ & " 按 Alt 及 Enter 鍵 " & vbnewline 17. Case Keys.Enter + Keys.Alt + Keys.Shift 18. lblkeydown.text &= e.keycode & Space(20) & e.keydata.tostring & Space(9) _ & " 按 Shift,Alt 及 Enter 鍵 " & vbnewline 19. Case Keys.Enter + Keys.Alt + Keys.Control 20. lblkeydown.text &= e.keycode & Space(20) & e.keydata.tostring & Space(5) _ & " 按 Ctrl,Alt 及 Enter 鍵 " & vbnewline 21. Case Else 7
22. lblkeydown.text &= e.keycode & Space(20) & e.keydata.tostring & Space(5) _ & " 按 Ctrl,Alt,Shift 及 Enter 鍵 " & vbnewline 23. End Select 24. End If 25. 說明 1. 第 1-3 列 : 執行時表單載入事件在標籤控制項顯示標題 2. 第 4-25 列 : 當按下鍵盤產生 KeyDown 事件程序 3. 第 5 列 : 依據 e.keycode 參數偵測在表單物件按 Enter 鍵 (e.keycode= Keys.Enter) 當按 Enter 鍵才會往下繼續判斷是否按組合鍵 4. 第 6 列 : 依據 e.keydata 參數判斷是否按組合鍵 執行結果執行時分別按 Enter 鍵 Control 及 Enter 鍵 Shift 及 Enter 鍵 Control Alt 及 Enter 鍵分別顯示結果如下所示 : 範例 8-3 下列程式為使用方向鍵 ( 上 下 左或右 ) 移動汽車圖片的位置? 1. Dim x, y As Integer 宣告 x 與 y 為全域變數 2. Private Sub Form1_Load(...) Handles MyBase.Load 8
說明 3. x = piccar.top 記錄圖片方塊的 x 座標 4. y = piccar.left 記錄圖片方塊的 y 座標 5. 6. Private Sub Form1_KeyDown(...) Handles MyBase.KeyDown 7. Select Case e.keycode 8. Case Keys.Up 9. piccar.top -= 10 10. Case Keys.Down 11. piccar.top += 10 12. Case Keys.Left 13. piccar.left -= 10 14. Case Keys.Right 15. piccar.left += 10 16. End Select 17. If piccar.top = 0 Then 18. piccar.top = Width 19. End If 20. If piccar.top > Width Then 21. piccar.top = 0 22. End If 23. If piccar.left = 0 Then 24. piccar.left = Height 25. End If 26. If piccar.left > Height Then 27. piccar.left = 0 28. End If 29. 30. Private Sub Form1_KeyUp(...) Handles MyBase.KeyUp 31. piccar.top = x 32. piccar.left = y 33. 1. 第 3-4 列 : 分別記錄圖片方塊的 x 座標與記錄圖片方塊的 x 座標 2. 第 6-29 列 : 當按下鍵盤時產生 KeyDown 事件程序 3. 第 7 列 : 使用 e.keycod 參數取得被按鍵的值, 再依據其值判斷移動方向 4. 第 8 列 : 按向上按鈕其 e.keycode=38(keys.up), 車子往上移 ( 即將 piccar.top-10) 5. 第 10 列 : 按向下按鈕其 e.keycode=40(keys.down), 車子往下移 ( 即將 piccar.top+10) 6. 第 12 列 : 按下向左按鈕 e.keycode=37(keys.left), 車子往左移 ( 即將 piccar.left-10) 7. 第 14 列 : 按下向右按鈕 e.keycode=39(keys.right), 車子往右移 ( 即將 piccar.left+10) 8. 第 17 列 : 判斷車子是否到達表單最上端, 如果是則設定車子從表單最下端出現 9. 第 20 列 : 判斷車子是否到達表單最下端, 如果是則設定車子從表單最上端出現 10. 第 23 列 : 判斷車子是否到達表單最左端, 如果是則設定車子從表單最右端出現 9
11. 第 26 列 : 判斷車子是否到達表單最右端, 如果是則設定車子從表單最左端出現 12. 第 30-33 列 : 當鬆開鍵盤時產生 KeyUp 程序, 將圖片之歸位 執行結果執行時可按 鍵移動汽車圖片的位置 : 範例 8-4 當輸入一個字元, 說明鍵盤事件程序產生的個數及其先後順序? 1. Dim i As Integer 2. Private Sub Form1_Load(..) Handles MyBase.Load 3. lblshow.text &= " 判斷所按鍵的字元是否為 Ascii 碼或按組合鍵 " & vbnewline 4. lblshow.text &= Space(60) & "KeyCode" & Space(10) & "Shift" & Space(5) & "Ctrl"_ & Space(5) & "Alt" & vbnewline 5. 6. Private Sub Form1_KeyDown(..) Handles MyBase.KeyDown 7. i=0 8. i = i + 1 9. lblshow.text &= i & ":KeyDown 事件 : 所按鍵的字元為 " & Space(5) & e.keycode & _ Space(20) & e.shift & Space(5) & e.control & Space(5) & e.alt & vbnewline 10. 11. Private Sub Form1_KeyPress(..) Handles MyBase.KeyPress 12. Dim KeyAscii As Integer 13. Dim ch As String 14. ch = e.keychar 15. KeyAscii = Asc(ch) 16. i = i + 1 17. lblshow.text &= i & ": KeyPress 事件 : 所按鍵的字元為 " & UCase(Chr(KeyAscii)) 18. lblshow.text &= " 所按鍵的 Ascii 值為 " & KeyAscii & vbnewline 19. 20. Private Sub Form1_KeyUp(..) Handles MyBase.KeyUp 21. i = i + 1 22. lblshow.text &= i & ": KeyUp 事件 : 所按鍵的字元為 " & Space(5) & e.keycode & _ Space(20) & e.shift & Space(5) & e.control & Space(5) & e.alt & vbnewline 23. lblshow.text &= vbnewline 24. 10
說明 1. 第 1 列 : 宣告 i 變數為整數型態的全域變數 2. 第 2-5 列 : 載入表單事件程序, 在標籤控制項上顯示標題 3. 第 6-10 列 :KeyDown 事件程序, 當按住鍵盤時, 會產生此事件, 在標籤控制項上顯示內容 4. 第 11-19 列 :KeyPress 事件事件程序, 當在鍵盤鍵入字元時, 會產生此事件 第 17 列 Ucase 函數為將鍵入的小寫字母字元轉換為大寫字母字元 5. 第 19-24 列 :KeyUp 事件程序, 當放開鍵盤時, 會產生此事件 執行結果 1. 執行時, 按鍵盤 a 會產生 3 個鍵盤事件程序的順序與各按鍵結果 : 2. 執行時, 按鍵盤 Shift 及 a 時會產生 5 個鍵盤事件程序的順序 與各按鍵結果 : 11
第二節滑鼠事件程序 在 Windows 作業系統中, 滑鼠的操作有逐漸取代鍵盤的某些功能, 當在螢幕上移動滑鼠 按下滑鼠的按鈕或將所按鈕放開, 都會產生滑鼠事件程序 一 Click 事件 當按下滑鼠左鈕一下再放開滑鼠的動作就會產生 Click( 按一下 ) 事件 語法 Private Sub 物件名稱 _Click( ) 功能 在指定的物件上按滑鼠左鈕一下, 會產生 Click 事件 說明 Click 事件只能偵測出使用者用滑鼠在指定的物件上按鈕一下, 而無法偵測是按左鈕 右鈕或中間鈕, 若要偵測出是按那一個鈕? 需由 MouseDown 或 MouseUp 事件才能偵測出 二 DoubleClick 事件 當連按滑鼠二下再放開滑鼠的動作稱為 Double Click( 連按二下 ) 事件 語法 Private Sub 物件名稱 _DoubleClick( ) 功能 在指定的物件上連按滑鼠兩下, 會產生 DoubleClick 事件 說明 產生 DoubleClick 事件之前, 會先產生 Click 事件 12
三 MouseDown MouseUp 與 MouseMove 事件 在滑鼠上按下任一鈕, 會產生 MouseDown( 按下 ) 事件 ; 按下滑鼠鈕後再 放開, 會產生 MouseUp( 放開 ) 事件 ; 而在物件上移動滑鼠指標, 則會產生 MouseMove( 移動 ) 事件 此三事件被產生時, 當按下滑鼠再放開會產生三個事件依序為 (1) MouseDown 事件 (2) Click 事件 (3) MouseUp 事件 因此在撰寫程式碼時應注意將程式碼撰寫於那一事件程序中, 並避免程式碼重覆或互相衝突 茲將 MouseMove MouseDown 及 MouseUp 事件的語法說明如下 : ( 一 )MouseMove 事件 語法 Private Sub 物件名稱 _MouseMove( ) 功能 在物件上偵測到滑鼠鈕正在移動, 會產生 MouseMove 事件 ( 二 )MouseDown 事件 語法 Private Sub 物件名稱 _MouseDown( ) 功能 在物件上偵測到滑鼠鈕被按住, 會產生 MouseDown 事件 ( 三 )MouseUp 事件 語法 Private Sub 物件名稱 _MouseUp( ) 功能 在物件上偵測到所按住之滑鼠鈕已放開, 會產生 MouseUp 事件 將 MouseMove MouseDown 及 MouseUp 事件屬性在使用上說明如下 : 1. e.button 參數 : 可判斷所按下為滑鼠的那一個按鈕, 判斷方式為 e.button=mousebuttons.left 表示按滑鼠左鈕 ; e.button=mousebuttons.middele 表示按滑鼠中鈕被按下 ; e.button=mousebuttons.right 表示按滑鼠右鈕被按下 2.X 屬性 : 表示當滑鼠鈕被按下或放開時, 游標所在的 X 坐標值 (e.x) 3.Y 屬性 : 表示當滑鼠鈕被按下或放開時, 游標所在的 Y 坐標值 (e.y) 13
範例 8-5 下列 MouseDown 事件程序為判斷所按下滑鼠為何鈕及游標 位置? 1. Private Sub lblshow_mousedown(...) Handles lblshow.mousedown 2. Select Case e.button 3. Case e.button.left 4. lblshow.text &= " 按滑鼠左鈕 " & "X=" & e.x & "Y=" & e.y & vbnewline 5. Case e.button.right 6. lblshow.text &= " 按滑鼠右鈕 " & "X=" & e.x & "Y=" & e.y & vbnewline 7. Case e.button.middle 8. lblshow.text &= " 按滑鼠中間鈕 " & "X=" & e.x & "Y=" & e.y & vbnewline 9. End Select 10. 說明 1. 第 1-10 列 :MouseDown 事件程序, 當滑鼠鈕被按住時會產生 MouseDown 事件 2. 第 2-9 列 : 使用 e.button 參數, 判斷滑鼠的那一鈕 ( 左鈕, 右鈕或中間鈕 ) 被按下並傳回滑鼠所在的坐標值 執行結果執行時, 按滑鼠左鈕顯示如下結果 : 範例 8-6 在標籤控制項上按滑鼠左鈕, 說明 MouseDown Click 及 MouseUp 事件執行的順序 1. Dim i As Integer 2. Private Sub lblshow_mousedown(...) Handles lblshow.mousedown 3. i = 0 4. i = i + 1 5. lblshow.text &= " 順序 " & i & " 偵測到滑鼠鍵被按一下 " & vbnewline 6. 7. Private Sub lblshow_click(...) Handles lblshow.click 8. i = i + 1 9. lblshow.text &= " 順序 " & i & " 按滑鼠鍵一下 " & vbnewline 10. 11. Private Sub lblshow_mouseup(...) Handles lblshow.mouseup 12. i = i + 1 14
13. lblshow.text &= " 順序 " & i & " 偵測到滑鼠鍵被鬆開 " & vbnewline 14. 說明執行時, 當在標籤控制項上按滑鼠左鈕時, 先產生 MouseDown 事件 再者為 Click 事件, 最後才產生 MouseUp 事件 1. 第 1 列 : 宣告 i 變數為整數型態的全域變數 2. 第 2-6 列 : 當按住滑鼠時會產生 MouseDown 事件程序 3. 第 7-10 列 : 當按滑鼠任何一鍵時會產生 Click 事件程序 4. 第 11-14 列 : 當鬆開滑鼠時會產生 MouseUp 事件程序 執行結果執行時, 在標籤控制項上按滑鼠左鈕時, 顯示如下結果 : 範例 8-7 製作一個可自行按滑鼠鈕操控的交通號誌程式 (1) 當按任何滑鼠鈕時, 顯示綠燈亮 (2) 當按滑鼠左鈕一下, 則顯示黃燈亮 (3) 若按滑鼠右鈕, 則顯示紅燈亮 (4) 若按滑鼠中間鈕, 顯示綠燈亮 一 建立如下圖表單 picpicture picred picyellow picgreen btnend 二 設定物件之屬性值 15
物件 屬性 Name Text Font/ 大小 名稱 ( 物件名稱 ) ( 標題文字 )( 字型大小 ) Form1 Form1 交通號誌 9 Button1 btnend 結束 12 PictureBox1 picyellow < 空字串 > - PictureBox2 picgreen < 空字串 > - PictureBox3 picred < 空字串 > - PictureBox4 picpicture < 空字串 > - 三 程式碼如下所示 : 1. Private Sub Form1_Load(...) Handles MyBase.Load 2. picgreen.visible = False 3. picred.visible = False 4. picyellow.visible = False 5. picpicture.image = picgreen.image 6. 7. Private Sub Form1_MouseDown(...) Handles MyBase.MouseDown 8. If e.button = MouseButtons.Left Then 9. picpicture.image = picyellow.image 10. ElseIf e.button = MouseButtons.Right Then 11. picpicture.image = picred.image 12. Else 13. picpicture.image = picgreen.image 14. End If 15. 16. Private Sub btnend_click(...) Handles btnend.click 17. End 18. 說明 1. 第 1-6 列 : 載入表單時先將三個號誌皆隱藏, 再將顯示綠燈號誌設至 picpicture 圖片方塊控制項會顯示綠燈 2. 第 7-15 列 : 當按下滑鼠鈕時會產生 MouseDown 事件程序, 第 8 列 e.button 屬 性判斷按下哪一鈕, 當按下左鈕將顯示黃燈號誌設至則 picpicture 圖片方塊會顯示黃燈, 按下右鈕將顯示紅燈號誌設 至 picpicture 圖片方塊顯示紅燈, 按下中間鈕將顯示綠燈號誌 設至 picpicture 圖片方塊顯示綠燈 16
執行結果執行程式時先顯示綠燈, 當按下左鈕將顯示黃燈如下圖所示 : 四 MouseEnter MouseLeave 與 MouseHover 事件 當滑鼠游標移動進入物件的範圍內時, 會產生 MouseEnter( 進下 ) 事件 ; 當 滑鼠游標離開物件的範圍內時, 會產生 MouseLeave( 離開 ) 事件 ; 當滑鼠游標 移動進入物件的範圍內後, 稍作停留會產生 MouseHover( 停留 ) 事件 茲將 MouseEnterMouseLeave 及 MouseHover 事件的語法說明如下 : ( 一 )MouseEnter 事件 語法 Private Sub 物件名稱 _MouseEnter( ) 功能 當滑鼠游標移動進入物件的範圍內時, 會產生 MouseEnter 事件 ( 二 )MouseLeave 事件 語法 Private Sub 物件名稱 _MouseLeave( ) 功能 當滑鼠游標離開物件的範圍內時, 會產生 MouseLeave 事件 ( 三 )MouseHover 事件 語法 Private Sub 物件名稱 _MouseHover( ) 功能 當滑鼠游標移動進入物件的範圍內後, 稍作停留會產生 MouseHover 事件 範例 8-8MouseEnter MouseLeave 與 MouseHover 事件實例演練 17
1. 程式執行時在標籤控制項顯示老師第一站參觀哪一區, 如下圖所示 : 2. 當滑鼠指標指向參觀的區 ( 如海豚區 ) 在標籤控制項顯示好可愛的海豚 3. 當滑鼠在參觀的區停留一會 ( 如海豚區 ) 在標籤控制項顯示你看海豚在表演 18
4. 當滑鼠指標離開參觀的區 ( 如海豚區 ) 在標籤控制項顯示下一站我們要參觀哪 一區 ' 設定初值 Private Sub Form1_Load(..) Handles MyBase.Load lblshow.text = " 老師第一站參觀哪一區 " ' 進入海豚區 Private Sub picdolphin_mouseenter(..) Handles picdolphin.mouseenter lblshow.text = " 好可愛的海豚 " ' 在海豚區停留 Private Sub picdolphin_mousehover(..) Handles picdolphin.mousehover lblshow.text = " 你看海豚在表演 " ' 離開海豚區 Private Sub picdolphin_mouseleave(..) Handles picdolphin.mouseleave lblshow.text = " 下一站我們要參觀哪一區 " ' 進入企鵝區 Private Sub picpenguin_mouseenter(..) Handles picpenguin.mouseenter lblshow.text = " 企鵝走路好可愛 " ' 在企鵝區停留 Private Sub picpenguin_mousehhover(..) Handles picpenguin.mousehover lblshow.text = " 你看企鵝在表演 " ' 離開企鵝區 Private Sub picpenguin_mouseleave(..) Handles picpenguin.mouseleave lblshow.text = " 下一站我們要參觀哪一區 " ' 進入魚區 Private Sub picfish_mouseenter(..) Handles picfish.mouseenter lblshow.text = " 魚在水中游的多自在 " ' 在魚區停留 Private Sub picfish_mousehhover(..) Handles picfish.mousehover lblshow.text = " 你看有各式各樣的魚 " 19
' 離開魚區 Private Sub picfish_mouseleave(..) Handles picfish.mouseleave lblshow.text = " 下一站我們要參觀哪一區 " ' 進入青蛙區 Private Sub picfrog_mouseenter(..) Handles picfrog.mouseenter lblshow.text = " 青蛙跳來跳去真好玩 " ' 在青蛙區停留 Private Sub picfrog_mousehhover(..) Handles picfrog.mousehover lblshow.text = " 你看青蛙在青蛙跳 " ' 離開青蛙區 Private Sub picfrog_mouseleave(..) Handles picfrog.mouseleave lblshow.text = " 下一站我們要參觀哪一區 " ' 進入豹區 Private Sub picpanther_mouseenter(..) Handles picpanther.mouseenter lblshow.text = " 豹的花紋真漂亮 " ' 在豹區停留 Private Sub picpanther_mousehhover(..) Handles picpanther.mousehover lblshow.text = " 你聽豹的叫聲真可怕 " ' 離開豹區 Private Sub picpanther_mouseleave(..) Handles picpanther.mouseleave lblshow.text = " 下一站我們要參觀哪一區 " ' 進入瓢蟲 Private Sub picladybug_mouseenter(..) Handles picladybug.mouseenter lblshow.text = " 瓢蟲在樹上一動也不動 " ' 在瓢蟲區停留 Private Sub picladybug_mousehhover(..) Handles picladybug.mousehover lblshow.text = " 你看瓢蟲要飛了 " ' 離開瓢蟲區 Private Sub picladybug_mouseleave(..) Handles picladybug.mouseleave lblshow.text = " 下一站我們要參觀哪一區 " ' 進入駱駝區 Private Sub piccamel_mouseenter(..) Handles piccamel.mouseenter lblshow.text = " 駱駝的背部好怪 " ' 在貓頭鷹停留 Private Sub piccamel_mousehhover(..) Handles piccamel.mousehover lblshow.text = " 你能區別單峰駱駝與雙峰駱駝 " ' 離開駱駝區 Private Sub piccamel_mouseleave(..) Handles piccamel.mouseleave lblshow.text = " 下一站我們要參觀哪一區 " ' 進入貓頭鷹區 Private Sub picowl_mouseenter(..) Handles picowl.mouseenter lblshow.text = " 貓頭鷹在晚上時, 眼睛會發光 " 20
' 在貓頭鷹停留 Private Sub picccamel_mousehhover(..) Handles piccamel.mousehover lblshow.text = " 你看貓頭鷹眼睛好亮 " ' 離開貓頭鷹區 Private Sub picowl_mouseleave(..) Handles picowl.mouseleave lblshow.text = " 下一站我們要參觀哪一區 " 重要名詞 鍵盤事件 KeyPress 事件 KeyDown 事件 KeyUp 事件滑鼠事件 Click 事件 DoubleClick 事件 MouseDown 事件 MouseUp 事件 MouseMove 事件 MouseEnter 事件 MouseLeave 事件 MouseHover 事件 自我評量 1. 當使用者按下鍵盤某鍵不放時, 會產生事件, 按某一鍵後再放開所按 的鍵時, 會產生 事件 2. 當輸入一個字元, 則三個事件的發生順序依序為事件, 次為 事件, 最後是 事件 3. 當輸入 Enter 鍵時, 會產生 (KeyDown 或 KeyPress 或 KeyUp) 事件 4. 當鍵入 Ctl 及 A 鍵時, 寫出所產生鍵盤事件程序的順序? 21
(1) (2) (3) KeyPress (4) (5) 5. 在程式中欲偵測按下功能鍵 編輯鍵及組合鍵, 會產生, 鍵盤事件程序 6. 寫出當按滑鼠左鈕一下, 會依序產生 (1) (2) (3) MouseUp 滑鼠事件程序 7. 在 MouseDown 事件程序的參數中, 當按下滑鼠鈕時, 參數會判斷所按為何鈕? 8. 在 KeyDown 及 KeyUp 事件中參數值判斷所按鍵的內容, 語法為 e.keycode= 9. 在 KeyPress 事件程序中, 參數可傳回所按鍵的字元, 參數傳回是否按組合鍵的狀態 10. 在 MouseDown 事件程序中, 當按下滑鼠左鈕時 e.button 值 =, 若按滑鼠右鈕被按下 e.button 值 =, 若按滑鼠中鈕被按下 e.button 值 = 11. 當滑鼠游標移動進入物件的範圍內時會產生 MouseEnter 事件, 當滑鼠游 標離開物件的範圍內時, 會產生 MouseLeave 事件, 當滑鼠游標移動進入物 件的範圍內後, 稍作停留會產生 MouseHover 事件 12. 設計一程式, 使用滑鼠事件管理資源回收的程式 22
13. 利用滑鼠的幾個事件完成一個簡易的繪圖程式 : (A) 畫筆的顏色為紅 藍及綠三種 (B) 可使用捲軸控制項改變畫筆的粗細, 最小值為 1, 最大值為 10 14. 運用拖曳的技巧, 實際拖曳圖形 1. 將 " 老 K" 撲克牌拖曳至右邊由標籤控制項設計之方塊內 2. 當 " 老 K" 撲克牌被拖曳時, 只要碰到方塊周邊, 即可鬆開滑鼠鍵, 而使 " 老 K" 放置於方塊內, 如右下圖 : 3. 若未放置成功, 則 " 老 K" 自動返回啟始位置 23