700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 【C语言】控制台窗口图形界面编程(七):鼠标事件

【C语言】控制台窗口图形界面编程(七):鼠标事件

时间:2021-09-16 16:26:08

相关推荐

【C语言】控制台窗口图形界面编程(七):鼠标事件

00. 目录

文章目录

00. 目录01. INPUT_RECORD结构02. MOUSE_EVENT_RECORD结构03. ReadConsoleInput函数04. 示例程序

01. INPUT_RECORD结构

描述控制台输入缓冲区中的输入事件。可以使用ReadConsoleInputPeekConsoleInput函数从输入缓冲区读取这些记录,也可以使用WriteConsoleInput函数将这些记录写入输入缓冲区。

类型声明:

typedef struct _INPUT_RECORD {WORD EventType;union {KEY_EVENT_RECORDKeyEvent;MOUSE_EVENT_RECORD MouseEvent;WINDOW_BUFFER_SIZE_RECORD WindowBufferSizeEvent;MENU_EVENT_RECORD MenuEvent;FOCUS_EVENT_RECORD FocusEvent;} Event;} INPUT_RECORD;

EventType

输入事件类型的句柄和存储在Event成员中的事件记录。

该成员可以是以下值之一。

事件

事件信息。此成员的格式取决于EventType成员指定的事件类型。

02. MOUSE_EVENT_RECORD结构

描述控制台INPUT_RECORD结构中的鼠标输入事件。

类型声明:

typedef struct _MOUSE_EVENT_RECORD {COORD dwMousePosition;DWORD dwButtonState;DWORD dwControlKeyState;DWORD dwEventFlags;} MOUSE_EVENT_RECORD;

成员说明

dwMousePosition

一个COORD结构,它根据控制台屏幕缓冲区的字符单元格坐标包含光标的位置。

dwButtonState

鼠标按钮的状态。最低有效位对应于最左边的鼠标按钮。下一个最低有效位对应于最右边的鼠标按钮。下一位表示从左到右的鼠标按钮。然后,这些位从左到右对应鼠标按钮。如果按下按钮,则位为1。

为前五个鼠标按钮定义了以下常量。

dwControlKeyState

控制键的状态。该成员可以是以下一个或多个值。

dwEventFlags

鼠标事件的类型。如果此值为零,则表示正在按下或释放鼠标按钮。否则,此成员是以下值之一。

03. ReadConsoleInput函数

从控制台输入缓冲区读取数据并将其从缓冲区中删除。

函数声明:

BOOL WINAPI ReadConsoleInput(_In_ HANDLE hConsoleInput,_Out_ PINPUT_RECORD lpBuffer,_In_ DWORD nLength,_Out_ LPDWORD lpNumberOfEventsRead);功能:从控制台输入缓冲区读取数据并将其从缓冲区中删除。参数:hConsoleInput 控制台输入缓冲区的句柄。句柄必须具有GENERIC_READ访问权限。lpBuffer 指向接收输入缓冲区数据的INPUT_RECORD结构数组的指针。nLength 数组元素中lpBuffer参数 指向的数组大小。lpNumberOfEventsRead 指向接收读取的输入记录数的变量的指针。返回值:如果函数成功,则返回值为非零值。如果函数失败,则返回值为零。要获取扩展错误信息,请调用GetLastError。

官方参考网址:/en-us/windows/console/readconsoleinput

04. 示例程序

#include<stdio.h>#include<string.h>#include<stdlib.h>#include <Windows.h>#include <conio.h>int main(void){//定义句柄变量HANDLE hOut = NULL;HANDLE hIn = NULL;//定义输入事件结构体INPUT_RECORD mouseRecord;//用于存储读取记录DWORD res;//用于存储鼠标当前位置COORD pos;//获取标准输出句柄hOut = GetStdHandle(STD_OUTPUT_HANDLE);//获取标准输入句柄hIn = GetStdHandle(STD_INPUT_HANDLE);while (1){//读取输入事件ReadConsoleInput(hIn, &mouseRecord, 1, &res);//获取鼠标当前位置pos = mouseRecord.Event.MouseEvent.dwMousePosition;//如果当前事件是鼠标事件if (mouseRecord.EventType == MOUSE_EVENT){//单击鼠标左键if (mouseRecord.Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED){printf("鼠标左键单击 x: %d y: %d\n", pos.X, pos.Y);}//单击鼠标右键if (mouseRecord.Event.MouseEvent.dwButtonState == RIGHTMOST_BUTTON_PRESSED){printf("鼠标右键单击 x: %d y: %d\n", pos.X, pos.Y);}//如果是双击就退出循环if (mouseRecord.Event.MouseEvent.dwEventFlags == DOUBLE_CLICK){break;}}}//关闭句柄CloseHandle(hOut);CloseHandle(hIn);//system("pause");getchar();return 0;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。