Presentation is loading. Please wait.

Presentation is loading. Please wait.

第十四章 滑鼠鍵盤與共享事件. 14.1 鍵盤事件介紹 目前 PC 主要輸入工具是滑鼠與鍵盤。滑鼠是能在螢幕 做選取和快速定位的工具,至於鍵盤主要是輸入資料 的工具。 程式中靈活運用滑鼠與鍵盤所提供事件,可使得程式 生動不少。 譬如:在應用程式中對 TextBox 控制項,判斷到底 是按下哪個按鍵?或判斷一些較特殊的按鍵、組合.

Similar presentations


Presentation on theme: "第十四章 滑鼠鍵盤與共享事件. 14.1 鍵盤事件介紹 目前 PC 主要輸入工具是滑鼠與鍵盤。滑鼠是能在螢幕 做選取和快速定位的工具,至於鍵盤主要是輸入資料 的工具。 程式中靈活運用滑鼠與鍵盤所提供事件,可使得程式 生動不少。 譬如:在應用程式中對 TextBox 控制項,判斷到底 是按下哪個按鍵?或判斷一些較特殊的按鍵、組合."— Presentation transcript:

1 第十四章 滑鼠鍵盤與共享事件

2 14.1 鍵盤事件介紹 目前 PC 主要輸入工具是滑鼠與鍵盤。滑鼠是能在螢幕 做選取和快速定位的工具,至於鍵盤主要是輸入資料 的工具。 程式中靈活運用滑鼠與鍵盤所提供事件,可使得程式 生動不少。 譬如:在應用程式中對 TextBox 控制項,判斷到底 是按下哪個按鍵?或判斷一些較特殊的按鍵、組合 按鍵?或按上、下、左、右鍵來移動物件,按空白鍵 不放開時發射子彈,放開按鍵時結束發射子彈,以上 這些都必須透過鍵盤事件來處理。 VB 2005 提供下面三個常用鍵盤事件讓你能輕易地 完成鍵盤的處理工作:

3

4 14.1.1 KeyPress 事件

5

6

7

8

9 【程式碼】 FileName:KeyPress.sln 01 Public Class Form1 02 03 Private Sub Form1_Load(ByVal sender As Object, ByVal e _ As System.EventArgs) Handles Me.Load 04 txtPrice.Text = 0 05 txtQty.Text = 0 06 End Sub 07 08 Private Sub txtId_TextChanged(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles txtId.TextChanged 09 Dim position As Integer = txtId.SelectionStart 10 txtId.Text = txtId.Text.ToUpper() 11 txtId.SelectionStart = position 12 End Sub

10 14 Private Sub txtId_KeyPress(ByVal sender As System.Object, ByVal e _ As System.Windows.Forms.KeyPressEventArgs) Handles txtId.KeyPress 15 If e.KeyChar = Microsoft.VisualBasic.ChrW(Keys.Return) Then 16 txtPrice.Focus() 17 End If 18 19 If txtId.Text.Length < 6 Then 20 If txtId.SelectionStart = 0 Then 21 Dim S As String = e.KeyChar.ToString().ToUpper() 22 If S "Z" Then 23 e.Handled = True 24 End If 25 Else 26 If (e.KeyChar "9") And _ (e.KeyChar <> vbBack) Then 27 e.Handled = True 28 End If 29 End If 30 Else 31 If e.KeyChar <> vbBack Then 32 e.Handled = True 33 End If 34 End If 35 End Sub

11 37 Private Sub txtPrice_KeyPress(ByVal sender As System.Object, _ ByVal e As System.Windows.Forms.KeyPressEventArgs) _ Handles txtPrice.KeyPress 38 If e.KeyChar = Microsoft.VisualBasic.ChrW(Keys.Return) Then 39 txtQty.Focus() 40 End If 41 If (e.KeyChar "9") And _ (e.KeyChar <> vbBack) Then 42 e.Handled = True 43 End If 44 End Sub 45 46 Private Sub txtPrice_TextChanged(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles txtPrice.TextChanged 47 lblTotal.Text = Val(txtPrice.Text) * Val(txtQty.Text) 48 End Sub 49

12 50 Private Sub txtQty_KeyPress(ByVal sender As System.Object, _ ByVal e As System.Windows.Forms.KeyPressEventArgs) _ Handles txtQty.KeyPress 51 If e.KeyChar = Microsoft.VisualBasic.ChrW(Keys.Return) Then 52 Return 53 End If 54 If (e.KeyChar "9") And _ (e.KeyChar <> vbBack) Then 55 e.Handled = True 56 End If 57 End Sub 58 59 Private Sub txtQty_TextChanged(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles txtQty.TextChanged 60 lblTotal.Text = Val(txtPrice.Text) * Val(txtQty.Text) 61 End Sub 62 63 End Class

13 14.1.2 KeyDown 和 KeyUp 事件 在電腦射擊遊戲中,當按下某個按鍵不放 時用來發射子彈;當放開按鍵時停止發射 子彈,這樣完成一個按鍵動作就做了兩件 事情,我們必須將發射子彈的程式寫在 KeyDown 事件內;而將停止發射子彈的 程式寫在 KeyUp 事件中。 KeyDown 動作: 當你正按下鍵盤某個按鍵不放時,就會 觸動 KeyDown 事件。 KeyUp 動作: 當你放開目前被按下的按鍵時,就會 觸動 KeyUp 事件。

14 注意 KeyUp 和 KeyDown 事件程序能處理 KeyPress 事件所無法處理的按鍵,如 功能鍵、編輯鍵和組合鍵。 KeyPress 事件可以傳回一個字元的 ASCII 鍵碼,但無法得知目前鍵盤是持續按著, 還是按一下就放開。 如輸入一個字元,則三個事件的發生順序 為 KeyDown 事件,接著為 KeyPress 事件, 最後是 KeyUp 事件。

15

16

17

18

19

20 【程式碼】 FileName:Tank.sln 01 Public Class Form1 02 03 Private Sub Form1_Load(ByVal sender As System.Object, ByVal _ e As System.EventArgs) Handles MyBase.Load 04 lblX.Text = "X 座標: " & picTank.Top 05 lblY.Text = "Y 座標: " & picTank.Left 06 lblMsg.Text = " 請按上下左右鍵控制坦克! " 07 picTank.Image = picTankU.Image 08 picTankU.Visible = False 09 picTankD.Visible = False 10 picTankL.Visible = False 11 picTankR.Visible = False 12 End Sub

21 14 Private Sub Form1_KeyDown(ByVal sender As System.Object, ByVal e _ As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown 15 Select Case e.KeyCode 16 Case Keys.Up 17 picTank.Image = picTankU.Image 18 If (picTank.Top + picTank.Height) <= 0 Then 19 picTank.Top = Me.Height 20 Else 21 picTank.Top -= 10 22 End If 23 Case Keys.Down 24 picTank.Image = picTankD.Image 25 If picTank.Top >= Me.Height Then 26 picTank.Top = 0 - picTank.Height 27 Else 28 picTank.Top += 10 29 End If

22 30 Case Keys.Left 31 picTank.Image = picTankL.Image() 32 If picTank.Width + picTank.Left <= 0 Then 33 picTank.Left = Me.Width 34 Else 35 picTank.Left -= 10 36 End If 37 Case Keys.Right 38 picTank.Image = picTankR.Image 39 If picTank.Left >= Me.Width Then 40 picTank.Left = 0 - picTank.Width 41 Else 42 picTank.Left += 10 43 End If 44 End Select 45 lblX.Text = "X 座標: " & picTank.Top 46 lblY.Text = "Y 座標: " & picTank.Left 47 lblMsg.Text = " 現在按下 " & e.KeyCode.ToString & _ " 鍵, 鍵值為 " & Str(e.KeyCode) & "!!" 48 End Sub

23 50 Private Sub Form1_KeyUp(ByVal sender As System.Object, ByVal e _ As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyUp 51 lblMsg.Text = " 請按上下左右鍵控制坦克! " 52 End Sub 53 54 End Class

24 14.2 滑鼠事件介紹

25 當你移動滑鼠到表單的某個控制項上面,若有使用 滑鼠做如上表的動作,便會觸動該控制項所對應的 滑鼠事件; 反之,若滑鼠在表單的沒有控制項的地方,則會觸 動該表單所對應的滑鼠事件。 譬如:將滑鼠指標移到 btnOk 按鈕控制項上面 按下滑鼠左鍵時,會立即觸動 btnOK_MouseDown 事件;當你將被按下的滑鼠左鍵放開時,會立即觸 動 btnOK_MouseUp 事件,同時也會觸動 btnOK_Click 事件。只要這些被觸動的事件程序內 有編寫程式碼都會被執行。

26 14.2.1 Click 與 DoubleClick 事件 當你按下滑鼠左鍵再放開滑鼠的動作就會觸動 Click (按 一下)事件。例如:我們經常按一下「指令按鈕」來啟動 相關的功能;亦可在表單中或任何型態的控制項上按一下 來表示選取該「表單」或「控制項」。 Click 事件的使用 時機有下列三種: 1. 用來選取物件 例如移動滑鼠指標到某個圖示上按一下,使圖示名稱反白, 或從清單方塊中的某選項上按一下使該選項反白。 2. 使物件獲得控制權,以利由鍵盤鍵入資料 例如移動滑鼠指標到文字方塊內,按一下滑鼠左鍵,使文 字方塊內出現閃爍的插入點游標。 3. 執行指令 例如按指令按鈕、圖示鈕或功能表內指令選項。

27 當你快速按下滑鼠左鍵再放開滑鼠的動作連續兩次 就稱為 DoubleClick (按二下)事件。 DoubleClick 事件的使用時機如下: 1. 開啟資料夾視窗 例如移動滑鼠到「我的電腦」圖示上快按滑鼠左鍵 二下,開啟「我的電腦」視窗。 2. 執行應用程式 例如在資料夾視窗中有程式檔圖示與文件檔圖示。 若用滑鼠指標在該程式檔圖示上快按二下,即會執 行該程式檔而開啟該程式視窗。若用滑鼠指標在該 文件檔圖示上快按二下,則會開啟能處理該資料檔 的程式視窗,並將該文件檔的資料顯示在程式視窗 的編輯區內。 3. 快速選取清單方塊選項 例如在「開啟舊檔」對話方塊中,在某檔案名稱上 快按滑鼠左鍵二下,則可直接開啟該檔案,而不必 按 鈕。

28 14.2.2 MouseDown 、 MouseUp 與 Click 事件 若在滑鼠任一鍵上面按一下,馬上會觸動 MouseDown 事件。 若滑鼠鍵由按下的狀態再放開,馬上觸動 MouseUp 事件。無論滑鼠是否有被按下, 只要移動滑鼠,馬上觸動 MouseMove 事件。 當按下滑鼠左鍵再放開,會同時觸動 。 MouseDown 、 MouseUp 和 Click 三個事件 先後次序為 MouseDown 事件,接著為 MouseUp 事件,最後為 Click 事件。

29 在滑鼠事件中是用 e.Button 來偵測滑鼠按鈕 是否有被按下或放開。如下: 1. 若偵測到按滑鼠左鍵,則 e.Button = Windows.Forms.MouseButtons.Left 2. 若偵測到按滑鼠中鍵,則 e.Button =Windows.Forms.MouseButtons.Middle 3. 若偵測到按滑鼠右鍵,則 e.Button = Windows.Forms.MouseButtons.Right

30 滑鼠指標的位置,是由 e.X 與 e.Y 取得。 當滑鼠指標位於表單的控制項上,則由 e.X 與 e.Y 取得的滑鼠指標的位置,是指在該控制項 上的位置,即以該控制項的左上角為滑鼠指標 的原點, X 座標向右為正、 Y 座標向下為正。 若滑鼠不在表單的控制項上,則由 e.X 與 e.Y 取得的滑鼠指標的位置,是指在表單上的位置, 即以表單的左上角為滑鼠指標的原點, X 座標向 右為正、 Y 座標向下為正。

31

32

33 【程式碼】 FileName:MouseEvent.sln 01 Public Class Form1 02 03 Dim bmp As New Bitmap(432, 304) 04 Dim OldX, OldY As Integer 05 Dim point As Integer 06 Dim pen_c As Color 07 08 Private Sub DisplayRGB(ByVal sender As System.Object, ByVal e _ As System.EventArgs) 09 picColor.BackColor = Color.FromArgb(tkbRed.Value, tkbGreen.Value _ tkbBlue.Value) 10 pen_c = Color.FromArgb(tkbRed.Value, tkbGreen.Value, _ tkbBlue.Value) 11 End Sub 12

34 13 Private Sub Form1_Load(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles Me.Load 14 AddHandler tkbRed.Scroll, AddressOf DisplayRGB 15 AddHandler tkbGreen.Scroll, AddressOf DisplayRGB 16 AddHandler tkbBlue.Scroll, AddressOf DisplayRGB 17 picColor.BackColor = Color.FromArgb(0, 0, 0) 18 Dim g As Graphics = Graphics.FromImage(bmp) 19 pen_c = Color.Black : point = 3 20 g.Clear(Color.White) 21 picShow.Image = bmp 22 picShow.Refresh() 23 End Sub

35 25 Private Sub picShow_MouseDown(ByVal sender As Object, _ ByVal e As System.Windows.Forms.MouseEventArgs) _ Handles picShow.MouseDown 26 OldX = e.X 27 OldY = e.Y 28 End Sub 29 30 Private Sub picShow_MouseMove(ByVal sender As System.Object, _ ByVal e As System.Windows.Forms.MouseEventArgs) _ Handles picShow.MouseMove 31 If e.Button = Windows.Forms.MouseButtons.Left Then 32 Dim g As Graphics = Graphics.FromImage(bmp) 33 Dim p As New Pen(pen_c, point) 34 g.DrawLine(p, OldX, OldY, e.X, e.Y) 35 picShow.Image = bmp 36 OldX = e.X 37 OldY = e.Y 38 End If 39 End Sub 40 41End Class

36 14.3 控制項共享事件程序 若表單上某些控制項的事件程序皆相同,那我們 逐一對每一個控制項撰寫相同的程式碼,這樣豈 不是很沒有效率嗎?此時我們可以透過共享事件 程序的技巧來解決這個問題。 14.3.1 使用 Handles 來建立共享事件程序 從前面章的練習中,相信你已經注意到了,在事 件程序的最後面會有 Handles 物件 1. 事件, Handles 敘述是用來指定某個事件程序是用來處理 哪個物件的哪一個事件。例如:下面語法, Handles 物件 1.Click 表示當物件 1 的 Click 事件被 觸發時,會執行 物件 1_Click 事件程序。

37 Private Sub 物件 1_Click(ByVal sender As System. _ Object, ByVal e As System.EventArgs) Handles 物件 1.Click ……. End Sub 若要使得多個控制項可以共享同一事件程序,可在 Handles 後加上物件的事件名稱,並以「, 」分開 多個物件的事件名稱即可。例如:以下寫法是當物 件 1 、物件 2 、物件 3 的 Click 事件被觸發時,皆會執 行物件 1_Click 事件程序。 Private Sub 物件 1_Click(ByVal sender As System.Object, ByVal e _ As System.EventArgs) Handles 物件 1.Click, 物件 2.Click, 物件 3.Click ……… End Sub

38

39

40 【程式碼】 FileName:Handler.sln 01 Public Class Form1 02 03 Private Sub btn1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles btn1.Click, btn2.Click, btn3.Click 04 Dim btnHit As Button 05 btnHit = CType(sender, Button) 06 lblMsg.Text = " 目前 " & btnHit.Text & " 被按下 ! " 07 End Sub 08 09 End Class

41 14.3.2 使用 AddHandler 及 AddressOf 新增事件程序 在 VB 2005 提供 AddHandler … AddressOf 敘 述可以讓使用者指定 ( 更改 ) 控制項事件的事件 處理程序。 AddHandler 用來設定物件的事件程序。 AddressOf 是用來取得事件程序的位址,而 事件程序必須符合事件程序之引數規則才行。

42 例如:當表單載入時,設定當觸發 btnAdd 的 Click 事件 時,即會執行 MyEvent 事件處理程 序,其寫法如下: | Public Sub Form_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load AddHandler btnAdd.Click, AddressOf MyEvent ……………… ………………. End Sub Public Sub MyEvent(ByVal sender As System.Object, ByVal e _ As System.EventArgs) ………………… End Sub

43 14.3.3 使用 RemoveHandler 及 AddressOf 刪除事件程序 若要將控制項事件的事件處理程序移除,可使用 RemoveHandler 配合 AddressOf 即可。 例如以下寫法,移除 btnAdd 控制項 Click 事件的 MyEvent 事件處理程序。 Public Sub Form_Load(ByVal sender As System.Object, ByVal _ e As System. EventArgs) Handles MyBase.Load _ RemoveHandler btnAdd.Click, Addressof MyEvent ………. ………. End Sub Public Sub MyEvent(ByVal sender As System.Object, ByVal System._ e As System.EventArgs) …………… End Sub

44

45

46 01 Public Class Form1 03 Private Sub Form1_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load 04 AddHandler txtN1.TextChanged, AddressOf MyButtonClick 05 AddHandler txtN2.TextChanged, AddressOf MyButtonClick 06 End Sub 07 08 Public Sub MyButtonClick(ByVal sender As System.Object, _ ByVal e As System.EventArgs) 09 lblAns.Text = (Val(txtN1.Text) + Val(txtN2.Text)).ToString 10 End Sub 11 12 Private Sub btnAdd_Click(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles btnAdd.Click 13 AddHandler txtN1.TextChanged, AddressOf MyButtonClick 14 AddHandler txtN2.TextChanged, AddressOf MyButtonClick 15 End Sub 16 17 Private Sub btnDel_Click(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles btnDel.Click 18 RemoveHandler txtN1.TextChanged, AddressOf MyButtonClick 19 RemoveHandler txtN2.TextChanged, AddressOf MyButtonClick 20 End Sub 21 22 End Class

47

48

49

50

51

52 【程式碼】 FileName:NineBlocks.sln 01 Public Class Form1 02 Dim OnColor As Color = Color.Violet 03 Dim OffColor As Color = Color.White 04 Dim seconds As Integer 05 Dim count1 As Integer 07 Dim ChangeCells(,) As Integer = { _ 08 {-1, -1, -1, -1, -1}, _ 09 {1, 2, 4, 5, -1}, _ 10 {2, 1, 3, -1, -1}, _ 11 {3, 2, 5, 6, -1}, _ 12 {4, 1, 7, -1, -1}, _ 13 {5, 2, 4, 6, 8}, _ 14 {6, 3, 9, -1, -1}, _ 15 {7, 4, 5, 8, -1}, _ 16 {8, 7, 9, -1, -1}, _ 17 {9, 5, 6, 8, -1} _ 18 }

53 19 Dim Buttons(9) As Button 21 Private Sub Button_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) 22 Dim btnHit As Button = CType(sender, Button) 23 Dim No As Integer = Integer.Parse(btnHit.Text) 24 Dim i As Integer 25 For i = 0 To 4 26 Dim X = ChangeCells(No, i) 27 If X <> -1 Then 28 If Buttons(X).BackColor.ToArgb = OffColor.ToArgb Then 29 Buttons(X).BackColor = OnColor 30 Else 31 Buttons(X).BackColor = OffColor 32 End If 33 End If 34 Next 35 count1 += 1 36 lblCount.Te

54 38 Dim sum As Integer = 0 39 For i = 1 To 9 40 If Buttons(i).BackColor.ToArgb = OnColor.ToArgb Then 41 sum += 1 42 End If 43 Next 44 If sum = 8 And Buttons(5).BackColor.ToArgb = OffColor.ToArgb Then 45 btnStart.Enabled = True 46 btnEnd.Enabled = True 47 tmrTime.Enabled = False 48 MsgBox(" 恭喜 ! 過關....") 49 For i = 1 To 9 50 Buttons(i).Enabled = False 51 Next 52 End If 53 End Sub

55 55 Private Sub Form1_Load(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles Me.Load 56 btnStart.Enabled = True 57 btnEnd.Enabled = False 58 AddHandler Button1.Click, AddressOf Button_Click 59 AddHandler Button2.Click, AddressOf Button_Click 60 AddHandler Button3.Click, AddressOf Button_Click 61 AddHandler Button4.Click, AddressOf Button_Click 62 AddHandler Button5.Click, AddressOf Button_Click 63 AddHandler Button6.Click, AddressOf Button_Click 64 AddHandler Button7.Click, AddressOf Button_Click 65 AddHandler Button8.Click, AddressOf Button_Click 66 AddHandler Button9.Click, AddressOf Button_Click 67 Buttons(1) = Button1 68 Buttons(2) = Button2 69 Buttons(3) = Button3 70 Buttons(4) = Button4 71 Buttons(5) = Button5 72 Buttons(6) = Button6 73 Buttons(7) = Button7 74 Buttons(8) = Button8 75 Buttons(9) = Button9 76 Dim i As Integer 77 For i = 1 To 9 78 Buttons(i).Enabled = False 79 Next 80 End Sub

56 82 Private Sub btnStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles btnStart.Click 83 count1 = 0 84 seconds = 0 85 lblCount.Text = " 次數 : " & count1.ToString() & " 次 " 86 lblTime.Text = " 秒數 : " & seconds.ToString() & " 次 " 87 Randomize() 88 Dim i As Integer 89 For i = 1 To 9 90 Buttons(i).Enabled = True 91 If Rnd() > 0.5 Then 92 Buttons(i).BackColor = OnColor 93 Else 94 Buttons(i).BackColor = OffColor 95 End If 96 Next 97 seconds = 0 98 tmrTime.Interval = 1000 99 tmrTime.Enabled = True 100 btnStart.Enabled = False 101 btnEnd.Enabled = True 102 End Sub

57 104 Private Sub tmrTime_Tick(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles tmrTime.Tick 105 seconds += 1 106 lblTime.Text = " 秒數 : " & seconds.ToString() & " 秒 " 107 End Sub 108 109 Private Sub btnEnd_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnEnd.Click 110 End 111 End Sub 112 113 End Class


Download ppt "第十四章 滑鼠鍵盤與共享事件. 14.1 鍵盤事件介紹 目前 PC 主要輸入工具是滑鼠與鍵盤。滑鼠是能在螢幕 做選取和快速定位的工具,至於鍵盤主要是輸入資料 的工具。 程式中靈活運用滑鼠與鍵盤所提供事件,可使得程式 生動不少。 譬如:在應用程式中對 TextBox 控制項,判斷到底 是按下哪個按鍵?或判斷一些較特殊的按鍵、組合."

Similar presentations


Ads by Google