winform键盘操控之升级操作
1. 键盘事件引子
- winform的每一个窗体中,都有三个事件,分别是:
KeyDown
KeyPress
KeyUp
。其中,KeyDown
与KeyUp
用的是KeyCode
跟键盘上面的每一个按键相互对应,它对应着Key的枚举,使用极其方便,而KeyPress
则是使用编码,区分大小写,在组合键操控时使用不方便。因此,我们来使用KeyDown
事件来设置窗体的快捷键,以及使用组合键进行窗体游戏的制作。
2. 键盘事件组合键操控之特殊组合键
- 在快捷键中,我们一般使用
Ctrl
与其它的键对窗体来进行特殊操控!例如QQ的提取消息,便是Ctrl
+Alt
+Z
三个组合键来进行的,在我们的项目开发之中,我们也可以利用组合键来对我们的窗体进行快捷操控! - 示例
private: System::Void btn_KeyDown(System::Object^ sender, System::Windows::Forms::KeyEventArgs^ e) {
if (e->Control == true && e->Alt == true && e->KeyCode == Keys::A) {
btn->Top += 10;
}
}
这时窗口里面的Button
按钮btn在遇到Ctrl
+Alt
+A
组合键的时候,会向下移动10个像素。
类似于Ctrl
,Alt
,Shift
与其他的键实行的组合键,即可使用此种方法实现。
3. 键盘事件组合键操控之普通组合键
- 在游戏开发之中,我们会遇到
A
+B
这样的普通键进行组合,但是这样子,利用上面的方法是不可行的!
private: System::Void btn_KeyDown(System::Object^ sender, System::Windows::Forms::KeyEventArgs^ e) {
if (e->KeyData == Keys::A && e->KeyData == Keys::B) {
btn->Top += 10;
}
}
这样子开发出来的窗体,即便是使用A
+B
的组合键,也无法是Button
按钮的KeyDown
事件触发。因为e->KeyData
不可能即是A
也是B
就类似于以下代码中if
不可能执行。
if(a == 1 && a == 2){
cout << "作者真丑!!!" << endl;
}
if
语句永远不可能去执行!其中一个原因是因为a不可能同时为1和2,第二个原因作者是帅~!
所以我们需要另辟蹊径。
- 思路: 我们可以设置两个布尔值,记录两个键的按下事件,按下的时候改变为
true
,释放键盘的时候改变为false
。当俩个键的布尔值均为true
的时候,我们既可以触发组合键的事件! - 示例
bool a = false;
bool b = false;
private: System::Void btn_KeyDown(System::Object^ sender, System::Windows::Forms::KeyEventArgs^ e) {
if (e->KeyData == Keys::A) {
a = true;
}
if (e->KeyData == Keys::B) {
b = true;
}
if (a&&b) {
btn->Top -= 10;
}
}
private: System::Void btn_KeyUp(System::Object^ sender, System::Windows::Forms::KeyEventArgs^ e) {
if (e->KeyData == Keys::A) {
a = false;
}
if (e->KeyData == Keys::B) {
b = false;
}
}
类似于以上,既可实现普通组合键事件。
当我按下键盘上的A
+B
键位,则会触发Button
按钮的移动事件。这样子,便完成了普通组合键事件的编程!
4.KeyCode与KeyData的区别
KeyCode
最为常用,记录了键盘上按了哪个键,当使用组合键时如Ctrl
+a
,其值是A
;KeyData
可以记录组合键,当使用组合键时如Ctrl
+A
时,其值为A,ctrl
;KeyValue
则是KeyCode
的数字值,当使用组合键时如Ctrl
+A
时,其值为65(A),注意不是97(a);
注意:这三个属性对于字母键只记录其大写的值(不管你是否开启了Caps Lock
或是按下Shift
键)。