Welcome

首页 / 软件开发 / C语言 / C语言控制台窗口图形界面编程之八 鼠标事件

C语言控制台窗口图形界面编程之八 鼠标事件2015-01-16上次讲的是键盘事件,这次我们介绍鼠标事件。下面先介绍下鼠标事件的结构体以及相关信息。

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 <stdio.h>#include <windows.h>#include <conio.h>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);//单击鼠标左键,输出字符Aif (mouserec.Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED){putchar("A");}//单击鼠标右键,输出字符Bif (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!的图:

From:cnblogs 龙梦之痕