190 likes | 306 Views
第十五章 事件. 1 5 -1 KeyPress 1 5 -2 KeyDown 及 KeyUp 1 5 -3 MouseDown 、 MouseUp 及 MouseMove 習題.
E N D
第十五章 事件 • 1 5 -1 KeyPress • 1 5 -2 KeyDown 及KeyUp • 1 5 -3 MouseDown 、MouseUp 及MouseMove • 習題
傳統的程式設計, 程式是從頭到尾依序執行, 現在的程式語言則都是事件驅動。所謂事件驅動, 是程式完成初值設定之後, 不斷的等待使用者的觸發, 觸發的來源包羅萬象, 有可能滑鼠被按一下、有可能輸入值已改變、有可能鍵盤被按一下等事件。因為事件驅動較符合使用者的習慣, 且可以減輕程式設計者的負擔, 所以已成為程式語言的主流。在本章之前, 本書常用的事件為表單的Load 、及滑鼠的Click 事件等, 本章的重點則是集中介紹一些鍵盤的KeyPress 、KeyDown 及KeyUP 事件、滑鼠的MouseDown 、MouseUP 及MouseMove 等事件。學習本章之後, 將有助於提昇電玩控制、影像繪圖等軟體的靈活度。
1 5 -1 KeyPress • 當使用者按一下鍵盤的一般字元倒退鍵及Enter鍵等具有ASCII 碼的鍵時, 都會產生KeyPress 事件, 電腦並傳回按鍵的字元。KeyPress 事件的語法如下: private void 物件名稱_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e) • 在以上語法中, 第一個參數Sender 是指觸發事件的物件; 第二個參數是一個KeyPressEventArgs 類別的物件, 透過此物件可取得使用者按下的鍵盤資訊, 其常用的屬性如下: • KeyChar 取得使用者所按下的字元。例如, 以下敘述可取得使用者所按下的字元。 private void textBox1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e) { label1.Text = e.KeyChar.ToString(); }
範例15-1a • 示範KeyPress 事件的用法。
1 5 -2 KeyDown 及KeyUp • 上一節的KeyPress 事件僅能傳回一般字元、倒退鍵及Enter鍵, 對於一些功能鍵、移位鍵及按鍵的同時是否按下Shift、Ctrl及Alt鍵則沒有反應。若要偵測以上特殊鍵功能, 或深入研究到底是鍵盤按下去、或彈上來的特殊時點, 則可使用本節的KeyDown 及KeyUp, KeyDown 與KeyUp 的語法完全相同, 如下所示: / /Ke yDown private void 物件名稱_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) / /Ke yUp private void 物件名稱_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e) • 以上語法中第二個參數是一個KeyEventArgs 類別的物件, 透過此物件可取得比KeyPress 事件更多的鍵盤資訊, 藉此作更複雜的鍵盤控制。KeyEventArgs 類別常用的屬性介紹如下:
KeyCode • 取得KeyDown 或KeyUp 事件的按鍵碼。例如, 以下敘述可取得使用者所按下的按鍵碼。 private void txt1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) { lblKeyCode.Text = e.KeyCode.ToString(); } • 此外, KeyCode 屬性所回傳的按鍵碼是屬於Keys 列舉型別的成員, 若讀者需要判斷使用者是否按下特定鍵時, 可用KeyCode 屬性與Keys 型別的成員作比較。例如, 以下敘述可判斷使用者是否按下左移位鍵。 private void Form1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) { if (e.KeyCode == Keys.Left) { . . . // 欲處理之程式碼 } }
KeyData • KeyData 屬性也是取得KeyDown 或KeyUp 事件的按鍵碼, 但其和KeyCode屬性不同之處在於---- Keycode 屬性僅能取得單一按鍵碼, 但KeyData 可取得組合鍵的按鍵碼。例如當使用者按下Ctrl+C 鍵時, KeyCode 屬性僅會傳回按鍵碼"C", 但KeyData 則會傳回按鍵碼"C, Shift" 。例如, 以下敘述可取得使用者所按下的組合按鍵碼。 private void txt1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) { lblKeyData.Text = e.KeyData.ToString(); }
KeyValue • 取得KeyDown 或KeyUp 事件以整數表示的按鍵值。例如, 當使用者按下C鍵時, 其傳回值為67 。以下敘述是其使用的方法。 private void txt1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) { lblKeyValue.Text = e.KeyValue.ToString(); }
Alt • 判斷按鍵的同時, 是否也按下了Alt鍵, 如果有則傳回True, 否則傳回False 。例如, 以下敘述得知使用者是否按了Alt鍵。 private void txt1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) { lblAlt.Text = e.Alt.ToString(); }
Control • 判斷按鍵的同時, 是否也按下了Ctrl鍵。例如, 以下敘述可得知使用者是否按了Ctrl鍵。 private void txt1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) { lblControl.Text = e.Control.ToString(); }
Shift • 判斷按鍵的同時, 是否也按下了ShiftShift鍵。例如, 以下敘述可得知使用者是否按了鍵。 private void txt1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) { lblShift.Text = e.Shift.ToString(); }
範例15-2a • 示範KeyDown 事件。
範例15-2b • 同範例14-8b, 請用鍵盤的←、→、↑、↓鍵移動照片, Page up、Page down鍵改變照片的大小。
1 5 -3 MouseDown 、MouseUp 及MouseMove • 滑鼠最常用的事件為Click 與DoubleClick, 若要進一步得知滑鼠的何鍵被按及按鍵的滑鼠指標座標, 則應使用本節的MouseDown 、MouseUp 及MouseMove, 其中MouseDown 是任意滑鼠鍵被按均產生此事件, MouseUp 則是產生於滑鼠任意鍵被按下去且彈上來時, MouseMove 則只要使用者在某物件上方移動時, 該物件即產生MouseMove 事件, 以上三事件語法如下: private void 物件名稱_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) private void 物件名稱_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e) private void 物件名稱_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e) • 以上語法中第二個參數是一個MouseEventArgs 類別的物件, 此物件可取得以上三事件的滑鼠資訊, 其常用的屬性介紹如下:
Button 屬性 • 取得使用者按下哪個滑鼠鍵。此屬性可傳回一個MouseButtons 列舉型別的成員, 其成員如下表:
例如, 以下敘述可取得使用者所按下滑鼠鍵的資訊。 private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) { lblButton.Text = e.Button.ToString(); } • X 與Y 屬性對於MouseDown 與MouseUp 事件, 其傳回滑鼠鍵被按下或放開時的X 、Y 座標位置; 對於MouseMove 事件則是傳回滑鼠指標目前所在之處的X 、Y 座標。例如, 以下敘述若置於MouseDown 事件中, 可取得滑鼠鍵被按下時的X、Y 座標。 private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) { lblXY.Text = e.X.ToString() + ", " + e.Y.ToString(); }
範例15-3a • 示範MouseDown 與MouseMove 事件。
範例15-3b • 寫一程式, 可以讓使用者按住滑鼠左鍵畫線, 按住滑鼠右鍵可擦拭所畫圖形。
習題 • 1. 請設計一個3 x 3 的智慧方塊, 使用者可將依亂數排列的小方塊重新排列。 • 2. 請設計一個踩影子遊戲, 遊戲規則如下: • 使用者用鍵盤的上、下、左、右鍵及加速鍵操控螢幕的鐵錘, • 錘打依亂數自由移動的笑臉圖案, • 當鐵錘打到笑臉時印出使用者按鍵次數及使用時間。