//用户交互——键盘1
#include
//这个例子需要这个头文件
#include
int main()
{
initgraph(640, 480);
setfont(18, 0, "宋体");
outtextxy(0, 0, "please press any key");
int k = 0;
for ( ; k != key_esc; ) // key_esc是ege定义的按键常数
{
char str[32];
//等待用户按键,并把得到的按键给k
//如果你不想等待,可以在调用getch之前,使用kbhit检测是否有按键按下
//如 if ( kbhit() ) k = getch();
k = getch();
//格式化输出为字符串,用于后面输出
sprintf(str, "%c %3d", k, k);
cleardevice();
outtextxy(0, 0, str);
}
closegraph();
return 0;
}
这个程序实现了一个挺有用的功能,就是按键输入,把所输入的key值给显示出来。
按下回车键:因为回车本身不可显
按下F1
按下退格键:
up键:
down键:
left键:
right键:
空格键:
在头文件里有完整定义:
这里key_mouse_l和key_mouse_r没看懂。
//用户交互——鼠标2
#include
#include
int main()
{
initgraph(640, 480);
setfont(18, 0, "宋体");
mouse_msg msg = {0};
for ( ; is_run(); delay_fps(60))
{
//获取鼠标消息,这个函数会等待,等待到有消息为止
//类似地,有和kbhit功能相近的函数MouseHit,用于检测有没有鼠标消息
while (mousemsg())
{
msg = getmouse();
}
//格式化输出为字符串,用于后面输出
//msg和flag常数请参考文档或者mouse_msg_e, mouse_flag_e的声明
cleardevice();
xyprintf(0, 0, "x = %10d y = %10d",
msg.x, msg.y, msg.wheel);
xyprintf(0, 20, "move = %d down = %d up = %d",
(int)msg.is_move(),
(int)msg.is_down(),
(int)msg.is_up());
xyprintf(0, 40, "left = %d mid = %d right = %d",
(int)msg.is_left(),
(int)msg.is_mid(),
(int)msg.is_right());
xyprintf(0, 60, "wheel = %d wheel rotate = %d",
(int)msg.is_wheel(),
msg.wheel);
}
closegraph();
return 0;
}
mousemsg()函数 如果存在鼠标消息,返回 1;否则返回 0。
mouse_msg 是个结构体,官方定义了一些成员。
typedef struct mouse_msg {
UINT msg;
INT x;
INT y;
UINT flags;
INT wheel;
}mouse_msg;
不过不建议直接访问flags和msg,而是通过方法访问,这里使用了面向对象的技术。
is_move()
是否鼠标移动消息,类型为bool
is_down()
是否鼠标按键按下消息,类型为bool
is_up()
是否鼠标按键放开消息,类型为bool
is_left()
是否鼠标左键消息,类型为bool
is_mid()
是否鼠标中键消息,类型为bool
is_right()
是否鼠标右键消息,类型为bool
is_wheel()
是否鼠标滚轮滚动消息,类型为bool
wheel
鼠标滚轮滚动值,一般情况下为 120 的倍数或者约数。
左右键和按下放开的区别在于前者只点击,后者是按住不放。
对于鼠标位置,除了直接访问结构体msg.x,msg.y之外,还可以调用函数mousepos(&x, &y)来访问。不过这方法也不方便,它不是通过返回值,而是通过传参int x, y来获取位置。