C语言控制台窗口图形界面编程(八):鼠标事件
来源:互联网 发布:海康威监控无网络视频 编辑:程序博客网 时间:2024/05/30 05:42
上次讲的是键盘事件,这次我们介绍鼠标事件。下面先介绍下鼠标事件的结构体以及相关信息。
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); //单击鼠标左键,输出字符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!的图:
注意:当使用system函数后鼠标事件无法正常发生。
2 0
- C语言控制台窗口图形界面编程(八):鼠标事件
- C语言控制台窗口图形界面编程(七):键盘事件
- C语言控制台窗口图形界面编程(
- C语言控制台窗口图形界面编程
- C语言控制台窗口图形界面编程(三):文本属性
- C语言控制台窗口图形界面编程(四):文本输出
- C语言控制台窗口图形界面编程(五):文本移动
- C语言控制台窗口图形界面编程(六):光标操作
- C语言控制台窗口图形界面编程(总结)
- C语言控制台窗口图形界面编程(一):设备句柄与窗口信息
- C语言控制台窗口图形界面编程(二):窗口缓冲区的设置
- C语言图形界面编程
- C语言隐藏控制台窗口
- 图形界面程序使用控制台窗口
- C语言模拟鼠标事件
- c 语言 鼠标事件 实例
- cocoa编程,窗口响应鼠标点击事件
- C语言控制台程序窗口隐藏
- 黑马程序员 Java基础<三> 控制流程
- ARM中,总线如何连接?
- centos6搭建本地openstack软件源
- [IOS学习笔记]第一课 类与方法
- 如何集成NUI控件实现快速开发 技术解决方案
- C语言控制台窗口图形界面编程(八):鼠标事件
- org.hibernate.HibernateException: No Hibernate Session bound to thread
- 系统分析与设计——领域模型画法
- Introduction to the Analytical Writing Measure
- ASCII Chart
- JavaJDBC的简单写法包括Oracle、MySQL、SqlServer
- 局域网ip查询shell实现(bat格式执行)
- nefu 120——梅森素数
- ARM中,总线如何连接?