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 <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语言控制台窗体图形界面编程(八):鼠标事件的更多相关文章
- C语言控制台窗体图形界面编程(总结)
本系列文章是笔者通过学习<C语言控制台窗体界面编程(修正版)>而写(关于此文档的很多其它信息请看本系列文章第一篇),旨在让大家更加清晰简洁easy地学习C语言控制台窗体界面的编程. 通过本 ...
- 【C语言】控制台窗口图形界面编程(七):鼠标事件
目录 00. 目录 01. INPUT_RECORD结构 02. MOUSE_EVENT_RECORD结构 03. ReadConsoleInput函数 04. 示例程序 00. 目录 01. INP ...
- 【C语言】控制台窗口图形界面编程(八):键盘事件
目录 00. 目录 01. INPUT_RECORD结构 02. KEY_EVENT_RECORD结构 03. ReadConsoleInput函数 04. 示例程序 00. 目录 01. INPUT ...
- 【C语言】控制台窗口图形界面编程(一)句柄和文本属性
目录 00. 目录 01. 句柄 02. GetStdHandle函数 03. CloseHandle函数 04. SetConsoleTextAttribute函数 05. 十进制颜色对照表 06. ...
- 【C语言】控制台窗口图形界面编程(六):光标设置
目录 00. 目录 01. CONSOLE_CURSOR_INFO结构 02. GetConsoleCursorInfo函数 03. SetConsoleCursorInfo函数 04. SetCon ...
- 【C语言】控制台窗口图形界面编程(五):文本移动
目录 00. 目录 01. CHAR_INFO结构 02. ScrollConsoleScreenBuffer函数 03. 程序示例 04. 官方参考程序 00. 目录 01. CHAR_INFO结构 ...
- 【C语言】控制台窗口图形界面编程(四):文本输出
目录 00. 目录 01. FillConsoleOutputAttribute函数 02. FillConsoleOutputCharacter函数 03. WriteConsoleOutputCh ...
- 【C语言】控制台窗口图形界面编程(二)窗口信息和填充缓冲区
目录 00. 目录 01. COORD结构体 02. SMALL_RECT结构 03. CONSOLE_SCREEN_BUFFER_INFO结构体 04. GetConsoleScreenBuffer ...
- Linux C 程序 GTK+图形界面编程(22)
GTK+图形界面编程 Linux大多是在字符界面,但也可以开发图形界面 目前已经存在多种Linux下开发图形界面的程序开发包:最常用的是Qt和GTK+ Qt是一个跨平台的图形界面开发库,不仅仅支持Li ...
随机推荐
- Chrome自动化搭建
工具安装: 1.selenium-java-2.53.0-srcs.jar 2.selenium-java-2.53.0.jar 3.下载chromedriver.exe(下载地址:http://ch ...
- IP地址分类、私有地址、子网、子网掩码
IP地址分类介绍 这里讨论IPv4,IP地址分成了A类.B类.C类.C类.E类,如下图所示: 解释: A类以0开头,网络地址有7位,主机地址有24位,举例:A类地址:0 10000000 000000 ...
- Ubuntu 14.04配置虚拟主机
虚拟主机常用于在一个单独的IP地址上提供多个域名的网站服务.如果有人想在单个VPS的单个IP地址运行多个网站,这是非常有用的.在这个教程中,让我告诉你如何设置在Ubuntu 14.04 LTS的Apa ...
- 15.并发容器之ConcurrentLinkedQueue
1.ConcurrentLinkedQueue简介 在单线程编程中我们会经常用到一些集合类,比如ArrayList,HashMap等,但是这些类都不是线程安全的类.在面试中也经常会有一些考点,比如Ar ...
- python使用tkinter做界面之颜色
python使用tkinter做界面之颜色 from tkinter import *colors = '''#FFB6C1 LightPink 浅粉红#FFC0CB Pink 粉红#DC ...
- 【51nod-1091】线段的重叠(贪心)
所有线段按起点从小到大排序,然后比较出最大的重叠部分.比如第i条线段和第j条线段进行比较找出重叠部分(j>i),当第j条线段的右端点<第i条线段的右端点,此时可以让i继续比较后面的线段:如 ...
- 前台cookie的操作
<html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> &l ...
- spring项目加载不出来静态资源
方法1: 拦截器中增加针对静态资源不进行过滤(涉及spring-mvc.xml) <!-- 添加注解驱动 --> <mvc:annotation-driven/> <!- ...
- canvas 画布 文字描边
总结一下,canvas 画布 文字描边的2种方法以及其不同的视觉效果: 效果图: 具体代码: <canvas id="canvas" width="800" ...
- vue.js 源代码学习笔记 ----- instance proxy
/* not type checking this file because flow doesn't play well with Proxy */ import config from 'core ...