c语言游戏鼠标开始界面,C语言控制台窗口图形界面编程(八):鼠标事件

上次讲的是键盘事件,这次我们介绍鼠标事件。下面先介绍下鼠标事件的结构体以及相关信息。

typedef struct _MOUSE_EVENT_RECORD //鼠标事件结构体

{

COORD dwMousePosition; //当前鼠标在控制台窗口缓冲区的位置

DWORD dwButtonState; //鼠标按键的状态

DWORD dwControlKeyState; //控制键状态

DWORD dwEventFlags; //鼠标事件类型

} MOUSE_EVENT_RECORD;

/*

其中鼠标按键状态dwButtonState可能的值有

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

FROM_LEFT_1ST_BUTTON_PRESSED 最左边的鼠标键被按下 一般来说就是鼠标左键

FROM_LEFT_2ND_BUTTON_PRESSED 左起第二个鼠标键被按下 一般来说是鼠标中键,就是滚轮键

FROM_LEFT_3RD_BUTTON_PRESSED 左起第三个鼠标键被按下

FROM_LEFT_4TH_BUTTON_PRESSED 左起第四个鼠标键被按下

RIGHTMOST_BUTTON_PRESSED 最右边的鼠标键被按下 一般来说是鼠标右键

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

控制键状态dwControlKeyState与键盘事件的一样

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

ENHANCED_KEY 扩展键被按下

LEFT_ALT_PRESSED 左Alt键被按下

LEFT_CTRL_PRESSED 左Ctrl键被按下

RIGHT_ALT_PRESSED 右Alt键被按下

RIGHT_CTRL_PRESSED 右Ctrl键被按下

NUMLOCK_ON 数字锁定被打开

SCROLLLOCK_ON 滚动锁定被打开

CAPSLOCK_ON 大写锁定被打开

SHIFT_PRESSED Shift键被按下

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

鼠标事件类型dwEventFlags有以下几种

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

DOUBLE_CLICK 双击,第一击只作为普通按键事件,第二击才作为双击事件

MOUSE_HWHEELED 水平鼠标滚轮移动

MOUSE_MOVED 鼠标移动

MOUSE_WHEELED 垂直鼠标滚轮移动

0 当鼠标有键被按下或者释放

*/

下面给一个样例程序,实现在控制台窗口缓冲区的最下面一行显示当前鼠标在缓冲区的坐标,单击左键在当前鼠标位置输出字母A,单击右键则输出字母B,双击任何鼠标键退出的功能。程序如下:

#include #include #include HANDLE handle_in;

HANDLE handle_out;

CONSOLE_SCREEN_BUFFER_INFO csbi; //定义窗口缓冲区信息结构体

void DisplayMousePosition(COORD pos); //显示鼠标所在位置

void gotoxy(int x, int y); //将光标移到坐标为(x,y)的位置

int main()

{

handle_in = GetStdHandle(STD_INPUT_HANDLE); //获得标准输入设备句柄

handle_out = GetStdHandle(STD_OUTPUT_HANDLE); //获得标准输出设备句柄

INPUT_RECORD mouserec; //定义输入事件结构体

DWORD res; //用于存储读取记录

COORD pos; //用于存储鼠标当前位置

COORD size = {80, 25}; //窗口缓冲区大小

GetConsoleScreenBufferInfo(handle_out, &csbi); //获得窗口缓冲区信息

SetConsoleScreenBufferSize(handle_out, size); //设置窗口缓冲区大小

for (;;)

{

ReadConsoleInput(handle_in, &mouserec, 1, &res); //读取输入事件

pos = mouserec.Event.MouseEvent.dwMousePosition; //获得当前鼠标位置

gotoxy(0, 24); //在第25行显示鼠标位置

DisplayMousePosition(pos); //显示鼠标位置

if (mouserec.EventType == MOUSE_EVENT) //如果当前为鼠标事件

{

gotoxy(pos.X, pos.Y);

//单击鼠标左键,输出字符A

if (mouserec.Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED)

{

putchar('A');

}

//单击鼠标右键,输出字符B

if (mouserec.Event.MouseEvent.dwButtonState == RIGHTMOST_BUTTON_PRESSED)

{

putchar('B');

}

//双击退出

if (mouserec.Event.MouseEvent.dwEventFlags == DOUBLE_CLICK)

{

break;

}

}

}

CloseHandle(handle_out);

CloseHandle(handle_in);

return 0;

}

void DisplayMousePosition(COORD pos)

{

COORD dis = {0, 24}; //在第24行显示鼠标位置

WORD att = FOREGROUND_GREEN | FOREGROUND_INTENSITY; //文本属性

GetConsoleScreenBufferInfo(handle_out, &csbi); //获得窗口缓冲区信息

printf("X = %3d, Y = %3d", (int)pos.X, (int)pos.Y);

FillConsoleOutputAttribute(handle_out, att, 16, dis, NULL); //填充文本属性

return;

}

void gotoxy(int x, int y)

{

COORD pos = {x, y};

SetConsoleCursorPosition(handle_out, pos);

}

附上用本程序写的Hello world!的图:

7dbc108c395f6a755d79bf93ee5fd1a2.png

注意:当使用system函数后鼠标事件无法正常发生。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值