Microsoft PowerPoint - 11_EventHandle.pptx

Similar documents
(Microsoft Word - wes _\246p\246\363\250\317\245\316LED\277O\305\343\245\334\252\254\272A.doc)

CHAPTER VC#

事件的處理

PowerPoint Presentation

投影片 1

untitled

(Microsoft Word - wes _\246p\246\363\250\317\245\316watchdog\250\276\244\356\265{\246\241\267\355\276\367.doc)

穨ac3-3.PDF

附 錄

Microsoft PowerPoint - 09_事件驅動.ppt

Microsoft PowerPoint - 18_Event.pptx

Microsoft PowerPoint - VB14.ppt

Spyder Anaconda Spyder Python Spyder Python Spyder Spyder Spyder 開始 \ 所有程式 \ Anaconda3 (64-bit) \ Spyder Spyder IPython Python IPython Sp

X6-04_How_do_I_write_a_com_port_communicate_program_of_XPAC_tc

主程式 : public class Main3Activity extends AppCompatActivity { ListView listview; // 先整理資料來源,listitem.xml 需要傳入三種資料 : 圖片 狗狗名字 狗狗生日 // 狗狗圖片 int[] pic =new

投影片 1

新・解きながら学ぶJava

untitled

untitled

Microsoft Word - ch05.doc

3-1 Wii ( )

untitled

untitled

Microsoft PowerPoint - 07_WinProg.pptx

任務二 : 產生 20 個有炸彈的磚塊, 放在隨機的位置編輯 Block 類別的程式碼 import greenfoot.; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) Write a description of class

VB程序设计教程

Chapter 16 集合

ch02

Microsoft Word - before.docx

四川省普通高等学校

Visual Basic D 3D

Visual Basic 2010 INTRODUCTION 本書導讀! Visual Basic 2010 Visual Basic 2010 Visual Studio Visual Basic Windows Form IV

Microsoft PowerPoint - 08_IOInterface.pptx

PowerPoint Presentation

Microsoft Word - administrative-law-08.doc

CHAPTER 1

Microsoft PowerPoint - C_Structure.ppt

Microsoft Word - 第3章.doc

The golden pins of the PCI card can be oxidized after months or years

投影片 1

滑鼠事件的處置 01 首先, 思考一下用滑鼠畫線的操作動作, 為此必須處理 : mousedown mousemove mouseup 等 3 個事件 各個事件中進行的處理如表 01-1 所示 一開始加入的事件處理器只有 mousedown, mousemove mouseup 的事件處理器則是視需

2 WF 1 T I P WF WF WF WF WF WF WF WF 2.1 WF WF WF WF WF WF

INTRODUCTION TO COM.DOC

概述

CC213

untitled

Python a p p l e b e a r c Fruit Animal a p p l e b e a r c 2-2

Microsoft Word - 01.DOC

untitled

840 提示 Excel - Excel -- Excel (=) Excel ch0.xlsx H5 =D5+E5+F5+G5 (=) = - Excel 00

IsPostBack 2

<4D F736F F D DA5BFA6A1C476C1C92DBEC7ACECB8D5A8F728B57BB35D292E646F63>

Microsoft Word - ch06.doc

FY.DOC

用手機直接傳值不透過網頁連接, 來當作搖控器控制家電 ( 電視遙控器 ) 按下按鍵發送同時會回傳值來確定是否有送出 問題 :1. 應該是使用了太多 thread 導致在傳值上有問題 2. 一次按很多次按鈕沒辦法即時反應

Web Form 表單與事件處理

星星排列 _for loop Protected Sub Page_Load(ByVal sender As Object, ByVal e As Dim h As Integer = 7 'h 為變數 ' Dim i, j As Integer For i = 1 To h

0 0 = 1 0 = 0 1 = = 1 1 = 0 0 = 1

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc

untitled

Microsoft Word - ch04三校.doc

1

單步除錯 (1/10) 打開 Android Studio, 點選 Start a new Android Studio project 建立專案 Application name 輸入 BMI 點下 Next 2 P a g e

<4D F736F F D20AC4FBDBDA4FBB67DA96CAABA2DA743A67EAFC5AAA95FA7B9BD5A5F2E646F63>

ex

PowerPoint 簡報

Microsoft PowerPoint - 09_CommonComponents.pptx

專題報告.PDF

新版 明解C++入門編

05855BB03.indd

untitled

C/C++ - 字符输入输出和字符确认

此運算子具有的優先順序高於下一個區段且低於前一個區段 請注意, 您可以按一下運算子以移至內附範例的詳細資料頁面 x && y 邏輯 AND 如果第一個運算元為 false,c# 就不會評估第二個運算元 條件 OR 運算子 此運算子具有的優先順序高於下一個區段且低於前一個區段 請注意, 您可以按一下運

Java

導讀 ASP.NET HTML ASP 第一篇 基礎篇第 1 章 認識 ASP.NET ASP.NET ASP.NET ASP.NET ASP.NET 第 2 章 認識 Visual Studio 20 開發環境 Visual Studio 20 Visual Studio 20 第二篇 C# 程式

<4D F736F F D B0D3B77EC3FEA7DEC3C0C476C1C9A5BFA6A1B8D5C3442DB57BA6A1B35DAD702DBEC7ACEC2E646F6378>

PowerPoint 簡報

敘述及物件

運算子多載 Operator Overloading

untitled

untitled

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

untitled

_汪_文前新ok[3.1].doc

Microsoft PowerPoint - vb.net2.ppt

全国计算机技术与软件专业技术资格(水平)考试

PowerPoint 演示文稿

PowerPoint Presentation

Microsoft PowerPoint - Class2.pptx

05857AB....A.indd

碩命題橫式

CC213

多媒體應用 13 新增專案並完成版面配置 <ExMusic01> <activity_main.xml> ImageView ID imgplay ImageView ID imgstop ImageView ID imgfront TextView ID txtsong TextView ID t

Microsoft Word - GUI design.doc

1-6 Access 2016 實力養成暨評量解題秘笈 102. 書籍與作者 Step1 按 建立 索引標籤 資料表 群組的 資料表設計 按鈕 Step2 由上而下分別建立下列欄位並設定資料類型 : 欄位名稱 : ID, 資料類型 : 自動編號 欄位名稱 : BName, 資料類型 :

¾ú¥v¬ì²Ä8¦¸-«ü¦Ò«ÊŁ±.prn, page Normalize ( <4D F736F F D20BEFAA576ACECB2C438A6B82DABFCA6D2ABCAADB12E646F63> )

Microsoft PowerPoint - OPVB1基本VB.ppt

untitled

Ch6 Visual Basic表單,功能表與模組

Microsoft PowerPoint - 12 jQuery Mobile 事件處理方式

Transcription:

第十一章 視窗事件處理技巧 11.1 事件介紹 11.3 滑鼠事件 11.2 鍵盤事件 11.4 共享事件 備註 : 可依進度點選小節

11.1 事件介紹 事件 (Event) 是物件受到外力因素的影響, 而發生某種動作 將觸發事件的物件稱為 事件傳送者事件傳送者 將捕捉事件並且回應它的物件稱為 事件接收者事件接收者 當事件發生時, 這物件的事件處理函式會被啟動 事件處理函式內的程式碼是依程式的需求而撰寫的, 等於告訴電腦, 當某物件發生某事件就去執行所撰寫的程式碼 在事件驅動應用程式中, 不像程序化的應用程式控制程式執行部分和所產生的結果, 而是程式碼執行流程是由操作者來決定, 以回應事件的發生 事件的引發有可能是使用者的動作, 也可能是來自作業系統或其它應用程式 甚至來自應用程式本身的訊息甚至來自應用程式本身的訊息 在設計事件驅動程式時, 瞭解整個事件驅動模式是很重要 2

11.2 鍵盤事件 11.2.1 KeyPress 事件 當某個物件取得 Focus( 駐點或稱控制權 ) 時, 按下鍵盤某個按鍵, 就會觸動該物件的鍵盤事件 當做完按下按鍵再放開動作時, 會依序觸動 KeyDown KeyPress 和 KeyUp 三個事件 當物件取得駐點時, 收到按鍵被按下又放開後所觸動的事件, 會傳回按鍵的字元 如果使用者按的不是字元按鍵 ( 例如 鍵 ), 是不會觸動 KeyPress 事件, 但 KeyDown 和 KeyUp 事件仍會觸發 KeyPress 事件處理函式寫法 : private void 物件 _KeyPress(object sender, KeyPressEventArgs e) { // 程式區塊 } 3

KeyPress 事件處理函式的第一個參數 sender 代表觸發 KeyPress 事件的物件 ; 第二個參數 e 為 KeyPressEventArgs 型別,e 用來表示事件相關資料的物件 e 常使用的屬性如下說明 : 4

KeyPress 的功能主要是在取得由鍵盤所按鍵的字元, 所以檢查字元是否合法的程式碼會寫在 KeyPress 事件中 事件中引數 e 的 KeyChar 屬性值可以取得輸入的字元, 其資料型別為字元 (Char) 如果想將字元轉為 ASCII 碼 ( 鍵盤碼 ), 可用 (byte)e. Keychar 將所按鍵盤的字元轉成 ASCII 碼 另外事件中引數 e 的 Handled 屬性值也是非常重要, 如檢查輸入的字元為不合法時, 只將 Handled 屬性值設為 true, 該字元就會被清除且插入點游標停留在原處 例如希望使用者只能輸入英文字母, 其判斷式寫法 : ( 字母的 ASCII 碼由 65~90) 5

寫法 1: int n = (byte )e.keychar; if (n < 65 n > 90) { e.handled = true; } 寫法 2: char ch = e.keychar; if (ch < 'A' ch > 'Z') { e.handled = true; } 6

使用者在第一個文字方塊可輸入大於零的數值 ( 含小數 ), 輸入後按鍵, 控制權會移到第二個文字方塊 第二個文字方塊輸入數值後按鍵, 控制權會移到鈕 如輸入的不是數值, 出現錯誤的提示訊息 7

輸出入介面 8

// FileName : KeyPressEvent.sln 01 private void txtnum1_keypress(object sender, KeyPressEventArgs e) 02 { 03 char ch = e.keychar; 04 // 判斷是否輸入數字. 倒退鍵和 Enter 鍵 05 if ((ch < '0' ch > '9') && (ch!= '.' && ch!= '\b')) 06 { 07 if ((byte)ch == 13) 08 { 09 txtnum2.focus(); 10 } 11 else 12 { 13 e.handled = true; 14 MessageBox.Show(" 請輸入數字 ", " 錯誤!!", MessageBox 15 } 16 } 17 } Buttons. OK,MessageBoxIcon.Error); 9

19 private void txtnum2_keypress(object sender, KeyPressEventArgs e) 20 { 21 char ch = e.keychar; 22 // 判斷是否輸入數字. 或倒退鍵和 Enter 鍵 23 if ((ch < '0' ch > '9') && (ch!= '.' && ch!= '\b')) 24 { 25 if ((byte)ch == 13) // 按 Enter 鍵游標跳到 btnok 鈕 26 { 27 btnok.focus(); 28 } 29 else 30 { 31 e.handled = true; 32 MessageBox.Show(" 請輸入數字 ", " 錯誤!!", MessageBox Buttons.OK,MessageBoxIcon.Error); 33 } 34 } 10

37 private void btnok_click(object sender, EventArgs e) 38 { 39 lblsum.text = " 兩數加相為 :" + (double.parse(txtnum1.text) + 40 } 41 double.parse(txtnum2.text)).tostring(); 42 private void btnend_click(object sender, EventArgs e) 43 { 44 Application.Exit(); 45 } 11

11.2.2 KeyDown 和 KeyUp 事件 一. KeyDown 事件 當控制項收到按鍵被按下時所觸動的事件 寫法 : private void 物件 _KeyDown(object sender, KeyEventArgs e) { } // 程式區塊 12

二. KeuUp 事件 當控制項收到按鍵被放開時所觸動的事件 寫法 : private void 物件 _KeyUp(object sender, KeyEventArgs e) { // 程式區塊 } 第一個參數 sender 代表觸發該事件的物件 第二個參數 e 為 KeyEventArgs 型別 e 用來表示事件相關資料的物件 13

事件中引數 e 有些屬性可取得使用者按鍵情形其屬性 : 14

鍵盤上每個按鍵, 有對應鍵盤碼也可用 Keys 列舉常數 : 有對應鍵盤碼 (KeyCode) 15

利用鍵盤 方向鍵, 來控制圖片移動的方向 程式開始執行先以 down.gif 顯現, 若按住方向鍵不放時, 圖片會持續移動 不同的方向鍵會使用不同的圖形檔 當放開按鍵時, 圖片停在原地以圖顯現 圖形檔圖形檔置於書附光碟 chap11\image 資料夾中 up.gif down.gif left.gif right.gif 16

輸出入介面 17

// FileName : KeyUpDownEvent.sln 01 private void Form1_Load(object sender, EventArgs e) 02 { 03 imagelist1.images.add(image.fromfile("up.gif")); 04 imagelist1.images.add(image.fromfile("down.gif")); 05 imagelist1.images.add(image.fromfile("left.gif")); 06 imagelist1.images.add(image.fromfile("right.gif")); 07 picmove.image = imagelist1.images[1]; 08 } 09 18

10 private void Form1_KeyDown(object sender, KeyEventArgs e) 11 { 12 switch (e.keycode) 13 { 14 case Keys.Up: 15 picmove.image = imagelist1.images[0]; 16 picmove.top -= 5; 17 break; 18 case Keys.Down: 19 picmove.image = imagelist1.images[1]; 20 picmove.top += 5; 21 break; 22 case Keys.Left: 23 picmove.image = imagelist1.images[2]; 24 picmove.left -= 5; 25 break; 19

26 case Keys.Right: 27 picmove.image = imagelist1.images[3]; 28 picmove.left += 5; 29 break; 30 } 33 private void Form1_KeyUp(object sender, KeyEventArgs e) 34 { 35 picmove.image = imagelist1.images[1]; 36 } 20

11.3 滑鼠事件 21

11.3.1 Click 和 DoubleClick 事件 當使用者按滑鼠左鍵, 會依序觸發 MouseDown Click 和 MouseUp 三個事件 可依照需求將程式碼寫在適當事件處理函式 當使用者當使用者快按兩下滑鼠左鍵, 也會依序觸發 MouseDown Click DoubleClick 和 MouseUp 四個事件 11.3.2 MouseDown 和 MouseUp 事件 當使用者按下和放開滑鼠按鍵, 會分別觸發 MouseDown 事件和 MouseUp 事件 在事件中引數 e 有一些屬性, 可提供一些重要的訊息 22

23

11.3.3 MouseEnter MouseMove 和 MouseLeave 事件 當使用者移動滑鼠游標到一個控制項時, 會觸發 MouseEnter 事件 在控制項中移動會觸發 MouseMove 事件 離開控制項會觸發 MouseLeave 事件 以上三個事件中引數 e 有一些屬性, 可提供一些重要的訊息 24

視窗左邊有個大箱子, 右邊有個小箱子 當滑鼠指到小箱子時, 游標形狀會呈手型, 並且蓋子會掀開 滑鼠離開時, 蓋子合上 拖曳小箱子時, 小箱子會隨之移動 拖曳小箱子到大箱子中間時, 小箱子會消失且大箱子會變大, 但小箱子有一部分不在大箱子中是沒有動作 25

輸出入介面 26

// FileName : MouseUpDownEvent.sln 01 bool drag = false; 02 int x_down, y_down; 03 private void Form1_Load(object sender, EventArgs e) 04 { 05 imagelist1.images.add(image.fromfile("box1.gif")); 06 imagelist1.images.add(image.fromfile("box2.gif")); 07 picsmall.image = imagelist1.images[0]; 08 piclarge.image = imagelist1.images[0]; 09 } 10 11 private void picsmall_mouseenter(object sender, EventArgs e) 12 { 13 picsmall.image = imagelist1.images[1]; 14 } 15 27

16 private void picsmall_mouseleave(object sender, EventArgs e) 17 { 18 picsmall.image = imagelist1.images[0]; 19 } 20 21 private void picsmall_mousedown(object sender, MouseEventArgs e) 22 { 23 drag = true; 24 x_down = e.x; 25 y_down = e.y; 26 picsmall.image = imagelist1.images[0]; 27 } 28 29 private void picsmall_mousemove(object sender, MouseEventArgs e) 30 { 31 if (drag) 32 { 33 picsmall.top += (e.y - y_down); 34 picsmall.left += (e.x - x_down); 35 } 36 } 28

38 private void picsmall_mouseup(object sender, MouseEventArgs e) 39 { 40 bool x_in, y_in; 41 drag = false; 42 y_in = (picsmall.top > piclarge.top) && (picsmall.top + picsmall.height) < (piclarge.top + piclarge.height); 43 x_in = (picsmall.left > piclarge.left) && (picsmall.left + picsmall.width) < (piclarge.left + piclarge.width); 44 if (x_in && y_in) 45 { 46 picsmall.visible = false; 47 piclarge.top -= 20; 48 piclarge.left -= 20; 49 piclarge.width += 40; 50 piclarge.height += 40; 51 } 52 } 29

11.4 共享事件 11.4.1 使用共享事件的好處若多個按鈕控制項的 Click 事件處理函式內的程式碼除物件名稱外其它完全相同, 但還要逐一輸入相同的程式碼, 非常沒效率? 本節將介紹如何使多個控制項的事件去共用 ( 共享 ) 一個事件處理函式, 以達到簡化程式提高程式的維護 30

當在表單載入時觸發 Form1_Load 事件處理函式時, 可使用 += 運算子及 new EventHandler 來指定事件處理函式是由哪個物件的事件來觸發, 例如按鈕 btn1 的 Click 事件被觸發時即執行 btn1_click 事件處理函式, 寫法 : private void Form1_Load(object sender, EventArgs e) { } btn1.click += new EventHandler(btn1_Click); private void btn1_click(object sender, EventArgs e) { } // 程式區塊 31

如希望 btn1 btn2 和 btn3 的 Click 事件, 能共同使用 btn1_click 事件處理函式, 程式碼寫法 : private void Form1_Load(object sender, EventArgs e) { btn1.click += new EventHandler(btn1_Click); btn2.click += new EventHandler(btn1_Click); btn3.click += new EventHandler(btn1_Click); } 32

另外不同類別的控制項或事件也可共用事件, 如希望 btn1 的 Click btn2 的 Enter 和 textbox1 的 TextChanged 事件, 能一起共用 btn1_click 事件處理函式, 程式碼寫法 : private void Form1_Load(object sender, EventArgs e) { } btn1.click += new EventHandler(btn1_Click); btn2.enter += new EventHandler(btn1_Click); textbox1.textchanged += new EventHandler(btn1_Click); 33

11.4.2 動態新增與移除事件 一. 新增事件語法 語法 : 物件. 事件 +=new EventHandler( 事件處理函式 ); [ 例 ] 指定當按 btnok 鈕觸發該鈕的 Click 事件時所要執行的是 z MyClick 事件處理函式, 寫法如下 : btnok.click+=new EventHandler(MyClick); 二. 移除事件語法 語法 : 物件. 事件 -=new EventHandler( 事件處理函式 ); [ 例 ] 欲移除 btnok 鈕 Click 事件所要執行的 MyClick 事件處理函式, 寫法 : btnok.click-=new EventHandler(MyClick); 34

11.4.3 控制項來源的判斷 若當觸發共用事件時要知道是哪個物件被按下, 就可在事件處理函式中將 sender 轉型成要使用的物件, 接著再利用 Equals 方法來判斷 例如 :btn1 和 btn2 共用同一個事件處理函式, 如果按 btn1 時 label1 顯示 Visual C# ; 按 btn2 時 lable1 顯示 2008, 寫法 Button btn=(button)sender; //sender 轉型成 Button 再指定給 btn if (btn.equals(btn1)) { label1.text = " Visual C# "; } else { label1.text = " 2008"; } 35

Button btn=(button)sender; MessageBox.Show( 你按下 + btn.text + 鈕 ); 36

共有 16 種國旗亂數出現, 使用者按國名鈕選擇答案, 答錯時顯示答案 若按鈕時, 顯示下一種國旗 ; 若按鈕時, 顯示上一種國旗,16 題答完就顯示答對題數 當按鈕後, 重新做答 37

38

// FileName : FlagTest.sln 01 string[] flag_name = new string[] { " 德國 ", " 瑞典 ", " 新加坡 ", " 菲律賓 ", " 智利 ", " 馬來西亞 "," 挪威 ", " 科威特 ", " 南非 ", " 希臘 ", " 印度 ", " 加拿大 ", " 以色列 ", " 比利時 ", " 日本 ", " 巴西 " }; 02 int test_num, right_num; 03 int[] question = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }; 04 05 private void Form1_Load(object sender, EventArgs e) 06 { 07 this.text = " 國旗常識大考驗!"; 08 for (int i = 0; i <= flag_name.getupperbound(0); i++) 09 { 10 imagelist1.images.add(image.fromfile(flag_name[i] + ".jpg")); 11 } 39

12 btn1.click += new EventHandler(btn1_Click); 13 btn2.click += new EventHandler(btn1_Click); 14 btn3.click += new EventHandler(btn1_Click); 15 btn4.click += new EventHandler(btn1_Click); 16 btn5.click += new EventHandler(btn1_Click); 17 btn6.click += new EventHandler(btn1_Click); 18 btn7.click += new EventHandler(btn1_Click); 19 btn8.click += new EventHandler(btn1_Click); 20 btn9.click += new EventHandler(btn1_Click); 21 btn10.click += new EventHandler(btn1_Click); 22 btn11.click += new EventHandler(btn1_Click); 23 btn12.click += new EventHandler(btn1_Click); 24 btn13.click += new EventHandler(btn1_Click); 25 btn14.click += new EventHandler(btn1_Click); 26 btn15.click += new EventHandler(btn1_Click); 27 btn16.click += new EventHandler(btn1_Click); 28 btnnew.click += new EventHandler(btnNew_Click); 29 btnlast.click += new EventHandler(btnNext_Click); 30 btnnew_click(sender, e); 31 } 40

33 private void btn1_click(object sender, EventArgs e) 34 { 35 Button btn = (Button)sender; 36 if (btn.text == flag_name[question[test_num - 1] - 1]) 37 { 38 lblnews.text = " 你答對了! "; 39 right_num += 1; 40 } 41 else 42 { 43 lblnews.text = " 你答錯了! 答案是 " + flag_name[question [test_num - 1] - 1]; 44 } 45 } 46 41

47 private void btnnew_click(object sender, EventArgs e) 48 { 49 int j, k, t; 50 Random rnd = new Random(); 51 for (int i = 1; i <= 12; i++) 52 { 53 do 54 { 55 j = rnd.next(16); 56 k = rnd.next(16); 57 } while (j == k); 58 t = question[j]; 59 question[j] = question[k]; 60 question[k] = t; 61 } 62 test_num = 1; right_num = 0; 63 picflag.image = imagelist1.images[question[0] - 1]; 64 lblnews.text = " 第 " + test_num + " 題 "; 65 } 42

67 private void btnnext_click(object sender, EventArgs e) 68 { 69 Button btn = (Button)sender; 70 if (btn.equals(btnnext)) { 72 test_num += 1; 73 } 74 else { 76 test_num -= 1; 77 if (test_num == 0) { 79 test_num = 1; 80 } 81 } 82 if (test_num <= 16) { 84 lblnews.text = " 第 " + test_num + " 題 "; 85 picflag.image = imagelist1.images[question[test_num - 1] - 1]; 86 } 87 else { 89 test_num = 16; 90 lblnews.text = " 你已經答完全部題目! 共答對 " + right_num + " 題 "; 91 } 92 } 43