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相容键盘
101VK_LBUTTON滑鼠左键
202VK_RBUTTON滑鼠右键
303VK_CANCELCtrl-Break
404VK_MBUTTON滑鼠中键
808VK_BACKBackspace
909VK_TABTab
120CVK_CLEARCLEAR 键,Num Lock关闭时的数字键盘5
130DVK_RETURNEnter
1610VK_SHIFTShift
1711VK_CONTROLCtrl
1812VK_MENUAlt
1913VK_PAUSEPause
2014VK_CAPITALCaps Lock
271BVK_ESCAPEEsc
3220VK_SPACESpacebar
3321VK_PRIORPage Up
3422VK_NEXTPage Down
3523VK_ENDEnd
3624VK_HOMEHome
3725VK_LEFT左箭头
3826VK_UP上箭头
3927VK_RIGHT右箭头
4028VK_DOWN下箭头
4129VK_SELECTSELECT 键
422AVK_PRINTPRINT SCREEN 键
432BVK_EXECUTEEXECUTE 键
442CVK_SNAPSHOTSNAP SHOT 键
452DVK_INSERTInsert键
462EVK_DELETEDelete键
472FVK_HELPHELP 键
48-5730-39 无主键盘上的0到9
65-9041-5A 无A到Z
915BVK_LWIN左Windows键
925CVK_RWIN右Windows键
935DVK_APPSApplications键
96-105 60-69VK_NUMPAD0到VK_NUMPAD9NumLock打开时数字键盘上的0到9
1066AVK_MULTIPLY数字键盘上的*
1076BVK_ADD数字键盘上的+
1086CVK_SEPARATOR数字键盘上的ENTER 键
1096DVK_SUBTRACT数字键盘上的-
1106EVK_DECIMAL数字键盘上的.
1116FVK_DIVIDE数字键盘上的/
112-12170-79VK_F1到VK_F10功能键F1到F10
122-1357A-87VK_F11到VK_F24功能键F11到F24
14490VK_NUMLOCKNum Lock
14591VK_SCROLLScroll Lock
推荐阅读
- 操作系统|[译]从内部了解现代浏览器(1)
- web网页模板|如此优秀的JS轮播图,写完老师都沉默了
- JavaScript|vue 基于axios封装request接口请求——request.js文件
- vue.js|vue中使用axios封装成request使用
- JavaScript|JavaScript: BOM对象 和 DOM 对象的增删改查
- JavaScript|JavaScript — 初识数组、数组字面量和方法、forEach、数组的遍历
- JavaScript|JavaScript — call()和apply()、Date对象、Math、包装类、字符串的方法
- JavaScript|JavaScript之DOM增删改查(重点)
- javascript|vue使用js-xlsx导出excel,可修改格子样式,例如背景颜色、字体大小、列宽等
- javascript|javascript中的数据类型转换