計算機程式 Visual BASIC 程式設計 四海工商專校 電算中心 廖文淵 E-Mail: andres@sitc.edu.tw
Chapter 11 繪圖 1. VB座標系統 2. 色彩 3. 圖形方法 4. 直線控制項 (Line) 5. 幾何圖形控制項 (Shape) 6. 滑鼠事件 7. 鍵盤事件
1. VB座標系統 使用繪圖區域或收納器的座標系統圖形作業 表單使用座標 (x, y)定義格線的位置 調整大小、移動和繪圖 定義表單和控制項的位置 使用座標 (x, y)定義表單格線的位置 表單使用座標 (x, y)定義格線的位置 x 值是沿 x 軸的位置,最左方是預設位置 0 y 值是沿 y 軸的位置,最上端是預設位置 0
座標系統使用規則 收納器: 用來移動或調整表單大小的陳述式,必然是在格線上表示 表單的位置和大小 表單為收納器 : 在表單上繪製、移動、調整控制項的大小 框架或控制項為收納器 : 框架或圖片方塊裡繪製控制項時 圖形和 Print 方法,皆使用收納器的座標系統 用來移動或調整表單大小的陳述式,必然是在格線上表示 表單的位置和大小 建立程式碼時,先檢查 Screen 物件的 Height 和 Width 屬 性,以確定表單在螢幕上大小是否合適 預設座標 : 螢幕、收納器左上角是(0,0) 刻度 : 定義沿座標軸位置的測量單位,每個軸都有自己的刻度
twips 預設情況下 1twip = 印表機解析點的 1/20 1440 twips = 1英吋 567 twips = 1公分 所有 VB 的移動、調整大小和圖形繪製的陳述式,皆使用一個 twip 為單位 1twip = 印表機解析點的 1/20 1440 twips = 1英吋 567 twips = 1公分 可指定物件列印出來的大小 螢幕上的實體距離的變動是根據顯示器的大小
設定座標系統(1) -- 使用預設刻度 使用表單和圖片方塊刻度屬性預設值 物件預設刻度左上角座標 = (0,0) 預設刻度單位為 twips ScaleLeft ScaleTop ScaleWidth ScaleHeight ScaleMode 物件預設刻度左上角座標 = (0,0) 預設刻度單位為 twips 使用沒有引數的 Scale 方法: 傳回預設的刻度
設定座標系統(2) -- ScaleMode屬性 0 - 使用者定義,直接設定ScaleWidth、ScaleHeight、ScaleTop 或 ScaleLeft,則 ScaleMode 屬性會自動地設定為 0 1 - Twips,VB預設刻度,1440 twips = 1英吋 2 - 點,72 點 = 1英吋 3 - 映像點,顯示器或印表機解析度的最小單位。每英吋裡映像點的數目是由週邊設備的解析度來決定 4 - 字元,列印時,一個字元是 1/6 英吋高、1/12 英吋寬 5 - 英吋 6 - 公厘 7 - 公分 除了 0 和 3,其餘模式都可引用為列印的長度 ScaleMode = 5 '設定表單的刻度單位為英吋 picPicture1.ScaleMode = 3 '設定 picPicture1 的刻度單位為映像點
設定座標系統(3) -- 自訂刻度 ScaleLeft、ScaleTop 屬性: ScaleWidth、ScaleHeight 屬性: 指定物件左上角的數值 ScaleLeft = 100 ScaleTop = 100 picArena.ScaleLeft = 100 picArena.ScaleTop = 100 ScaleWidth、ScaleHeight 屬性: 根據繪圖區域目前的寬度和高度定義單位 ScaleWidth = 1000 定義表單內部寬度的水平單位 1/1,000 ScaleHeight = 500 表單內部高度的垂直單位為 1/500
Scale 方法 語法: x1、y1 : 決定 ScaleLeft 和 ScaleTop 屬性的設定 [object.]Scale (x1, y1) - (x2, y2) x1、y1 : 決定 ScaleLeft 和 ScaleTop 屬性的設定 兩個x-座標和兩個 y-座標之間的差異分別決定 ScaleWidth 和 ScaleHeight 屬性的設定 Scale (100, 100)-(200, 200) 定義表單為 100 單位寬和 100 單位高 x1 > x2 或 y1 > y2 的值,則與設定 ScaleWidth 或 ScaleHeight 為負值的效果相同
2. 色彩 ‧使用 RGB 函數 由Long 整數表示,其值在指定色彩的所有內容中,皆具 有相同的涵義 在執行階段有四種方法可用來指定色彩值: ‧使用 RGB 函數 ‧使用 QBColor 函數 選取 Microsoft QuickBasic(R) 16 種色彩中的一種 ‧使用表列在「瀏覽物件」中的內部常數之一 ‧直接輸入色彩值
(1) 使用 RGB 函數 給定GRB三數值輸入到 RGB 函數 指定結果到色彩屬性或色彩引數 從 0 到 255 中的數值 0 表示亮度最低,255 表示亮度最高 使用紅-綠-藍的排列順序 指定結果到色彩屬性或色彩引數 '設定背景為綠色。 Form1.BackColor = RGB(0, 128, 0) '設定背景為黃色。 Form2.BackColor = RGB(255, 255, 0) '設定點為深藍色。 PSet (100, 100), RGB(0, 0, 64)
(2) 使用定義的內部常數 常數 vbRed BackColor = vbRed
(3) 直接使用色彩設定 RGB 色彩有效範圍 色彩設定 : 4-位元的整數 十六進位數指定色彩語法: 0 到 16,777,215 (&HFFFFFF&) 色彩設定 : 4-位元的整數 高位元數等於 0,而較低的三個位元,從最低到最高顯著的位元 組,分別決定了紅、綠、藍三種色彩的數目 紅、綠、藍三種元件皆使用 0 到 255 (&HFF) 之間的數值表示 十六進位數指定色彩語法: &HBBGGRR& 每個部分都是兩位從 00 到 FF 的十六進位數。中間值為 80 &H808080&
色彩屬性 BackColor ForeColor BorderColor FillColor 設定表單或控制項的背景色彩 設定表單或控制項中,以繪圖方法所建立的文字或圖形色彩 改變 ForeColor 屬性,並不影響已建立的文字或圖形 BorderColor 設定幾何圖形控制項邊框色彩 FillColor 設定填滿 Circle 方法所建立的圓之色彩 設定填滿 Line 方法建立的方塊之色彩
3. 圖形方法 [物件名稱.] 圖形方法 物件名稱: 表單、圖片方塊、 Printer 物件 省略物件名稱,VB假設要繪製在表單上
Cls 方法 [object.]Cls 清除繪圖區域 指定的繪圖區域會重畫其背景色彩 未指定 object 則會清除程式碼所對應的表單
Pset方法 (平面繪點) x 和 y 引數 : 單一精確度,可以接受輸入任何數值的運算 式,包括變數 color 引數 : 設定映像點色彩 [object.]PSet (x, y)[, color] x 和 y 引數 : 單一精確度,可以接受輸入任何數值的運算 式,包括變數 color 引數 : 設定映像點色彩 PSet (10.75, 50.33) MyForm.PSet (230, 1000) picPicture1.PSet (1.5, 3.2) PSet (50, 75), RGB(0, 0, 255)
Blanker應用程式 若您要「清除」一點,只要將其設定為背景色彩即可: Sub PSetDemo () R = 255 * Rnd '設定紅色為隨機值 G = 255 * Rnd '設定綠色為隨機值 B = 255 * Rnd '設定藍色為隨機值 XPos = Rnd * ScaleWidth '設定水平位置 YPos = Rnd * ScaleHeight ‘設定垂直位置 PSet (XPos, YPos), RGB(R, G, B) '用隨機色彩繪點 End Sub 若您要「清除」一點,只要將其設定為背景色彩即可: PSet (50, 75), BackColor
Point 方法 傳回指定位置的色彩值: PointColor = Point (500, 500) [object.] point (x, y) 傳回指定位置的色彩值: PointColor = Point (500, 500)
Line 方法 (繪製直線) object : (x1, y1) : 物件名稱 選擇性的。若省略,目前的 x,y 位置當作終點 目前位置 : [object.]Line [(x1, y1)]-(x2, y2)[, color] object : 物件名稱 (x1, y1) : 選擇性的。若省略,目前的 x,y 位置當作終點 目前位置 : CurrentX 和 CurrentY 屬性指定 之前圖形或 Print 方法所繪製的最後一點位置 若以上二者都沒有使用過,則預設位置為物件的左上角
Line 方法 (2) x 和 y 引數 : color 引數 : 整數、分數 直線的色彩 若省略color 引數,直線的色彩 = 物件 ForeColor 屬性 Line (500, 500)-(2000, 2000), RGB(0, 0, 255)
Example Line (500, 500)-(2000, 2000) CurrentX = 1500 '設定起始點的 x 座標 CurrentY = 500 '設定起始點的 y 座標 Line -(3000, 2000) '從起點的右下方畫一直線 Line -(1500, 2000) '從目前點的左方畫一直線 Line -(1500, 500) ’向右上方畫一直線到起始點
Step 關鍵字 語法: 指定相對於繪製點最後位置的點。加入最後繪製點的值到 x 和 y 的值裡 可免除需要時常地記錄最後繪製點的位置 Line (100, 200)-(150, 250) 等於: Line (100, 200)-Step(50, 50) 可免除需要時常地記錄最後繪製點的位置 通常較關心的可能是兩點的相對位置,而非它們的絕對位置
繪製方塊 Line 方法的 B 選項 Line (500, 500)-Step(1000, 0) Line -Step(0, 1000) Line (500, 500)-Step(1000, 1000), , B
FillStyle 和 FillColor FillStyle 預設值 = 1- 透明 在 B 之後指定 F選項,方塊將填滿為實心 1 透明(預設值)。圖形物件會出現空值,不管您使用哪種色彩 2 水平線 3 垂直線 4 向上的對角線 5 向下的對角線 6 十字線陰影 7 對角十字線陰影 在 B 之後指定 F選項,方塊將填滿為實心 F 不能沒有 B 而單獨使用 使用 F 選項時,Line 方法將忽略 FillColor 和 FillStyle 屬性 Line (500, 500)-Step(1000, 1000), , BF
Circle 方法 畫圓形、橢圓形、圓弧和楔形餅塊(派) 變化的 Circle 方法可以畫出各種的曲線 圓的半徑通常按照水平單位來指定 [object.]Circle [Step](x, y), radius[, color] x 引數和 y 引數 : 圓心座標 radius : 圓的半徑 Circle (1200, 1000), 750 Circle ((ScaleWidth + ScaleLeft)/2,(ScaleHeight + _ ScaleTop) / 2), ScaleWidth / 4 圓的半徑通常按照水平單位來指定 如果使用自訂刻度,水平單位和垂直單位可能對應不同的距 離
Example Sub CircleDemo () Dim Radius R = 255 * Rnd '設定紅色為隨機數 G = 255 * Rnd '設定綠色為隨機數 B = 255 * Rnd '設定藍色為隨機數 XPos = ScaleWidth / 2 '設定 x 座標在表單中間 YPos = ScaleHeight / 2 '設定 y 座標在表單中間 '將半徑設定在表單高度的 0 到 50% 之間 Radius = ((YPos * 0.9) + 1) * Rnd Circle (XPos, YPos), Radius, RGB(R, G, B) '使用隨機色彩畫圓 End Sub
畫圓弧 [object.]Circle [Step](x, y), radius, [color], start, end[, aspect] start 或 end 引數 : 若為負值,Visual Basic 會畫出一條線以連接圓心到負值的終點 Private Sub Form_Click () Const PI = 3.14159265 Circle (3500, 1500), 1000, , -PI/2, -PI/3 End Sub
畫橢圓 aspect 引數 : 指定水平對垂直方位的比值 radius 引數 : 對應橢圓較長的軸 [object.]Circle [Step](x, y), radius, [color], [start], [end] [, aspect] aspect 引數 : 指定水平對垂直方位的比值 正浮點數,但不可以是負值 aspect 引數值若較大時,會產生沿著垂直軸拉長的橢圓 aspect 引數值較小時,則將產生沿著水平軸拉長的橢圓 radius 引數 : 對應橢圓較長的軸 若 aspect 引數小於 1,則 radius = x 軸半徑 若 aspect 引數大於或等於 1 的話, radius = y 軸半徑
Example Private Sub Form_Click () '繪製實心的橢圓。 FillStyle = 0 Circle (600, 1000), 800, , , , 3 '繪製空的橢圓。 FillStyle = 1 Circle (1800, 1000), 800, , , , 1/3 End Sub
PaintPicture方法 (1) 在表單、圖片方塊和 Printer 物件上的任何地方繪製圖 形 語法: object : [object.]PaintPicture pic, destX, destY[, destWidth[, destHeight [, srcX[, srcY[, srcWidth[, srcHeight[, Op]]]]]]] object : 表單、圖片方塊或 Printer 物件,放置 pic 圖片的地方 若省略,則將假設為目前的表單 pic 引數 : 必須是 Picture 物件,即表單或控制項的 Picture 屬性所描述的
PaintPicture方法 (2) destX 和 destY 引數 : 選擇性destWidth 和 destHeight 引數 : 根據 objec 的 ScaleMode,圖片被放置的水平和垂直位置 選擇性destWidth 和 destHeight 引數 : 設定在標的物件 object 中圖片的寬度和高度 選擇性srcX 和 srcY 引數 : 定義 pic 中剪輯範圍之左上角的 x 座標以及 y 座標 選擇性的Op 引數 : 定義光域效果(例如,AND 和 XOR),意即當您在object 標的 物件上繪圖時,執行於圖片上的作業。
PaintPicture方法 (3) 例如,您可以使用 PaintPicture 方法產生相同點陣圖的多 個備份,並將它們堆砌在表單上。使用這種方法,比在表 單上移動圖片控制項要快些。下列的程式碼用來堆砌排列 100 個圖片控制項的備份,並且透過給予 destWidth 一個 負值,就可以使每幅圖片水平的跳動。 For i = 0 To 10 For j = 0 To 10 Form1.PaintPicture picF.Picture, j * _ picF.Width, i * picF.Height, _ picF.Width, -picF.Height Next j, i
PaintPicture方法 (4) destX 和 destY 引數 : 選擇性destWidth 和 destHeight 引數 : 根據 objec 的 ScaleMode,圖片被放置的水平和垂直位置 選擇性destWidth 和 destHeight 引數 : 設定在標的物件 object 中圖片的寬度和高度 選擇性srcX 和 srcY 引數 : 定義 pic 中剪輯範圍之左上角的 x 座標以及 y 座標 選擇性的Op 引數 : 定義光域效果(例如,AND 和 XOR),意即當您在object 標的 物件上繪圖時,執行於圖片上的作業
Example 使用 PaintPicture 方法產生相同點陣圖的多個備份,並將它 們堆砌在表單上 此方法,比在表單上移動圖片控制項要快 例: 堆砌排列 100 個圖片控制項的備份,並且透過給予 destWidth 一個負值,就可以使每幅圖片水平的跳動 For i = 0 To 10 For j = 0 To 10 Form1.PaintPicture picF.Picture, j *picF.Width, - i * picF.Height, picF.Width,picF.Height Next j, i
DrawWidth、BorderWidth屬性 指定圖形方法輸出時直線的寬度 BorderWidth 屬性: 指定直線和幾何圖形控制項框線的粗細 Private Sub Form_Click () DrawWidth = 1 Line (100, 1000)-(3000, 1000) DrawWidth = 5 Line (100, 1500)-(3000, 1500) DrawWidth = 8 Line (100, 2000)-(3000, 2000) End Sub
DrawStyle 屬性 指定使用圖形方法所建立的直線,是實線還是虛線 幾何圖形控制項的 BorderStyle 屬性作用與 DrawStyle 屬 性相同,但是可適用於各種的物件 Private Sub Form_Click () Dim I As Integer, Y As Long For I = 0 To 6 DrawStyle = I Y = (200 * I) + 1000 Line (200, Y)-(2400, Y) Next I End Sub
DrawMode屬性 設定一個樣式繪製在另一個之上時,會發生什麼樣的情況 當在一個空白的、或純白色的背景、或者是無差異色彩的 背景上繪製時,通常沒有必要使用到這個屬性 4 - Not Copy Pen ,繪製相反的直線模式,無論原來存在模式如何 7 - Xor Pen 。顯示出直線模式和現存顯示的差異,以此模式繪製物件兩次,將精確地回存該處原來的背景 11 - 不作動作,效果相當於關閉繪製模式 13 - Copy Pen(預設值)。適用於直線模式,無論原來的存在模式如何
DrawMode屬性 = 7 DrawMode = 7 ,對於動畫來說是非常有用的 繪製一條直線兩次,就可精確地回存該直線繪製之前既存 的顯示狀態。這樣可能建立一個移動的背景,而不致破壞 原來背景的物件,因為當執行大部分模式時,可以回存背 景。但卻無法保證也能保存舊有的背景 Private Sub Form_Click () ForeColor = 255 : DrawMode = 7 Circle (CurrentX, CurrentY), 1000 CurrentX = CurrentX + 220 CurrentY = CurrentY + 220 End Sub
4. 直線控制項 (Line) 控制直線控制項的位置、長度、顏色和樣式,自 訂應用程式的外觀 BorderStyle 屬性 設定直線樣式: 控制直線控制項的位置、長度、顏色和樣式,自 訂應用程式的外觀 BorderStyle 屬性 設定直線樣式: 0 - 透明 1 -‧實線 2 -‧破折線 3 -‧點線 4 -‧破折線-點線 5 -‧破折線-點線-點線 6-‧內實線
BackColor屬性 指定直線的顏色 BorderStyle = 0(透明) X1、X2、Y1 和 Y2 屬性: 忽略 BorderColor 屬性 X1、X2、Y1 和 Y2 屬性: 移動控制項或調整直線控制項的大小 X1、Y1 屬性 : 設定直線控制項左方點的水平位置和垂直位置 X2、Y2 屬性 : 設定直線控制項右端點的水平位置和垂直位置
5. 幾何圖形控制項 (Shape) 在表單、框架或圖片方塊中建立義幾何圖形 Shape 屬性 幾何圖形 樣式 常數 幾何圖形 樣式 常數 矩形 0 vbShapeRectangle 正方形 1 vbShapeSquare 橢圓形 2 vbShapeOval 圓形 3 vbShapeCircle 圓角矩形 4 vbShapeRoundedRectangle 圓角正方形 5 vbShapeRoundedSquare
FillStyle、BorderStyle、 BackColor、 FillColor屬性 塗滿樣式花色 : 實線、透明、水平線、垂直線、向上對角線、向下對 角線、十字線和對角十字線 BorderStyle 屬性 : 邊框樣式 : 透明、實線、虛線、點線、虛線、虛線和內實線 BackColor屬性 : 幾何圖形色彩 FillColor 屬性 : 幾何圖形邊框色彩 FillStyle = 1 或 BackStyle = 1 -Transparent : 忽略 FillColor 和 BackColor 屬性
6. 滑鼠事件 滑鼠指標位於無控制項的表單上,表單識別滑鼠事件 滑鼠指標在控制項上時,控制項識別滑鼠事件 事件 描述 MouseDown 按住任意滑鼠按鈕時發生 MouseUp 交付任意滑鼠按鈕時發生 MouseMove 每當滑鼠指標移動到螢幕新位置時發生 滑鼠指標位於無控制項的表單上,表單識別滑鼠事件 滑鼠指標在控制項上時,控制項識別滑鼠事件 按住滑鼠按鈕不放,物件將繼續識別所有滑鼠事件,直到 使用者交付按鈕 滑鼠事件識別和回應各種滑鼠狀態,並把這些狀態看作獨 立的事件,與 Click 和 DblClick 事件不同
滑鼠事件引數 Form_MouseDown (Button, Shift, X, Y) 引數: button: Shift: x, y: 1bit 資料欄引數,描述滑鼠按鈕的狀態。 Shift: 1bit資料欄引數,描述SHIFT、CTRL 與 ALT 鍵的狀態 x, y: 滑鼠指標的位置,使用可接受滑鼠事件的物件的座標系統來描述的滑鼠指標位置 位元資料欄引數傳回單個位元的資訊,每個位元都會指出 某個狀態是啟用或關閉
MouseDown 事件 Private Sub Form_MouseDown (Button As Integer, _ Shift As Integer, X As Single, Y As Single) Command1.Move X, Y End Sub Command1.Move(X-Command1.Width/2),(Y-Command1.Height/2) Line -(X, Y)
MouseMove 事件 MouseMove 如何工作 並不是對滑鼠經過的每個像素,VB都會產生 MouseMove 事件 Private Sub Form_MouseMove (Button As Integer, _ Shift As Integer, X As Single, Y As Single) Line -(X, Y) End Sub MouseMove 如何工作 並不是對滑鼠經過的每個像素,VB都會產生 MouseMove 事件 作業環境每秒產生有限多個滑鼠訊息 Private Sub Form_MouseMove (Button As Integer,_ Circle (X, Y), 50
MouseUp 事件 Private Sub Form_MouseDown (Button As Integer, _ Shift As Integer, X As Single, Y As Single) DrawNow = True CurrentX = X CurrentY = Y End Sub Private Sub Form_MouseUp (Button As Integer, _ DrawNow = False
檢測滑鼠按鈕 001 1 vbLeftButton 按住左按鈕 010 2 vbRightButton 按住右按鈕 100 4 vbMiddleButton 按住中間按鈕 000 0 未按住任何按鈕 011 3 vbLeftButton + vbRightButton 按住左、右按鈕 101 5 vbLeftButton + vbMiddleButton 按住左按鈕和中間按鈕。 110 6 vbRightButton + vbMiddleButton 按住右按鈕和中間按鈕。 111 7 vbRightButton + vbMiddleButton + vbLeftButton 按住三個按鈕
Example 1 Private Sub Form_MouseDown (Button As Integer, _ Shift As Integer, X As Single, Y As Single) If Button = 1 Then Print "You pressed _ the left button." If Button = 2 Then Print "You pressed _ the right button." If Button = 4 Then Print "You pressed _ the middle button." End Sub
Example 2 Private Sub Form_MouseUp(Button As Integer, _ Shift As Integer, X As Single, Y As Single) If Button = 1 Then Print "You released _ the left button." If Button = 2 Then Print "You released _ the right button." If Button = 4 Then Print "You released _ the middle button." End Sub
Example 3 Private Sub Form_MouseMove (Button As Integer, _ Shift As Integer, X As Single, Y As Single) If Button = 1 Then Print "You're pressing _ only the left button." End Sub If Button And 1 Then Print "You're pressing _ the left button." If Button And 2 Then Print "You're pressing _ the right button."
Example 4 Private Sub Form_MouseDown(Button As Integer, _ Shift As Integer, X As Single, Y As Single) ShiftTest = Shift And 7 Select Case ShiftTest Case 1: Print "You pressed the SHIFT key." Case 2: Print "You pressed the CTRL key." Case 4: Print "You pressed the ALT key." Case 3: Print "You pressed both SHIFT and CTRL." Case 5: Print "You pressed both SHIFT and ALT." Case 6: Print "You pressed both CTRL and ALT." Case 7: Print "You pressed SHIFT, CTRL, and ALT." End Select End Sub
Example 5 Private Sub Form_MouseMove(Button As Integer, _ Shift As Integer, X As Single, Y As Single) ButtonTest = Button And 7 Select Case ButtonTest Case 1 '或 vbLeftButton Print "You're pressing the left button." Case 2 '或 vbRightButton Print "You're pressing the right button." Case 4 '或 vbMiddleButton Print "You're pressing the middle button." Case 7 Print "You're pressing all three buttons." End Select End Sub
Example 6 Private Sub Form_MouseDown (Button As Integer, _ Shift As Integer, X As Single, Y As Single) If Button = vbLeftButton Then DrawNow = True CurrentX = X CurrentY = Y ElseIf Button = vbRightButton Then Line -(X, Y) End If End Sub Private Sub Form_MouseUp (Button As Integer, _ If Button = vbLeftButton Then DrawNow = False Private Sub Form_MouseMove (Button As Integer, _ If DrawNow Then Line -(X, Y)
shift 引數 001 1 vbShiftMask 按 SHIFT 鍵 010 2 vbCtrlMask 按 CTRL 鍵 100 4 vbAltMask 按 ALT 鍵 011 3 vbShiftMask + vbCtrlMask 同時按住 SHIFT 與 CTRL 鍵 101 5 vbShiftMask + vbAltMask 同時按住 SHIFT 與 ALT 鍵 110 6 vbCtrlMask + vbAltMask 同時按住 CTRL 與 ALT 鍵 111 7 vbCtrlMask + vbAltMask + vbShiftMask 同時按住SHIFT、CTRL與ALT鍵
Example Private Sub Form_MouseDown(Button As Integer, _ Shift As Integer, X As Single, Y As Single) ShiftTest = Shift And 7 Select Case ShiftTest Case 1: Print "You pressed the SHIFT key." Case 2: Print "You pressed the CTRL key." Case 4: Print "You pressed the ALT key." Case 3: Print "You pressed both SHIFT and CTRL." Case 5: Print "You pressed both SHIFT and ALT." Case 6: Print "You pressed both CTRL and ALT." Case 7: Print "You pressed SHIFT, CTRL, and ALT." End Select End Sub
7. 鍵盤事件 只有獲得駐點的物件才能夠接受鍵盤事件 表單為活動表單且其上所有控制項均未獲得駐點時,表單 才獲得駐點 鍵盤事件 引發原因 KeyPress 按住對應某 ASCII 字元的鍵 KeyDown 按住鍵盤的任意鍵 KeyUp 交付鍵盤的任意鍵 只有獲得駐點的物件才能夠接受鍵盤事件 表單為活動表單且其上所有控制項均未獲得駐點時,表單 才獲得駐點 表單KeyPreview屬性 = True : 表單在每個控制項識別所有鍵盤事件之前,就接受這些鍵盤事件
檢測低階鍵盤回應 SHIFT、CTRL 和 ALT 鍵 方向鍵 PAGEUP 和 PAGEDOWN 數值小鍵盤數字鍵 打字鍵盤數值鍵 注意,某類控制項(指令按鈕、選項按鈕和核取方塊)不接受方 向鍵事件:相反,按住方向鍵後將使駐點移動到另一個控制項 PAGEUP 和 PAGEDOWN 數值小鍵盤數字鍵 打字鍵盤數值鍵 不僅回應按鍵動作,而且回應交付鍵的動作(KeyPress 只回應按鍵動作) 功能鍵: 與功能表指令無關的功能鍵
檢測低階鍵盤回應 使用 KeyUp 和 KeyDown 事件之前要確保 KeyPress 事 件的功能不夠使用 KeyPress 事件檢測的鍵所有標準 ASCII 字元: ENTER TAB BACKSPACE 鍵 標準鍵盤的字母、數字和標點符號鍵
KeyPress 事件 識別 ENTER、TAB、BACKSPACE鍵和標準 ASCII 字元 KeyPress (KeyAscii As Integer) 識別 ENTER、TAB、BACKSPACE鍵和標準 ASCII 字元 Private Sub Text1_KeyPress (KeyAscii As Integer) KeyAscii = Asc(UCase(Chr(KeyAscii))) End Sub 您可用相同的 ASCII 字元程式碼檢測,是否可透過按 住 KeyPress 事件識別一個鍵 If KeyAscii = 8 Then MsgBox "You pressed the _ BACKSPACE key."
KeyUp 和 KeyDown 事件 報告鍵盤本身準確的實體狀態 KeyPress 事件只提供鍵所代表的字元而不識別鍵的狀態 KeyDown(KeyCode As Integer, Shift As Integer) 報告鍵盤本身準確的實體狀態 KeyPress 事件只提供鍵所代表的字元而不識別鍵的狀態 keycode : 指示按住的實體鍵。這時將「A」與「a」作為同一個鍵傳回。具有相同的 keycode 值 鍵盤上的「1」和數字小鍵盤的「1」被作為不同的鍵傳回,儘管它們產生相同的字元 Shift : 指示 SHIFT、CTRL 和 ALT 鍵的狀態 只有檢查此引數才能判斷輸入的是大寫字母還是小寫字母
Keycode 引數 透過 ASCII 值或鍵程式碼常數來識別鍵 字母鍵的鍵程式碼與此字母的大寫字元的 ASCII 值相同。 所以「A」和「a」的 keycode 都是由 Asc(A)傳回的數 值 Private Sub Text1_KeyDown(KeyCode As Integer, _ Shift As Integer) If KeyCode = vbKeyA Then MsgBox "You pressed _ the A key." End Sub
識別控制鍵 KeyDown和KeyUp 事件可識別標準鍵盤上大多數控制鍵: 可以透過鍵程式碼常數或相對的 ASCII 值檢測這些鍵 功能鍵(F1-F16) 編輯鍵(HOME、PAGE UP、DELETE 等等) 搜尋鍵(RIGHT、LEFT、UP 和 DOWN ARROW) 數字小鍵盤上的鍵 可以透過鍵程式碼常數或相對的 ASCII 值檢測這些鍵 Private Sub Text1_KeyDown(KeyCode As Integer, _ Shift As Integer If KeyCode = vbKeyHome Then MsgBox "You _ pressed the HOME key." End Sub
Shift 引數 SHIFT、CTRL 和 ALT 鍵的整數值或常數 Private Sub Text1_KeyDown(KeyCode As Integer, _ Shift As Integer) If KeyCode = vbKeyA And Shift = 1 _ Then MsgBox "You pressed the uppercase A key." End Sub
Example Private Sub Text1_KeyDown(KeyCode As Integer, _ Shift As Integer) ShiftKey = Shift And 7 Select Case ShiftKey Case 1: Print "You pressed the SHIFT key." Case 2: Print "You pressed the CTRL key." Case 4: Print "You pressed the ALT key." Case 3: Print "You pressed both SHIFT and CTRL." Case 5: Print "You pressed both SHIFT and ALT." Case 6: Print "You pressed both CTRL and ALT." Case 7: Print "You pressed SHIFT, CTRL, and ALT." End Select End Sub