浅析OnKeyPress事件和OnKeyDownOnKeyUp事件

OnKeyPress事件

OnKeyPress事件是在用户按下键盘上任何一个可打印的字符时发生,只有能接收键盘输入的组件才有OnKeyPress事件。我们常常利用OnKeyPress事件截取在编辑框和组合框组件中所输入的击键,还可以立即测试击键的有效性或在字符输入时对其进行一定的格式处理。

例如,在TEdit组件上捕获OnKeyPress事件,判断输入的是否是小写字母,如果是,将其转换为大写字母,代码如下:

void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)

{

if (Key >= ‘a‘ && Key <= ‘z‘)

{

Key += ‘A‘ - ‘a‘;

}

}

将Key的值改变为0时可取消击键,这样一来对象便接收不到字符,我们可以利用这个特点来屏蔽某些字符。例如,有时候我们只允许用户输入数字,则加入如下代码:

void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)

{

if (Key < ‘0‘ || Key > ‘9‘)

{

Key = 0;//取消刚才输入的字符

}

}

注意:OnKeyPress事件可以引用任何可打印的键盘字符,一个来自标准字母表的字符或少数几个特殊字符之一的字符与 CTRL 键的组合,以及 ENTER 或 BACKSPACE 键,但它并不能识别功能键(F1~F12),上下左右键,Shift键,Ctrl键以及Alt键等特殊控制键或者是组合键,要捕获这些键可以采用OnKeyDown和OnKeyUp事件。

OnKeyDown/OnKeyUp事件

当按下某个键不放时,产生OnKeyDown事件;释放按键时,则产生OnKeyUp事件。虽然 OnKeyDown 和OnKeyUp 事件可应用于大多数键,它们最经常地还是应用于扩展的字符键如功能键等,以弥补OnKeyPress事件的不足。

例如,TEdit组件的OnKeyDown/OnKeyUp事件过程框架如下:

void __fastcall TForm1::Edit1KeyDown(TObject *Sender, WORD &Key,

TShiftState Shift)

void __fastcall TForm1::Edit1KeyUp(TObject *Sender, WORD &Key,

TShiftState Shift)

其中参数Key返回键盘的虚拟键码。

注意:OnKeyDown和OnKeyUp事件中的Key是Word型的,表示用户按的是键盘上的哪个键,OnKeyPress中的Key是Char型,表示用户输入什么字符。

参数Shift提供事件发生时Shift,Ctrl和Alt键的状态。Shift,Ctrl和Alt键的Shift值分别为ssShift,ssCtrl和ssAlt。例如,判断Shift,Ctrl和Alt键是否被按下的代码如下:

void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,

TShiftState Shift)

{

String strInfo("您刚才按下了:\n复合键:");

if (Shift.Contains(ssShift))

strInfo += "Shift键";

if (Shift.Contains(ssCtrl))

strInfo += "Ctrl键";

if (Shift.Contains(ssAlt))

strInfo += "Alt键";

strInfo += "\nASCII码:";

strInfo += IntToStr(Key);

MessageBox(NULL, strInfo.c_str(), "信息提示", MB_OK);

}

注意:要让某个对象产生OnKeyDown事件,OnKeyUp事件或OnKeyPress事件,先要让该对象获得控制权(即具有焦点),一个窗体仅在它没有可视和有效的控件或 KeyPreview 属性被设置为 True 时才能接收该事件。若在该对象上按住某个键再放开它,便会触发上面三个事件。如果三个事件中均有操作,则其执行先后次序为:OnKeyDown事件先执行,OnKeyPress事件其次,OnKeyUp事件最后执行。

OnKeyDown和OnKeyUp事件的事件处理过程中包含了最近一次击键发生时,控制键Alt,Shift或者Ctrl是否按下的信息,而OnKeyPress事件只返回键的ASCII字符。

  假设用户按下了Shift+P键,那么这三种键盘事件产生的顺序如下所示:

  (1)按下Shift键时将产生OnKeyDown事件。

  (2)保持Shift键再按下P时将产生OnKeyDown事件。

  (3)由于按下了P键,所以产生了OnKeyPress事件。

(4)释放Shift键和P键,将产生OnKeyUp事件。

OnKeyPress 将每个字符的大、小写形式作为不同的键代码解释,即作为两种不同的字符。而 OnKeyDown 和OnKeyUp 用两个参数解释每个字符的大写形式和小写形式:参数Key返回键盘的虚拟键码,显示物理的键(将 A 和 a 作为同一个键返回),参数Shift指示Shift键的状态,从而返回 A 或 a 其中之一。

疑问:如何判断同时按下Shift,Ctrl和Alt键?

补充:虚拟键码

大多数虚拟键码的名称在WINUSER.H表头档案中都定义为以VK_开头。下表列出了这些名称和数值(十进制和十六进制),以及与虚拟键相对应的IBM相容机种键盘上的键。

前四个虚拟键码中有三个指的是滑鼠键,您永远都不会从键盘讯息中获得这些滑鼠键代码,但我们能够从滑鼠讯息中获得它们。VK_CANCEL代码是一个虚拟键码,它包括同时按下两个键(Ctrl-Break)。Windows应用程式通常不使用此键。

Windows也包括在主键盘上的字母和数字键的虚拟键码,A 键到 Z 键与其 ASCII 码的相应值‘A‘ 到 ‘Z‘ 是一致的,0键到9 键与其 ASCII 码的相应值 ‘0‘ 到 ‘9‘ 是一致的。

96~111代表数字小键盘上的键。

虽然多数的键盘都有12个功能键,但Windows只需要10个,而位元旗标却有24个。

十进位 十六进位   虚拟键码  IBM相容键盘

1      01     VK_LBUTTON   滑鼠左键

2      02     VK_RBUTTON   滑鼠右键

3      03     VK_CANCEL     Ctrl-Break

4      04     VK_MBUTTON   滑鼠中键

8      08     VK_BACK       Backspace

9      09     VK_TAB        Tab

12     0C     VK_CLEAR      CLEAR 键,Num Lock关闭时的数字键盘5

13     0D     VK_RETURN     Enter

16     10     VK_SHIFT      Shift

17     11     VK_CONTROL    Ctrl

18     12     VK_MENU       Alt

19     13     VK_PAUSE      Pause

20     14     VK_CAPITAL    Caps Lock

27     1B     VK_ESCAPE     Esc

32     20     VK_SPACE      Spacebar

33     21     VK_PRIOR      Page Up

34     22     VK_NEXT       Page Down

35     23     VK_END        End

36     24     VK_HOME       Home

37     25     VK_LEFT       左箭头

38     26     VK_UP         上箭头

39     27     VK_RIGHT      右箭头

40     28     VK_DOWN       下箭头

41     29     VK_SELECT     SELECT 键

42     2A     VK_PRINT     PRINT SCREEN 键

43     2B     VK_EXECUTE    EXECUTE 键

44     2C     VK_SNAPSHOT   SNAP SHOT 键

45     2D     VK_INSERT     Insert键

46     2E     VK_DELETE     Delete键

47     2F     VK_HELP       HELP 键

48-57  30-39 无            主键盘上的0到9

65-90  41-5A 无            A到Z

91     5B     VK_LWIN       左Windows键

92     5C     VK_RWIN       右Windows键

93     5D     VK_APPS       Applications键

96-105 60-69  VK_NUMPAD0到VK_NUMPAD9  NumLock打开时数字键盘上的0到9

106    6A     VK_MULTIPLY   数字键盘上的*

107    6B     VK_ADD        数字键盘上的+

108    6C     VK_SEPARATOR  数字键盘上的ENTER 键

109    6D     VK_SUBTRACT   数字键盘上的-

110    6E     VK_DECIMAL   数字键盘上的.

111    6F     VK_DIVIDE     数字键盘上的/

112-121    70-79      VK_F1到VK_F10    功能键F1到F10

122-135    7A-87      VK_F11到VK_F24  功能键F11到F24

144    90     VK_NUMLOCK   Num Lock

145    91     VK_SCROLL     Scroll Lock

时间: 2024-10-05 06:44:01

浅析OnKeyPress事件和OnKeyDownOnKeyUp事件的相关文章

JS 事件绑定、事件监听、事件委托详细介绍

事件绑定 要想让 JavaScript 对用户的操作作出响应,首先要对 DOM 元素绑定事件处理函数.所谓事件处理函数,就是处理用户操作的函数,不同的操作对应不同的名称. 在JavaScript中,有三种常用的绑定事件的方法: 在DOM元素中直接绑定: 在JavaScript代码中绑定: 绑定事件监听函数. 在DOM中直接绑定事件 我们可以在DOM元素上绑定onclick.onmouseover.onmouseout.onmousedown.onmouseup.ondblclick.onkeyd

JS 中的事件绑定、事件监听、事件委托

事件绑定 要想让 JavaScript 对用户的操作作出响应,首先要对 DOM 元素绑定事件处理函数.所谓事件处理函数,就是处理用户操作的函数,不同的操作对应不同的名称. 在JavaScript中,有三种常用的绑定事件的方法: 在DOM元素中直接绑定: 在JavaScript代码中绑定: 绑定事件监听函数. 在DOM中直接绑定事件 我们可以在DOM元素上绑定onclick.onmouseover.onmouseout.onmousedown.onmouseup.ondblclick.onkeyd

Javascripts事件基础和事件绑定

javascript事件基础和事件绑定一.事件驱动    1.事件    javascript侦测到的用户的操作或是页面的一些行为    2.事件源    引发事件的元素(发生在谁身上)    3.事件处理的程序    对事件处理的程序或是函数(发生什么事)二.事件分类    1.鼠标事件    onclick 鼠标单机时触发此事件:    ondblclick 鼠标双击时触发此事件:    onmousedown 按下鼠标时触发此事件:    onmouseup 鼠标按下后松开鼠标时触发此事件

JS的事件绑定、事件流模型

.t1 { background-color: #ff8080; width: 1100px; height: 40px } 一.JS事件 (一)JS事件分类 1.鼠标事件:click/dbclick/mouseover/mouseout2.HTML事件: onload/onunload/onsubmit/onresize/onchange/onfoucs/onscroll3.键盘事件: keydown:键盘按下时触发 keypress:键盘按下并抬起的瞬间触发. keyup:键盘抬起触发[注意

事件注册 DOM事件流 事件对象(常用属性,方法) 事件委派(鼠标,键盘事件对象)

注册事件概述 给元素添加事件,称为注册事件或者绑定事件 注册事件有两种方式:传统方式和方法监听注册方式 传统注册方式:利用 on 开头的事件:例如:onclick:注册事件的唯一性,后面的注册事件会把前面的覆盖 方法监听注册方式:addEventListener()IE9+:IE9以前用 attacthEvent()代替:会按照注册顺序依次执行没有唯一性的问题 addEventListener() 事件监听方式 eventTarget.addEventListener(type, listene

微信小程序-双击长按longtap事件与tap事件冲突的解决办法

对于微信事件,不多说,自己看文档https://mp.weixin.qq.com/debug/wxadoc/dev/framework/view/wxml/event.html?t=20161122 效果 首先,注意一下微信小程序事件触发顺序     单击 touchstart → touchend → tap 双击 touchstart → touchend → tap → touchstart → touchend → tap 长按 touchstart → longtap → touche

JavaScript事件代理和事件委托

一.概述: 那什么叫事件委托呢?它还有一个名字叫事件代理,JavaScript高级程序设计上讲:事件委托就是利用事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件.那这是什么意思呢?网上的各位大牛们讲事件委托基本上都用了同一个例子,就是取快递来解释这个现象,我仔细揣摩了一下,这个例子还真是恰当,我就不去想别的例子来解释了,借花献佛,我摘过来,大家认真领会一下事件委托到底是一个什么原理: 有三个同事预计会在周一收到快递.为签收快递,有两种办法:一是三个人在公司门口等快递:二是委托给前台

基于OpenGL编写一个简易的2D渲染框架-07 鼠标事件和键盘事件

这次为程序添加鼠标事件和键盘事件 当检测到鼠标事件和键盘事件的信息时,捕获其信息并将信息传送到需要信息的对象处理.为此,需要一个可以分派信息的对象,这个对象能够正确的把信息交到正确的对象. 实现思路: 要实现以上的功能,需要几个对象: 事件分派器:EventDispatcher,负责将 BaseEvent 分派给 EventListener 对象 事件监听器:EventListener,这只是一个接口类,接受 BaseEvent 的对象,真正的处理在它的子类中实现 事件:BaseEvent,储存

js之事件冒泡和事件捕获详细介绍

(1)冒泡型事件:事件按照从最特定的事件目标到最不特定的事件目标(document对象)的顺序触发. IE 5.5: div -> body -> document IE 6.0: div -> body -> html -> document Mozilla 1.0: div -> body -> html -> document -> window (2)捕获型事件(event capturing):事件从最不精确的对象(document 对象)开