上次讲的是键盘事件,这次我们介绍鼠标事件。

以下先介绍下鼠标事件的结构体以及相关信息。

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函数后鼠标事件无法正常发生。

C语言控制台窗体图形界面编程(八):鼠标事件的更多相关文章

  1. C语言控制台窗体图形界面编程(总结)

    本系列文章是笔者通过学习<C语言控制台窗体界面编程(修正版)>而写(关于此文档的很多其它信息请看本系列文章第一篇),旨在让大家更加清晰简洁easy地学习C语言控制台窗体界面的编程. 通过本 ...

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

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

  3. 【C语言】控制台窗口图形界面编程(八):键盘事件

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

  4. 【C语言】控制台窗口图形界面编程(一)句柄和文本属性

    目录 00. 目录 01. 句柄 02. GetStdHandle函数 03. CloseHandle函数 04. SetConsoleTextAttribute函数 05. 十进制颜色对照表 06. ...

  5. 【C语言】控制台窗口图形界面编程(六):光标设置

    目录 00. 目录 01. CONSOLE_CURSOR_INFO结构 02. GetConsoleCursorInfo函数 03. SetConsoleCursorInfo函数 04. SetCon ...

  6. 【C语言】控制台窗口图形界面编程(五):文本移动

    目录 00. 目录 01. CHAR_INFO结构 02. ScrollConsoleScreenBuffer函数 03. 程序示例 04. 官方参考程序 00. 目录 01. CHAR_INFO结构 ...

  7. 【C语言】控制台窗口图形界面编程(四):文本输出

    目录 00. 目录 01. FillConsoleOutputAttribute函数 02. FillConsoleOutputCharacter函数 03. WriteConsoleOutputCh ...

  8. 【C语言】控制台窗口图形界面编程(二)窗口信息和填充缓冲区

    目录 00. 目录 01. COORD结构体 02. SMALL_RECT结构 03. CONSOLE_SCREEN_BUFFER_INFO结构体 04. GetConsoleScreenBuffer ...

  9. Linux C 程序 GTK+图形界面编程(22)

    GTK+图形界面编程 Linux大多是在字符界面,但也可以开发图形界面 目前已经存在多种Linux下开发图形界面的程序开发包:最常用的是Qt和GTK+ Qt是一个跨平台的图形界面开发库,不仅仅支持Li ...

随机推荐

  1. .net core mvc部署到IIS导出Word 提示80070005拒绝访问

    项目中相信大家经常会遇到导出Word.Excel等需求,在实际开发环境中,一般不会出现什么问题,但当发布到IIS上后可能会遇到各种各样的问题,一般都是权限的问题.前几天把公司项目发布后,出现Word导 ...

  2. 【Demo】jQuery 轮播图简单动画效果

    功能实现: (1)设定图片称号的鼠标悬停事件: (2)在事件中利用自定义动画函数调整显示图片,并修改对应标号样式: (3)为图片显示区域设定鼠标悬停事件: (4)当鼠标停在该区域时,清除图片切换动画定 ...

  3. 1-26-1-expect无交互式-正则表达式

    大纲: 1.expect环境搭建及脚本编写 概述 expect脚本详解 expect环境搭建 expect脚本实现ssh远程连接 expect脚本实现ssh远程连接(通过shell传递参数) 2.正则 ...

  4. 设置了width和height的a元素在IE11与IE11以下浏览器中的不同渲染方式

    #welcomeMiddleBtn { display: block; width: 73px; height: 120px; margin: 0px auto; } <a id="w ...

  5. 【转】ubuntu下如何将笔记本自带的键盘关闭

    想必大家都经历过这样的情况:在使用usb接口的外接键盘的时候,很容易按到笔记本自带的键盘,从而导致输入错误.尤其是你将外接键盘放在笔记本键盘上面的时候.怎么解决这个问题呢? 搜索之后,找到了答案.注意 ...

  6. day5-logging模块

    一.概述 好的程序开发,往往会兼顾到日志输出的需求,以便给用户提供必要的日志信息便于确认程序运行状态.排错等等.这些日志一般包括程序的正常运行日志.访问日志.错误日志.数据保存日志等类型.在pytho ...

  7. weblogic应用加载不上

    这个的问题是编译的问题,在web-inf文件中的classes中少了config文件夹的配置信息 可在项目的build path 中的source中配置

  8. d3.js(v5.7)树状图

    一.新建画布 二.数据处理 三.绘制连接线 图示: 四.绘制节点.文字 图示: 五.总结 path元素:其实就是定义了绘图的坐标点,从哪开始,移动到哪,怎样移动(命令) 具体可百度(或许以后我会总结一 ...

  9. jmeter返回报文乱码问题

    返回的报文中存在乱码如下: 1.先改脚本里面的 content encoding为utf-8 然后response为utf-8 如果以上还是不可以,那就改配置文件jmeter.properties,里 ...

  10. 提问:错误提示--命名空间“System.Web”中不存在类型或命名空间名称“UI”(是缺少程序集引用吗?) 如何解决??

    转自:http://topic.csdn.net/u/20080723/21/7e1e06cb-d013-4675-ba9b-9b39d49d0a0e.html 1) 添加对System.Web.dl ...