一、前情回顾
二、键盘鼠标输入
I.按键
1.keystate
判断是否按下某个键。
int keystate(int key);
key
在 key_code_e 枚举中定义的虚拟键码,参考 key_code_e 按键码。
如果是字母键或者数字键,则其虚拟键码与 大写字母的 ASCII 值相等。
比如 A 键,可以使用键码 key_A ,也可以使用数字 65 或者字符 'A'。
2.key_code_e
key_code_e 枚举
定义按键键码
定义:
enum key_code_e
{
key_mouse_l = 0x01, // 鼠标左键
key_mouse_r = 0x02, // 鼠标右键
key_mouse_m = 0x04, // 鼠标中键
key_back = 0x08, // 退格键
key_tab = 0x09, // Tab 键
key_enter = 0x0d, // 回车键
key_shift = 0x10, // Shift 键
key_control = 0x11, // Ctrl 键
key_menu = 0x12, // Alt 键
key_pause = 0x13, // Pause 键
key_capslock = 0x14, // 大写锁定键
key_esc = 0x1b, // Esc 键
key_space = 0x20, // 空格键
key_pageup = 0x21, // PgUp, 向上翻页
key_pagedown = 0x22, // PgDn, 向下翻页
key_home = 0x23, // Home
key_end = 0x24, // End
key_left = 0x25, // ←, 左方向键
key_up = 0x26, // ↑, 上方向键
key_right = 0x27, // →, 右方向键
key_down = 0x28, // ↓, 下方向键
key_print = 0x2a, // Print, 打印键
key_snapshot = 0x2c, // Prt Sc, PrintScreen 截屏键
key_insert = 0x2d, // Ins, 插入键
key_delete = 0x2e, // Del, 删除键
// 大键盘数字键
key_0 = 0x30,
key_1 = 0x31,
key_2 = 0x32,
key_3 = 0x33,
key_4 = 0x34,
key_5 = 0x35,
key_6 = 0x36,
key_7 = 0x37,
key_8 = 0x38,
key_9 = 0x39,
// 字母键
key_A = 0x41,
key_B = 0x42,
key_C = 0x43,
key_D = 0x44,
key_E = 0x45,
key_F = 0x46,
key_G = 0x47,
key_H = 0x48,
key_I = 0x49,
key_J = 0x4a,
key_K = 0x4b,
key_L = 0x4c,
key_M = 0x4d,
key_N = 0x4e,
key_O = 0x4f,
key_P = 0x50,
key_Q = 0x51,
key_R = 0x52,
key_S = 0x53,
key_T = 0x54,
key_U = 0x55,
key_V = 0x56,
key_W = 0x57,
key_X = 0x58,
key_Y = 0x59,
key_Z = 0x5a,
key_win_l = 0x5b, // 左 Windows 徽标键
key_win_r = 0x5c, // 右 Windows 徽标键
key_sleep = 0x5f, // 休眠键
// 小键盘的九宫格数字键
key_num0 = 0x60,
key_num1 = 0x61,
key_num2 = 0x62,
key_num3 = 0x63,
key_num4 = 0x64,
key_num5 = 0x65,
key_num6 = 0x66,
key_num7 = 0x67,
key_num8 = 0x68,
key_num9 = 0x69,
// 小键盘符号键
key_multiply = 0x6a, // *,乘号键
key_add = 0x6b, // +, 加号键
key_separator = 0x6c, // 分割键
key_subtract = 0x6d, // -, 减号键
key_decimal = 0x6e, // ., 小数点
key_divide = 0x6f, // /, 除号键
// 键盘上方的12个 Fn 功能键
key_f1 = 0x70,
key_f2 = 0x71,
key_f3 = 0x72,
key_f4 = 0x73,
key_f5 = 0x74,
key_f6 = 0x75,
key_f7 = 0x76,
key_f8 = 0x77,
key_f9 = 0x78,
key_f10 = 0x79,
key_f11 = 0x7a,
key_f12 = 0x7b,
key_numlock = 0x90, // NumLk, 小键盘数字锁定
key_scrolllock = 0x91, // ScrLk, 滚动锁定键
key_shift_l = 0xa0, // 左 Shift
key_shift_r = 0xa1, // 右 Shift
key_control_l = 0xa2, // 左 Ctrl
key_control_r = 0xa3, // 右 Ctrl
key_menu_l = 0xa4, // 左 Alt
key_menu_r = 0xa5, // 右 Alt
// 大键盘上的符号键
key_semicolon = 0xba, // ; 分号键
key_plus = 0xbb, // + 加号键
key_comma = 0xbc, // , 逗号键
key_minus = 0xbd, // - 减号键
key_period = 0xbe, // . 句号键
key_slash = 0xbf, // / 右斜杠键
key_tilde = 0xc0, // ~ 波浪键
key_lbrace = 0xdb, // [ 左方括号键
key_backslash = 0xdc, // \ 反斜杠键
key_rbrace = 0xdd, // ] 右方括号键
key_quote = 0xde, // ' 引号键
key_ime_process = 0xe5,
}key_code_e;
II.键盘
1.key_msg(结构体)
功能: 用于保存键盘消息的结构体 声明:
typedef struct key_msg { UINT msg; UINT key; UINT flags; }key_msg;成员: msg 指定键盘消息类型,可为以下值:key 如果是键盘消息类型是 key_msg_down 和 key_msg_up ,则表示按键虚拟键码。如果是 key_msg_char,则为 GBK 编码字符。 flags 按键标记,每个二进制位标记一种状态,可能为以下值的组合:
值 含义 key_msg_down 按键按下消息。 key_msg_up 按键弹起消息。 key_msg_char(ege20.08 起) 键盘字符输入消息。
值 含义 key_flag_shift 同时按下了 Shift 键 key_flag_ctrl 同时按下了 Ctrl 键 key_flag_first_down(ege dev) 按键按下后发送的第一个按下消息(按键长按时,利用此标志位可以将其与后面连续发送的按下消息区分开)
2.getch
这个就很熟悉了吧,conio.h里都有。
他返回按下的键的ASCII码值。
while(1){
if(getch()=='A') printf("You pressed A!!!\n");
}
3.kbhit
也是conio.h里的,返回是否按下键盘。
需要注意的是,graphics.h库和conio.h库不能同时#include,否则会报错(因为他们都有getch和kbhit,而ege库的getch是专门判窗口的键盘输入,所以不能混用)。
4.getkey
和getch没有任何区别,但返回值是key_msg。
5.kbmsg
和kbhit没有任何区别。
6.flushkey
功能: 清空键盘消息缓冲区。 声明:
void flushkey();
III.鼠标
1.mouse_msg (结构体)
功能: 这个结构体用于保存鼠标消息 声明:
typedef struct mouse_msg { UINT msg; INT x; INT y; UINT flags; INT wheel; }mouse_msg;成员:
x 当前鼠标 x 坐标
y 当前鼠标 y 坐标
is_move() 是否鼠标移动消息,类型为bool
is_down() 是否鼠标按键按下消息,类型为
bool is_up() 是否鼠标按键放开消息,类型为bool
is_left() 是否鼠标左键消息,类型为
bool is_mid() 是否鼠标中键消息,类型为
bool is_right() 是否鼠标右键消息,类型为
bool is_wheel() 是否鼠标滚轮滚动消息,类型为
bool wheel 鼠标滚轮滚动值,一般情况下为 120 的倍数或者约数。
msg 不建议直接访问
flags 不建议直接访问
2.getmouse
功能: 获取一个鼠标消息。如果当前鼠标消息队列为空,就一直等待,直到有新消息产生。 声明:
mouse_msg getmouse();
3.mousemsg
功能: 检测当前是否有鼠标消息。 声明:
int mousemsg();
4.MOUSEMSG(结构体)
功能: 这个结构体用于保存鼠标消息 声明:
struct MOUSEMSG { UINT uMsg; // 当前鼠标消息 int mkCtrl; // Ctrl 键是否按下 int mkShift; // Shift 键是否按下 int mkLButton; // 鼠标左键是否按下 int mkMButton; // 鼠标中键是否按下 int mkRButton; // 鼠标右键是否按下 int x; // 当前鼠标 x 坐标 int y; // 当前鼠标 y 坐标 int wheel; // 鼠标滚轮滚动值 };成员: uMsg: 指定鼠标消息类型,可为以下值:
值 含义 WM_MOUSEMOVE 鼠标移动消息。 WM_MOUSEWHEEL 鼠标滚轮拨动消息。 WM_LBUTTONDOWN 左键按下消息。 WM_LBUTTONUP 左键弹起消息。 WM_LBUTTONDBLCLK 左键双击消息。 WM_MBUTTONDOWN 中键按下消息。 WM_MBUTTONUP 中键弹起消息。 WM_MBUTTONDBLCLK 中键双击消息。 WM_RBUTTONDOWN 右键按下消息。 WM_RBUTTONUP 右键弹起消息。 WM_RBUTTONDBLCLK 右键双击消息。 mkCtrl Ctrl 键是否按下
mkShift Shift 键是否按下
mkLButton 鼠标左键是否按下
mkMButton 鼠标中键是否按下
mkRButton 鼠标右键是否按下
x 当前鼠标 x 坐标
y 当前鼠标 y 坐标
wheel 鼠标滚轮滚动值,一般情况下为 120 的倍数或者约数。
5.mousepos
功能: 获取当前鼠标坐标。 声明:
int mousepos(int *x, int *y);参数: x 用来接收横坐标 y 用来接收纵坐标 返回值: 0 示例:if (keystate(key_mouse_l)) { // 鼠标左键按下了 //获取鼠标当前位置坐标,放在变量mouse_x和mouse_y中 int mouse_x,mouse_y; mousepos(&mouse_x,&mouse_y); //在鼠标当前位置画一个半径为100的圆 circle(&mouse_x,&mouse_y,100); }
6.showmouse
功能: 设置鼠标指针是否显示。 声明:
int showmouse(int bShow);参数: bShow 是否显示鼠标指针,取以下值:
值 含义 FALSE (0) 不显示鼠标指针 TRUE (1) 显示鼠标指针 (初始化后,鼠标指针默认设置为显示) 返回值: 上一次调用时设置的值,第一次调用的话返回 1。
7.flushmouse
功能: 清空鼠标消息缓冲区。 声明:
void flushmouse();
8.FlushMouseMsgBuffer
功能: 清空鼠标消息缓冲区。 声明:
void FlushMouseMsgBuffer();
9.GetMouseMsg
功能: 这个函数用于获取一个鼠标消息。如果当前鼠标消息队列中没有,就一直等待。 声明:
MOUSEMSG GetMouseMsg();
三、附录
键盘鼠标输入函数:
typedef struct key_msg {
int key;
key_msg_e msg;
unsigned int flags;
}key_msg;
typedef struct mouse_msg {
int x;
int y;
mouse_msg_e msg;
unsigned int flags;
int wheel;
bool is_left() { return (flags & mouse_flag_left) != 0; }
bool is_right() { return (flags & mouse_flag_right) != 0; }
bool is_mid() { return (flags & mouse_flag_mid) != 0; }
bool is_down() { return msg == mouse_msg_down; }
bool is_up() { return msg == mouse_msg_up; }
bool is_move() { return msg == mouse_msg_move; }
bool is_wheel() { return msg == mouse_msg_wheel; }
}mouse_msg;
// 鼠标消息
struct MOUSEMSG {
UINT uMsg; // 当前鼠标消息
bool mkCtrl; // Ctrl 键是否按下
bool mkShift; // Shift 键是否按下
bool mkLButton; // 鼠标左键是否按下
bool mkMButton; // 鼠标中键是否按下
bool mkRButton; // 鼠标右键是否按下
short x; // 当前鼠标 x 坐标
short y; // 当前鼠标 y 坐标
short wheel; // 鼠标滚轮滚动值(120为基数)
};
//鼠标处理函数
int EGEAPI mousemsg(); // 检查是否存在鼠标消息
mouse_msg EGEAPI getmouse(); // 获取一个鼠标消息。如果没有,就等待
EGE_DEPRECATE(GetMouseMsg)
MOUSEMSG EGEAPI GetMouseMsg(); // (不推荐使用的函数)获取一个鼠标消息。如果没有,就等待
void EGEAPI flushmouse(); // 清空鼠标消息缓冲区
int EGEAPI showmouse(int bShow); // 设置是否显示鼠标
int EGEAPI mousepos(int *x, int *y); // 获取当前鼠标位置
//键盘处理函数
int EGEAPI kbmsg();
key_msg EGEAPI getkey();
EGE_DEPRECATE(getchEx)
int EGEAPI getchEx(int flag);
EGE_DEPRECATE(kbhitEx)
int EGEAPI kbhitEx(int flag);
int EGEAPI keystate(int key); // 获得键码为key的键(见key_code_e)是否按下,如果key使用鼠标按键的键码,则获得的是鼠标键状态
void EGEAPI flushkey(); // 清空键盘消息缓冲区
#if !defined(_INC_CONIO) && !defined(_CONIO_H_)
#define _INC_CONIO
#define _CONIO_H_
int EGEAPI getch();
int EGEAPI kbhit();
#else
#define getch getchEx
#define kbhit kbhitEx
#endif
typedef enum key_code_e {
key_mouse_l = 0x01,
key_mouse_r = 0x02,
key_mouse_m = 0x04,
key_back = 0x08,
key_tab = 0x09,
key_enter = 0x0d,
key_shift = 0x10,
key_control = 0x11,
key_menu = 0x12,
key_pause = 0x13,
key_capslock = 0x14,
key_esc = 0x1b,
key_space = 0x20,
key_pageup = 0x21,
key_pagedown = 0x22,
key_home = 0x23,
key_end = 0x24,
key_left = 0x25,
key_up = 0x26,
key_right = 0x27,
key_down = 0x28,
key_print = 0x2a,
key_snapshot = 0x2c,
key_insert = 0x2d,
key_delete = 0x2e,
key_0 = 0x30,
key_1 = 0x31,
key_2 = 0x32,
key_3 = 0x33,
key_4 = 0x34,
key_5 = 0x35,
key_6 = 0x36,
key_7 = 0x37,
key_8 = 0x38,
key_9 = 0x39,
key_A = 0x41,
key_B = 0x42,
key_C = 0x43,
key_D = 0x44,
key_E = 0x45,
key_F = 0x46,
key_G = 0x47,
key_H = 0x48,
key_I = 0x49,
key_J = 0x4a,
key_K = 0x4b,
key_L = 0x4c,
key_M = 0x4d,
key_N = 0x4e,
key_O = 0x4f,
key_P = 0x50,
key_Q = 0x51,
key_R = 0x52,
key_S = 0x53,
key_T = 0x54,
key_U = 0x55,
key_V = 0x56,
key_W = 0x57,
key_X = 0x58,
key_Y = 0x59,
key_Z = 0x5a,
key_win_l = 0x5b,
key_win_r = 0x5c,
key_sleep = 0x5f,
key_num0 = 0x60,
key_num1 = 0x61,
key_num2 = 0x62,
key_num3 = 0x63,
key_num4 = 0x64,
key_num5 = 0x65,
key_num6 = 0x66,
key_num7 = 0x67,
key_num8 = 0x68,
key_num9 = 0x69,
key_multiply = 0x6a,
key_add = 0x6b,
key_separator = 0x6c,
key_subtract = 0x6d,
key_decimal = 0x6e,
key_divide = 0x6f,
key_f1 = 0x70,
key_f2 = 0x71,
key_f3 = 0x72,
key_f4 = 0x73,
key_f5 = 0x74,
key_f6 = 0x75,
key_f7 = 0x76,
key_f8 = 0x77,
key_f9 = 0x78,
key_f10 = 0x79,
key_f11 = 0x7a,
key_f12 = 0x7b,
key_numlock = 0x90,
key_scrolllock = 0x91,
key_shift_l = 0xa0,
key_shift_r = 0xa1,
key_control_l = 0xa2,
key_control_r = 0xa3,
key_menu_l = 0xa4,
key_menu_r = 0xa5,
key_semicolon = 0xba,
key_plus = 0xbb,
key_comma = 0xbc,
key_minus = 0xbd,
key_period = 0xbe,
key_slash = 0xbf,
key_tilde = 0xc0,
key_lbrace = 0xdb,
key_backslash = 0xdc,
key_rbrace = 0xdd,
key_quote = 0xde,
key_ime_process = 0xe5,
}key_code_e;
typedef enum key_msg_e {
key_msg_down = 1,
key_msg_up = 2,
key_msg_char = 4,
}key_msg_e;
typedef enum key_flag_e {
key_flag_shift = 0x100,
key_flag_ctrl = 0x200,
}key_flag_e;
typedef enum mouse_msg_e {
mouse_msg_down = 0x10,
mouse_msg_up = 0x20,
mouse_msg_move = 0x40,
mouse_msg_wheel = 0x80,
}mouse_msg_e;
typedef enum mouse_flag_e {
mouse_flag_left = 1,
mouse_flag_right = 2,
mouse_flag_mid = 4,
mouse_flag_shift = 0x100,
mouse_flag_ctrl = 0x200,
}mouse_flag_e;
四、Finish Gracefully
那么今天我们讲了鼠标键盘输入函数,整体是比较简单的。
下次,我们将会讲解设置绘图环境的函数,敬请期待!
(懒得放链接了,看最上面吧)